|
|
Регистрация | << Правила форума >> | 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 (без ассоциации файлов, открываю просто группу файлов в "открыть с помощью...", по идее в меме должен быть список путей всех открываемых файлов), как и этот проект, так и у меня с файлами, открываемыми по очереди работает великолепно, а вот если сразу открыть много - только первый файл из списка, но есть плюс))) остальные экземпляры приложения не запускаются (мютексы хороши ), файлы проекта закинул в аттач, может кто прокомментирует где не то или хотя бы у кого заработало как предполагается(((... |