Текущий архив: 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.46 MB
Время: 0.011 c