Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.009 c
14-26663
VMSIVETS
2003-05-23 12:31
2003.06.09
Срочно нужен компонент для работы с БД


1-26557
McSimm2
2003-05-28 10:36
2003.06.09
Tlist.Sort


3-26337
kingdom2000
2003-05-16 19:07
2003.06.09
TDBGridEh и GetEditText(X, Y)


1-26538
kamkad3e
2003-05-26 22:43
2003.06.09
параметры к WordApplication1.Documents.Open


8-26621
Sergeys
2003-02-19 20:03
2003.06.09
сглаживание картинки





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский