![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#1
|
||||
|
||||
|
Всем доброго, имеется следующая задача:
есть ассоциированные с приложением файлики, при двойном клике на файлике запускается программа и открывает в себе этот файлик, при открытом приложении так же все работает, т.е. кликаем на файлик - он открывается в приложении (если программка не запущена соответственно ее запускает), кликаем еще на один - он тоже открывается в запущенном приложении и так пока не закончатся файлики (при открытии уже открытого файлика просто показывает ранее открытый, приложение одноэкземплярное) , но если выбрать сразу несколько файликов (в проводнике) и через "правое" меню выбрать "открыть в программе" происходит великое колдунство - открывается несколько экземпляров программы (напомню - программа одноэкземплярная) и в каждом экземпляре программки открыт один из выбранных фалов вопрос сводится к следующему: как в ассоциированное с файлом приложение передаются пути нескольких выбранных файлов (ParamStr(1) содержит путь только к первому файлу из выбранной группы, приложение получает его, смотрит присутствие еще одного экземпляра приложения - если его нет, открывает в себе, если есть - отправляет сообщением экземпляру имя файла и успешно Application.Terminate, существующий экземпляр уже работает с полученным файлом, это если открывать файлики по-очереди, а вот если все сразу, такая схема не очень работает)..... есть у кого какие мысли? (если потребуются разъяснения - могу привести код, но правда только в понедельник ) |
|
#2
|
|||
|
|||
|
Да, в общем, проблема понятна. И почему такое происходит - тоже понятно. Дело в том, что шелл-то не знает об этом. Это ему надо как-то сказать, что нефиг при отдновлеменном открытии нескольких файлов стартовать N экземпляров. Даже, честно говоря, не знаю как эту проблему и решать. Вообще, раньше, вроде, можно было сделать программу DDE-сервером и тогда шеллу можно было сказать, что бы он открывал файлы через это дело...
|
|
#3
|
||||
|
||||
|
Цитата:
вот пример из одного моего проекта: Код:
if paramstr(1)<>'' then
ListBox1.Items.Add(paramstr(1));
if paramstr(2)<>'' then
ListBox1.Items.Add(paramstr(2));
if paramstr(3)<>'' then
ListBox1.Items.Add(paramstr(3)); |
|
#4
|
||||
|
||||
|
Цитата:
Код:
ShowMessage (ParamStr(2)+' '+ParamStr(3)); а по поводу DDE сервера.... буду смотреть как шеллу указать открывать все в одном экземпляре, если есть какие-либо теоретические выкладки в этом направлении или примерчик буду рад посмотреть и поделиться Последний раз редактировалось cotseec, 27.03.2010 в 13:19. |
|
#5
|
||||
|
||||
|
|
|
#6
|
||||
|
||||
|
Цитата:
суть вопроса - где взять информацию об открываемых файлах (лучше об их путях) при одновременном открытии группы файлов (выделяем несколько файлов и правой клавишей "открыть") или указать шеллу запускать все файлы в одном экземпляре приложения - ParamStr(1) содержит путь только одного файла...хотя есть идея, попробую, может все дело в мьютексах для выявления наличия запущенного экземпляра...получится - отпишусь |
|
#7
|
||||
|
||||
|
Цитата:
|
|
#8
|
||||
|
||||
|
а вы проверяли?
Код:
const
UniqueString = 'MyProgramMutex';
var
wnd : HWND;
aCopyData: TCopyDataStruct;
i:integer;
s:string;
begin
if not init_mutex(UniqueString) then
begin
wnd := FindWindow('TForm1', nil);
if wnd > 0 then
begin
for i:=0 to Paramcount do
begin
s:=ParamStr(i);
with aCopyData do
begin
dwData := 0;
cbData := StrLen(PChar(s)) + 1;
lpData := PChar(s)
end;
SendMessage(wnd, WM_COPYDATA, Longint(0), Longint(@aCopyData));
end;
end;
exit;
end;
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.Код:
procedure WMCopyData(var Msg: TWMCopyData); message WM_COPYDATA; Код:
procedure TForm1.WMCopyData(var Msg: TWMCopyData); var sText: array[0..255] of Char; begin StrLCopy(sText, Msg.CopyDataStruct.lpData, Msg.CopyDataStruct.cbData); memo1.Lines.Add(sText); end; |
|
#9
|
||||
|
||||
|
то ли лыжи не едут, то ли...весна пришла)))
у меня в приложении тот же принцип, для очистки совести сделал маленький проект с тем, что предлагал уважаемый pesi (без ассоциации файлов, открываю просто группу файлов в "открыть с помощью...", по идее в меме должен быть список путей всех открываемых файлов), как и этот проект, так и у меня с файлами, открываемыми по очереди работает великолепно, а вот если сразу открыть много - только первый файл из списка, но есть плюс))) остальные экземпляры приложения не запускаются (мютексы хороши ), файлы проекта закинул в аттач, может кто прокомментирует где не то или хотя бы у кого заработало как предполагается(((... |