-
Как правильно на KOL сделать предотвращение запуска второй копии программы. Вроде написано, то для этого нужно поместить какие-то команды в файл "<название проекта>_1.inc". Но как правильно завершить работу программы из файла "<название проекта>_1.inc"???
-
в файле <название проекта>_1.inc пишешь if <это единственный экземпляр> then begin
в файле <название проекта>_4.inc пишешь end;
как будешь определять единственность зависит от твоей фантазии
-
var Wnd: HWnd;
...
Wnd := FindWindow('obj_Form', 'Название проги');
if Wnd <> 0 then begin
if IsIconic(Wnd) then SendMessage(Wnd, WM_SYSCOMMAND, SC_RESTORE, 0);
SetForegroundWindow(Wnd);
Exit;
end;
Как вариант.
-
Посмотрел ещё раз этот вопрос. В чистом KOL будет работать: > RusSun © (01.06.15 19:07) [2]
но в мск я его немного переделал, иначе не работает.) в событии procedure TForm1.KOLFormFormCreate(Sender: PObj);
CreateMutex(Nil, True, 'Kol');
If GetLastError <> 0 Then
Begin
if IsIconic(Wnd) then SendMessage(Wnd, WM_SYSCOMMAND, SC_RESTORE, 0);
SetForegroundWindow(Wnd);
Halt;
End;
Правда возник вопрос: Мутекс потом нужно освобождать?
-
Читал, что лучше использовать Atom, а не Mutex. Атомы создаются во время работы винды и исчезают после перезагрузки, нигде не сохраняясь. Можно при закрытии приложения удалить руками.
-
> в событии procedure TForm1.KOLFormFormCreate(Sender: PObj);
фигня метод, считай запускается прога создаются все элементы интерфейса и прочий мусор, а ты только надумал проверять уникальность...
> Атомы создаются во время работы винды и исчезают после перезагрузки, > нигде не сохраняясь
прикольно, а где же сохраняются мутексы?
-
Мне нужно было чтобы не запускалось ничего сверх 1 копии.
С удовольствием посмотрю на Ваш метод. С уважением RusSun.
-
> Читал, что лучше использовать Atom, а не Mutex. Атомы создаются > во время работы винды и исчезают после перезагрузки, нигде > не сохраняясь
Надо понимать, мутексы живут и при неработающей системе :)
Мутекс - объект ядра и его область действия распространяется на сеанс или на все сеансы, атом - объект user и его область действия ограничивается конкректной Windowstation.
-
так мой метод описан в [1], странно что Вы не заметили :)
-
Хорошо. В Вашем методе как Вы определяете <это единственный экземпляр>? :)
-
o'kay достаточно такого
в файле проекта пишем все нужные переменные Var MemHnd : HWND;
в файле <название проекта>_1.inc MemHnd := CreateMutex(NIL, FALSE, 'Название мутекса в идеале гуид'); if GetLastError<>ERROR_ALREADY_EXISTS then begin
в файле <название проекта>_4.inc CloseHandle(MemHnd); end else begin //здесь все что касается того, что это не первый экземпляр end;
в итоге стартует только апплет, если он используется вообще
-
пардон, не стартует, а только создается\уничтожается
-
Спасибо)
-
if GetLastError<>ERROR_ALREADY_EXISTS then begin ругается на > ERROR_ALREADY_EXISTS не видит откуда "взято" модуль windows чего не хватает?
-
> модуль windows
да естественно, в файле проекта добавь
-
Спасибо за справку, Игорю Шевченко по данной тематике. Резюме
program Pipet;
uses
KOL,Windows,Messages,
Mainunit in 'Mainunit.pas' ;
var MemHnd: HWnd;
begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end;
end.
MemHnd := CreateMutex(NIL, FALSE, 'KtqcfybLbkz');
if GetLastError<> ERROR_ALREADY_EXISTS then begin
CloseHandle(MemHnd);
if IsIconic(MemHnd) then SendMessage(MemHnd, WM_SYSCOMMAND, SC_RESTORE, 0);
SetForegroundWindow(MemHnd); Exit; и
program Pipet;
uses
KOL,Windows, Messages,
Mainunit in 'Mainunit.pas' ;
var Wnd: HWnd;
procedure CloseHandle_Wnd_AfterAll(Sender: PObj);
begin
if Wnd<>0 then CloseHandle(Wnd)
end;
begin
Wnd := FindWindow('obj_Form', 'Название проги');
if Wnd <> 0 then begin
if IsIconic(Wnd) then SendMessage(Wnd, WM_SYSCOMMAND, SC_RESTORE, 0);
SetForegroundWindow(Wnd);
exit
end;
Applet := NewApplet('');
Applet.OnDestroy:=TonEvent(MakeMethod(nil,@CloseHandle_Wnd_AfterAll));
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;
end.
Всё же есть отличие. Когда мы запускаем 2ую и последующие разы в одном случае фокус не возвращается к первому "экземпляру программы". Всем спасибо)
-
> Всё же есть отличие. Когда мы запускаем 2ую и последующие > разыв одном случае фокус не возвращается к первому "экземпляру > программы".
так ты мой вариант скопипастил и понял неправильно :)
а твой код записаный в самом проекте после begin // PROGRAM START HERE -- Please do not remove this comment будет автоматом задвигаться в дефины при каждом изменении форм
-
исправил непроверяя, надеюсь в этот раз справишься :)))
CloseHandle(MemHnd);
end else begin
Wnd := FindWindow('obj_Form', 'Название проги');
if Wnd <> 0 then begin
if IsIconic(Wnd) then SendMessage(Wnd, WM_SYSCOMMAND,SC_RESTORE, 0);
SetForegroundWindow(Wnd);
end;
end;
-
QAZ попробовал;) Но как мне кажется дело немного не этом. ИМХО: это связанно с тем как компилятор собирает эти части в воедино. Если куски разбиты _1.inc и _4.inc, то разделены и снова соединены. В файле проекта код цельный (нет дробности) в одном "теле" и работают как целое. Вопрос закрыт. Всем спасибо))
-
для компилятора все инклюды это непрерывная часть "основного" кода, за исключением естественно ресурсов
з.ы. надеюсь ты догадался заменить 'Название проги' на реальное имя окна, которое в процессе работы естественно не должно меняться....
|