Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2003.06.09;
Скачать: CL | DM;

Вниз

Правая кнопка в exlorer е   Найти похожие ветки 

 
-=GaLaN=-   (2003-05-27 11:44) [0]

Может, кто-нибудь знает, каким образом из проводника повлиять на мою всегда запущенную программу, например, передать ей имя выбранного файла.
Пример: в контекстном меню файла выбираю send filename to my program, а моя запущенная программа это перехватывает. Каким образом такое реализуется?


 
clickmaker ©   (2003-05-27 11:59) [1]

см. свойства ярлыков в папке X:\Documents and Settings\<User>\SendTo
В принципе, достаточно создать ярлык для exe, положить в эту папку, и при выборе "Послать..." будет запущено указанное приложение с выбранным файлом в качестве командной строки


 
-=GaLaN=-   (2003-05-27 12:03) [2]

Вот именно - запущено. А мне надо этот параметр передать _уже_ запущенному приложению, которое работает в фоне. Тут уже как-то с памятью работать надо, share memory или что-то около того. Но как?


 
Palladin ©   (2003-05-27 12:05) [3]


> -=GaLaN=- (27.05.03 12:03)

при запуске нового экземпляра ищи старый и посылай ему сообщение


 
-=GaLaN=-   (2003-05-27 12:07) [4]

2Paladin:
Вижу, Вы знающий человек. Можно хотя бы немного подробнее? Как искать экземпляр, а главное - как послать ему сообщение?


 
___Nikolay ©   (2003-05-27 12:08) [5]

Регистрируешь нужный тип файла со своей программой:


uses
Registry;

public
{ Public declarations }
procedure RegisterFileType(ext: string; FileName: string);

procedure TForm1.RegisterFileType(ext: string; FileName: string);
var
reg: TRegistry;
begin
reg:=TRegistry.Create;
with reg do
begin
RootKey:=HKEY_CLASSES_ROOT;
OpenKey("."+ext,True);
WriteString("",ext+"file");
CloseKey;
CreateKey(ext+"file");
OpenKey(ext+"file\DefaultIcon",True);
WriteString("",FileName+",0");
CloseKey;
OpenKey(ext+"file\shell\open\command",True);
WriteString("",FileName+" "%1"");
CloseKey;
Free;
end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
RegisterFileType("xyz", Application.ExeName);
end;


В итоге при открытии этого файла, будет запускаться твоя программа, а во втором по счёту параметре будет имя открываемого файла!


 
-=GaLaN=-   (2003-05-27 12:14) [6]

2Nikolay:
Это понятно. Я так сделал. Но мне надо несколько другое. В этом случае запускается новая копия программы, а мне сообщение в старую надо передать.


 
Palladin ©   (2003-05-27 12:24) [7]


> ___Nikolay © (27.05.03 12:08)

я поражен Вашей мудростью и внимательностью при изучании текста ветки...


> -=GaLaN=- (27.05.03 12:07)

интересные весчи есть здесь
http://www.delphimaster.ru/cgi-bin/faq.pl?look=1&id=988619824&n=15
особенно интересно использование мьютексов...


 
-=GaLaN=-   (2003-05-27 13:15) [8]

Да, создавать FileMapping и открывать его для чтения или записи у меня получается. Но извлечь информацию не могу - ничего не нашел в хелпе.
А с атомами у меня вообще ничего не получилось.


 
Palladin ©   (2003-05-27 13:23) [9]

там же рабочий пример


 
-=GaLaN=-   (2003-05-27 13:28) [10]

В примере создается файл в памяти, но не сказано, как есть читать.


 
DmS   (2003-05-27 13:34) [11]

пускай запускается некоторая программка с параметром от Експлорера, которая передаст этот параметр (есть много способов) ТВОЕЙ программе.


 
-=GaLaN=-   (2003-05-27 13:37) [12]

2dms - запускаться будет моя же программа, она должна кинуть свой параметр первой копии и закрыться. Но вот сама реализация для меня темный лес.


 
Palladin ©   (2003-05-27 13:39) [13]

Если ты про третий пример то файл там создается для контроля запущеных экземпляров приложений, из него ничего ненадо читать, я рекомендую обратить внимание на последний пример с мьютексами, он очень хорош + там сразуже пример посылки сообщения перворожденому экземпляру...


 
-=GaLaN=-   (2003-05-27 13:48) [14]

WM_OPEN_FILE - откуда? Ругается на нем.


 
-=GaLaN=-   (2003-05-27 13:50) [15]

