Как определить работает ли уже данное приложение или это первая его копия?
Для Delphi 1. Каждый экземпляр программы имеет ссылку на свою предыдущую копию - hPrevInst: hWnd. Ее можно проверить перед созданием приложения и при необходимости отреагировать соответствующим образом. Если запущена только одна копия, то эта ссылка равна нулю. Пример:
procedure TForm1.FormCreate(Sender: TObject); begin {Проверяем есть ли указатель на предыдущую копию приложения} IF hPrevInst <> 0 THENBEGIN {Если есть, то выдаем сообщение и выходим} MessageDlg('Программа уже запущена!', mtError, [mbOk], 0); Halt; END; {Иначе - ничего не делаем (не мешаем созданию формы)} end;
P.S. Для выхода необходимо использовать Halt, а не Close, как хотелось бы, так как форма еще не создана и закрывать нечего. Есть и другой способ - по списку загруженных приложений
procedure TForm1.FormCreate(Sender: TObject); VAR Wnd : hWnd; buff : ARRAY[0.. 127] OF Char; Begin Wnd := GetWindow(Handle, gw_HWndFirst); WHILE Wnd <> 0 DOBEGIN IF (Wnd <> Application.Handle) AND (GetWindow(Wnd, gw_Owner) = 0) THENBEGIN GetWindowText (Wnd, buff, sizeof (buff )); IF StrPas (buff) = Application.Title THEN BEGIN MessageDlg('Приложение уже загружено', mtWarning, [mbOk], 0); Halt; END; END; Wnd := GetWindow (Wnd, gw_hWndNext); END; End;
Еще один интересный способ для Win32. Дело в том, что можно в памяти создавать временные файлы. При перезагрузке они теряются, а так существуют. Кстати, этот метод можно использовать и для обмена информацией между вашими приложениями.
Пример:
program Project1; uses Windows, // Обязательно Forms, Unit1 in 'Unit1.pas' {Form1};
{$R *.RES} Const !
MemFileSize = 1024; MemFileName = 'one_inst_demo_memfile'; Var MemHnd : HWND; begin { Попытаемся создать файл в памяти } MemHnd := CreateFileMapping(HWND($FFFFFFFF), nil, PAGE_READWRITE, 0, MemFileSize, MemFileName); { Если файл не существовал запускаем приложение } if GetLastError<>ERROR_ALREADY_EXISTS then begin Application.Initialize; Application.CreateForm(TForm1, Form1); Application.Run; end; CloseHandle(MemHnd); end.
Часто при работе у пользователя может быть открыто 5-20 окон и сообщение о том, что программа уже запущено приводит к тому, что он вынужден полчаса искать ранее запущенную копию. Выход из положения - найдя копию программы активировать ее, для чего в последнем примере перед HALT необходимо добавить строку : SetForegroundWindow(Wnd); Например так:
program Project0; uses Windows, // !!! Forms, Unit0 in 'Unit0.pas' {Form1};
var Handle1 : LongInt; Handle2 : LongInt;
{$R *.RES}
begin Application.Initialize; Handle1 := FindWindow('TForm1',nil); if handle1 = 0 then begin Application.CreateForm(TForm1, Form1); Application.Run; end else begin Handle2 := GetWindow(Handle1,GW_OWNER); //Чтоб заметили :) ShowWindow(Handle2,SW_HIDE); ShowWindow(Handle2,SW_RESTORE); SetForegroundWindow(Handle1); // Активизируем end; end.
Как и в чем лучше делать хелп типа *.chm?
Прошу поделиться опытом в создании хелпов в формате "Compiled HTML Help file" (*.chm). Какие нужны инструменты? Где их ...
MPKEY™ Система защиты информации и программного обеспечения. Руководство разработчика.
Lel:Это руководство было любезно предоставленно компанией Мультисофт , и выложенно мной в качестве дополнения к моей обзорной статье о защите с применением электронных ключей. Мультисофт:Система защиты MPKey представляет собой систему защиты информации и программных продуктов от несанкционированного использования. Основным ее компонентом является небольшой аппаратный ключ, подключаемый к параллельному порту IBM PC или полностью совместимого компьютера. После установки на компьютер ключ MPKey становится неотъемлемой частью вашего программного пакета. Никаких дополнительных действий конечному пользователю предпринимать не требуется.
Хокку дня
И осенью хочется жить Этой бабочке: пьет торопливо С хризантемы росу.
Афоризмы
Как правило, самым невежественным оказывается тот, кто считает, что знает все....
Фраза дня
... И на обломках InterNet"a напишут наши имена...
И на закуску коротенький анекдот
За прошедшие сутки в городе Н зафиксировано: 1 пожар, одно ДТП, одно ограбление, одно изнасилование. Пострадавший находится сейчас в городской травматологической больнице.
На этом позвольте откланяться и пожелать вам удачного дня.
Искренне ваш, Алексей (delphi@mastak.com)