Форум: "Основная";
Текущий архив: 2003.06.09;
Скачать: [xml.tar.bz2];
ВнизПравая кнопка в 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;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.01 c