![]() |
Добро пожаловать, гость ( Вход | Регистрация )
![]() |
-=CHE@TER=- |
![]()
Сообщение
#1
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,371 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 318 раз(а) ![]() |
Delphi programs in API.
На английском. Очень подробно всё описано, плюс есть исходные коды готовых юнитов. Например SmallUtil, в котором есть все частоиспользуемые подпрограммы, и который в размере меньше, чем SysUtils (автор так утверждает - я не проверял). |
![]() ![]() |
-=CHE@TER=- |
![]()
Сообщение
#2
|
Walter Sullivan ![]() ![]() ![]() Группа: Root Admin Сообщений: 1,371 Регистрация: 4-February 08 Пользователь №: 3 Спасибо сказали: 318 раз(а) ![]() |
Небольшая программка для перезапуска зависших приложений.
Замечание: 1) Функции GetModuleFileNameEx() и IsHungAppWindow() есть только в Windows 2000/XP и более новых. 2) GetModuleFileNameEx() - позволяет махом получить имя исполняемого файла процесса - нет нужды заниматься геммороем с CreateToolHelp32Snapshot(), Thread32First/Next(), Module32First/Next() и прочим. 3) GetModuleFileNameEx() есть в юните psapi начиная с Delphi6, но если использовать её через юнит (Uses psapi;), то в код программы добавляется куча всякого шлака (проверка на существование этой функции LoadLibrary() и т.д.), что, я считаю, лишним. 4) GetModuleFileName() есть начиная с Windows 95, но почему-то она возвращает только имя запускаемого приложения, а не того процесса, handle которого ей был передан (глючит?), поэтому и приходится использовать GetModuleFileNameEx(). CODE Program WHungApp; Uses Windows; Function IsHungAppWindow(Wnd: hWnd): BOOL; stdcall; external 'user32.dll' name 'IsHungAppWindow'; Function GetModuleFileNameEx(hProcess: THandle; hModule: HMODULE; lpFilename: PAnsiChar; nSize: DWORD): DWORD; stdcall; external 'psapi.dll' name 'GetModuleFileNameExA'; Function EnumWindowsProc(Wnd: hWnd; lparam: LPARAM): BOOL; stdcall; Var pid: DWORD; ph: THandle; S: String; PInfo: TProcessInformation; SInfo: TStartupInfo; Begin If IsHungAppWindow(Wnd) Then Begin GetWindowThreadProcessId(Wnd, @pid); ph:=OpenProcess(PROCESS_ALL_ACCESS, False, pid); SetLength(S, MAX_PATH); SetLength(S, GetModuleFileNameEx(ph, 0, @S[1], MAX_PATH)); // terminate process TerminateProcess(ph, 0); CloseHandle(ph); // restart process CreateProcess(Nil, PChar(S), Nil, Nil, False, 0, Nil, Nil, SInfo, PInfo); End; Result:=True; End; Begin EnumWindows(@EnumWindowsProc, 0); End. |
![]() ![]() |
Упрощённая версия | Сейчас: 30th April 2025 - 21:55 |