Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.04.09;
Скачать: CL | DM;

Вниз

Запуск второй копии программы   Найти похожие ветки 

 
DiMonstr   (2006-03-08 02:01) [0]

Есть прога, которая использует MDI-формы.
Так, вот. При запуске второй копии проги фокус становится на предыдущую копию, а вторая копия не запускается. Это я сделал. Но, вот если прога запускается с параметрами (в часности путь к файлу в параметре), то надо от второй копии передать в первую все параметры. Как это сделать?

Заранее спасибо за ответы


 
Германн ©   (2006-03-08 02:14) [1]


> DiMonstr   (08.03.06 02:01)  
>
> Есть прога, которая использует MDI-формы.
Что за "прога"?
Твоя или чужая?

> Так, вот. При запуске второй копии проги фокус становится
> на предыдущую копию, а вторая копия не запускается. Это
> я сделал.
Как и что сделал?

> Но, вот если прога запускается с параметрами (в
> часности путь к файлу в параметре), то надо от второй копии
> передать в первую все параметры. Как это сделать?


Ответь сначала на вопросы. Поскольку общего решения не существует.


 
DiMonstr   (2006-03-08 02:25) [2]

Значит так, отвечаю:

1.Прога полностью написанная мною от и до.

2.Сделал это я с помощью мьютексов следующим образом (PROJECT.DPR) :

{$R *.res}
var
Wnd : hWnd;
clss,buff,mainS: array [0..255] of Char;
hMutex : integer;
hnd: LongInt;
begin
 //  Предотвращение повторного запуска
 StrCopy(mainS,"TITLE");
 SetWindowText(Application.Handle,mainS);
 hMutex:=CreateMutex(nil,TRUE,"BelAZNavigator");       // Создаем семафор
 if GetLastError <> 0 then                             // Ошибка создания - значит уже создан
 begin
  GetClassName(Application.Handle, clss,sizeof(clss)); // Получаем имя класса
  Wnd := GetWindow(Application.Handle, gw_HWndFirst);  // Получаем ссылу на окно
  while Wnd <> 0 do
  begin
   if (Wnd<>Application.Handle)and(GetWindow(Wnd, gw_Owner)=0) then // Поиск по всем окнам
   begin
    GetClassName(Wnd,buff, sizeof(buff));    // Получаем класс окна
    if StrComp(buff,clss)=0 then             // Сравниваем с нашим классом
    begin
     GetWindowText(Wnd, buff, sizeof(buff)); // Полечаем текст найденного окна
     if StrComp(buff,mainS)=0 then           // Сравниваем с нашим окно
     begin
      SendMessage(Wnd,WM_SETFOCUS,Wnd,0);
      ShowWindow(Wnd,SW_SHOWNORMAL);
     end;
    end;
   end;
   Wnd := GetWindow(Wnd, gw_hWndNext); // Берем следующее
  end;
   exit; // выход из программы не создавая формы и не запуская приложение
 end;

 try
   Application.Initialize;
   Application.Title := "TITLE";
   Application.CreateForm(TMainForm, MainForm);
   Application.Run;
   ReleaseMutex(hMutex)
end.


3.Передача параметров в прогу делается обычным способом:

procedure TMainForm.FormShow(Sender: TObject);
begin
 If ParamCount > 0 then GeneralOpenFile(False, ParamStr(1));
end;


Вот так всё и происходит!


 
Германн ©   (2006-03-08 02:37) [3]

2 DiMonstr   (08.03.06 02:25) [2]
Тогда нужно ввести и ещё один вариант передачи параметров программе, кроме командной строки. Ведь окно программы ты находишь, если оно есть. Так и передай ему сообщение с параметрами, который файл нужно открыть.


 
DiMonstr   (2006-03-08 12:01) [4]

И как интересно это будет выглядеть?


 
Германн ©   (2006-03-09 01:26) [5]


> DiMonstr   (08.03.06 12:01) [4]
>
> И как интересно это будет выглядеть?

Ну, например SendMessage WM_CopyData, в котором передавать командную строку.



Страницы: 1 вся ветка

Текущий архив: 2006.04.09;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.027 c
2-1143209891
Толян
2006-03-24 17:18
2006.04.09
определение каталога в Паскале


4-1137700717
AlexOld
2006-01-19 22:58
2006.04.09
Программирование USB порта


3-1139836939
maximmsm
2006-02-13 16:22
2006.04.09
При попытке подключиться к удалённой базе EIBInterBaseError


5-1129107610
denissoft
2005-10-12 13:00
2006.04.09
Помогите написать компонент с 2 полями TDataField


2-1143463840
sofi
2006-03-27 16:50
2006.04.09
Разрешение экрана