О, Боже, так ничего и не понял в этих мутексах. :(


 
Palladin ©   (2003-05-27 13:51) [16]

напиши
const
WM_OPEN_FILE=WM_USER+1;


 
-=GaLaN=-   (2003-05-27 13:53) [17]

А он и WM_USER не находит.


 
Palladin ©   (2003-05-27 13:54) [18]

uses Windows


 
-=GaLaN=-   (2003-05-27 13:55) [19]

Все есть:
uses
Forms,
Windows,
Dialogs,
SysUtils;


 
Palladin ©   (2003-05-27 13:55) [20]

упс, извининяюсь
uses Messages


 
-=GaLaN=-   (2003-05-27 14:04) [21]

Нет. Так ничего и не получилось. В смысле, пример запускается и работает, но передачу сообщения я так и не освоил.
Palladin, добрая душа, может быть дашь код?


 
Palladin ©   (2003-05-27 14:21) [22]

ну подумай, сообщение ты научился посылать, теперь тебе его ловить надо наверно?

ловишь его в своей главной форме

TForm1=class
....

procedure ehOpenFile(var msg:TMessage); message WM_OPEN_FILE;
end;

procedure TForm1.ehOpenFile;
var
strFileName:string;
strLen:integer;
begin
setlength(strFileName,255);
GetAtomName(ATOM(msg.WParam),@strFileName[1],strLen);
GlobalDeleteAtom(ATOM(msg.WParam));
// имя файла для открытия ты получил, вперед, открывай и делай с ним что хочешь...
end;


писал здесь, не тестировал... может кстати и не прав местами...


 
-=GaLaN=-   (2003-05-27 14:29) [23]

На декларацию процедуры ругается:
Undeclared identifier: "WM_OPEN_FILE"
Illegal message method index


 
Intell ©   (2003-05-27 14:39) [24]

Palladin, дельные советы даёшь. Rocker тоже немного в этом понимает, по крайней мере мне помог. Может он чего подскажет.


 
jack128 ©   (2003-05-27 14:53) [25]

-=GaLaN=- (27.05.03 14:29)
А ты текст ошибок переводишь??? Ясно же написано - "Undeclared identifier: "WM_OPEN_FILE""


 
Palladin ©   (2003-05-27 14:59) [26]


> -=GaLaN=- (27.05.03 14:29)

тебе нужно

const
WM_OPEN_FILE=WM_USER+1;

перенести в юнит с формой...


 
-=GaLaN=-   (2003-05-27 15:18) [27]

2jack128: спасибо, я это и так понял.
2Palladin: дело в том, что это не помогает. Ошибки остаются, а к добавленным строчкам появляется новая:
Identifier redeclared: "WM_OPEN_FILE"


 
Palladin ©   (2003-05-27 15:23) [28]

ты думаешь я зря слово "перенеси" выделил жирным шрифтом?
:)


 
-=GaLaN=-   (2003-05-27 15:26) [29]

А куда именно перенести? Как обычно, вне type TfrmMain =class(TForm) - пишет тоже самое. А в type - куда?


 
-=GaLaN=-   (2003-05-27 15:29) [30]

Мда, писать надо было перед type. Что ж - скомпилилось ;)
Однако, message не ловится и функция эта не выполняется.


 
-=GaLaN=-   (2003-05-27 15:31) [31]

Между прочим езе warning остался, на строке
if Wnd=GetWindowLong(Wnd, GWL_USERDATA) then begin

Comparing signed and unsigned types - widened both operands


 
Palladin ©   (2003-05-27 15:32) [32]

ну не знаю, у себя я эту фенечку не воспроизводил, так что ничего сказать не могу... а все что тут выкладывал, все это теоретически, кто знает сколько у тебя там еще нюансов...


 
-=GaLaN=-   (2003-05-27 15:38) [33]

Жаль. Главный нюанс - не ловится message WM_OPEN_FILE; т.е. не срабатывается функция.


 
-=GaLaN=- ©   (2003-05-29 12:23) [34]

До сих пор так и не разобрался. Все таки - кто-нибудь поможет мне рабочим кодом чтения и записи в файл в памяти?



Страницы: 1 вся ветка

Текущий архив: 2003.06.09;
Скачать: CL | DM;

Наверх




Память: 0.54 MB
Время: 0.022 c
1-26599
sndanil
2003-05-27 16:14
2003.06.09
Drag&Drop


1-26525
AlexBut
2003-05-27 07:53
2003.06.09
Enter вместо Tab


14-26718
_san_
2003-05-22 09:29
2003.06.09
Как написать резидента


14-26740
asafr
2003-05-22 17:20
2003.06.09
Сегодняшняя питерская байка


14-26773
Wonder
2003-05-23 12:40
2003.06.09
Может перейдем на другой язык? :)