![]() |
Добро пожаловать, гость ( Вход | Регистрация )
![]() |
-=CHE@TER=- |
![]()
Сообщение
#1
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,360 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 313 раз(а) ![]() |
Delphi programs in API.
На английском. Очень подробно всё описано, плюс есть исходные коды готовых юнитов. Например SmallUtil, в котором есть все частоиспользуемые подпрограммы, и который в размере меньше, чем SysUtils (автор так утверждает - я не проверял). |
![]() ![]() |
-=CHE@TER=- |
![]()
Сообщение
#2
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,360 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 313 раз(а) ![]() |
Вопрос - кто знает, как по MUTEX'у процесса получить его путь и имя файла? Что-то типа ParamStr(0), только у другого процесса...
Суть в чём: при перезапуске моей программы, нужно чтобы она завершила свою старую копию (если есть) перед загрузкой, чтобы не убивать процесс вручную в TaskManager'е и затем снова запускать. Для убиения процесса используется такая, вот, нелёгкая процедура (потому что TerminateProcess() оставляет иконку в трее - т.е. она просто хлопает процесс, а мне нужно, чтобы он корректно завершился): CODE Function EnumThreadWndProc(Handle: Cardinal; lParam: Integer): LongBool; stdcall; Begin SendMessage(Handle, $0010{WM_CLOSE}, 0, 0); Result:=(lParam<>0); End; Function ProcessClose(FileName: String; bCloseAll: Boolean): Boolean; Var ThreadSearch, ModuleSearch: Cardinal; ThreadEntry: TThreadEntry32; ModuleEntry: TModuleEntry32; Begin result:=False; FileName:=ExtractFileName(FileName); ThreadSearch:=CreateToolHelp32Snapshot(TH32CS_SNAPTHREAD, 0); If ThreadSearch > 0 Then Begin ThreadEntry.dwSize:=SizeOf(TThreadEntry32); If Thread32First(ThreadSearch, ThreadEntry) Then Repeat ModuleSearch:=CreateToolHelp32Snapshot(TH32CS_SNAPMODULE, ThreadEntry.th32OwnerProcessID); If ModuleSearch > 0 Then Begin ModuleEntry.dwSize:=SizeOf(TModuleEntry32); If Module32First(ModuleSearch, ModuleEntry) Then Repeat If lstrcmpi(PChar(ExtractFileName(ModuleEntry.szExePath)), PChar(FileName)) = 0 Then Begin EnumThreadWindows(ThreadEntry.th32ThreadID, @EnumThreadWndProc, Integer(bCloseAll)); result:=True; End; Until (Not Module32Next(ModuleSearch, ModuleEntry)) Or (result); CloseHandle(ModuleSearch); End; Until (Not Thread32Next(ThreadSearch, ThreadEntry)) Or (result); CloseHandle(ThreadSearch); End; End; Имя файла нужно для сравнения с ModuleEntry.szExePath - вдруг, мою программу, переименовали, так что я не могу спускать в функцию ParamStr(0) от текущего процесса. Т.е. была, скажем, программа "A1.EXE", сделали копию "A2.EXE". Теперь пускают "A1.EXE", затем "A2.EXE" - т.к. MUTEX у них один, то вторая должна как-то (т.к. имя уже не совпадает) зная только MUTEX завершить предыдущую. Вообще, пытаюсь сделать такой алгоритм: 1) Производится попытка создать MUTEX с определённым именем 2) Если пришла ошибка GetLastError = ERROR_ALREADY_EXISTS, то убить этот процесс (корректно, как в коде выше, через посылание WM_CLOSE, иначе иконка в трее останется) Кто-нибудь знает как или, возможно, более простой путь решения?.. |
![]() ![]() |
Упрощённая версия | Сейчас: 25th August 2024 - 16:42 |