Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > ОС и железо
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 26.03.2010, 22:34
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
Вопрос Открываем несколько файлов

Всем доброго, имеется следующая задача:
есть ассоциированные с приложением файлики, при двойном клике на файлике запускается программа и открывает в себе этот файлик, при открытом приложении так же все работает, т.е. кликаем на файлик - он открывается в приложении (если программка не запущена соответственно ее запускает), кликаем еще на один - он тоже открывается в запущенном приложении и так пока не закончатся файлики (при открытии уже открытого файлика просто показывает ранее открытый, приложение одноэкземплярное) , но если выбрать сразу несколько файликов (в проводнике) и через "правое" меню выбрать "открыть в программе" происходит великое колдунство - открывается несколько экземпляров программы (напомню - программа одноэкземплярная) и в каждом экземпляре программки открыт один из выбранных фалов
вопрос сводится к следующему: как в ассоциированное с файлом приложение передаются пути нескольких выбранных файлов (ParamStr(1) содержит путь только к первому файлу из выбранной группы, приложение получает его, смотрит присутствие еще одного экземпляра приложения - если его нет, открывает в себе, если есть - отправляет сообщением экземпляру имя файла и успешно Application.Terminate, существующий экземпляр уже работает с полученным файлом, это если открывать файлики по-очереди, а вот если все сразу, такая схема не очень работает).....
есть у кого какие мысли? (если потребуются разъяснения - могу привести код, но правда только в понедельник )
Ответить с цитированием
  #2  
Старый 27.03.2010, 02:09
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,057
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

Да, в общем, проблема понятна. И почему такое происходит - тоже понятно. Дело в том, что шелл-то не знает об этом. Это ему надо как-то сказать, что нефиг при отдновлеменном открытии нескольких файлов стартовать N экземпляров. Даже, честно говоря, не знаю как эту проблему и решать. Вообще, раньше, вроде, можно было сделать программу DDE-сервером и тогда шеллу можно было сказать, что бы он открывал файлы через это дело...
Ответить с цитированием
  #3  
Старый 27.03.2010, 05:11
Аватар для ryderx34
ryderx34 ryderx34 вне форума
Активный
 
Регистрация: 22.01.2010
Сообщения: 211
Версия Delphi: 7, 2010
Репутация: 1349
По умолчанию

Цитата:
как в ассоциированное с файлом приложение передаются пути нескольких выбранных файлов
в следующих параметрах, т. е. второй файл в ParamStr(2), третий в ParamStr(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  
Старый 27.03.2010, 13:13
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

Цитата:
Сообщение от ryderx34
в следующих параметрах, т. е. второй файл в ParamStr(2), третий в ParamStr(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));
про ParamStr(2), ParamStr(3) смотрел, насколько я понял и насколько смог прочитать в RTFM'ах воторой и третий ParamStr служат для передачи приложению параметров открываемого файлика (значение параметра, например w в ping 196.128.1.1 –w 60000), да и банальное
Код:
ShowMessage (ParamStr(2)+'  '+ParamStr(3));
в приложении при открытии нескольких файлов выводит пустой месседж)
а по поводу DDE сервера....
буду смотреть как шеллу указать открывать все в одном экземпляре, если есть какие-либо теоретические выкладки в этом направлении или примерчик буду рад посмотреть и поделиться

Последний раз редактировалось cotseec, 27.03.2010 в 13:19.
Ответить с цитированием
  #5  
Старый 27.03.2010, 15:35
Аватар для pesi
pesi pesi вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 275
Репутация: 43
По умолчанию

сначала это,
потом это
Ответить с цитированием
  #6  
Старый 27.03.2010, 21:51
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

Цитата:
Сообщение от pesi
за мютексы спасибо, одноэкземплярное приложение у меня построено по принципу поиска окна того же имени класса, а обмен сообщениями между приложениями, имхо как-то не в тему (хоть и предлагают DDE - вопрос "немного" не в этом, с обменом сообщениями у меня полный порядок, приложение обменивается "само с собой" как миленькое))))
суть вопроса - где взять информацию об открываемых файлах (лучше об их путях) при одновременном открытии группы файлов (выделяем несколько файлов и правой клавишей "открыть") или указать шеллу запускать все файлы в одном экземпляре приложения - ParamStr(1) содержит путь только одного файла...хотя есть идея, попробую, может все дело в мьютексах для выявления наличия запущенного экземпляра...получится - отпишусь
Ответить с цитированием
  #7  
Старый 27.03.2010, 23:38
Аватар для ryderx34
ryderx34 ryderx34 вне форума
Активный
 
Регистрация: 22.01.2010
Сообщения: 211
Версия Delphi: 7, 2010
Репутация: 1349
По умолчанию

Цитата:
Сообщение от cotseec
да и банальное
Код:
ShowMessage (ParamStr(2)+'  '+ParamStr(3));
в приложении при открытии нескольких файлов выводит пустой месседж
только что проверил, нормально message выводится, с путями файлов...
Ответить с цитированием
  #8  
Старый 28.03.2010, 20:06
Аватар для pesi
pesi pesi вне форума
Активный
 
Регистрация: 12.09.2008
Сообщения: 275
Репутация: 43
По умолчанию

а вы проверяли?

Код:
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  
Старый 29.03.2010, 11:56
Аватар для cotseec
cotseec cotseec вне форума
Активный
 
Регистрация: 16.07.2008
Сообщения: 353
Версия Delphi: D7,TDE06,RAD09
Репутация: 1443
По умолчанию

то ли лыжи не едут, то ли...весна пришла)))
у меня в приложении тот же принцип, для очистки совести сделал маленький проект с тем, что предлагал уважаемый pesi (без ассоциации файлов, открываю просто группу файлов в "открыть с помощью...", по идее в меме должен быть список путей всех открываемых файлов), как и этот проект, так и у меня с файлами, открываемыми по очереди работает великолепно, а вот если сразу открыть много - только первый файл из списка, но есть плюс))) остальные экземпляры приложения не запускаются (мютексы хороши ), файлы проекта закинул в аттач, может кто прокомментирует где не то или хотя бы у кого заработало как предполагается(((...
Вложения
Тип файла: zip Projects.zip (5.4 Кбайт, 15 просмотров)
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 05:19.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter