Sergey_Demchuk
Silver Member | Редактировать | Профиль | Сообщение | ICQ | Цитировать | Сообщить модератору Может кто подскажет, как определить откуда запущено приложение, если есть только название процесса (в диспетчере устройств например calc.exe) Ипсользую нижеприведенный код для этого, но проблема в том, что он работает только для 32-битных приложений, а на 64битные приложения не берет. У кого какие идеи? Код: #ifdef UNICODE #define A "W" #else #define A "A" #endif const TH32CS_SNAPPROCESS = $2; INVALID_HANDLE_VALUE = -1; PROCESS_QUERY_INFORMATION = $400; PROCESS_VM_READ = $10; MAX_PATH = 260; type TPROCESSENTRY32 = record dwSize, cntUsage, th32ProcessID: DWORD; th32DefaultHeapID: Longint; th32ModuleID, cntThreads, th32ParentProcessID: DWORD; pcPriClassBase: Longint; dwFlags: DWORD; szExeFile: array [0..259] of char; end; function CreateToolhelp32Snapshot(dwFlags, th32ProcessID: DWORD): THandle; external 'CreateToolhelp32Snapshot@kernel32.dll stdcall'; #ifdef UNICODE function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First{#A}@kernel32.dll stdcall'; function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next{#A}@kernel32.dll stdcall'; #else function Process32First(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32First@kernel32.dll stdcall'; function Process32Next(hSnapshot: THandle; var lppe: TPROCESSENTRY32): Boolean; external 'Process32Next@kernel32.dll stdcall'; #endif function CloseHandle(hObject: THandle): BOOL; external 'CloseHandle@kernel32.dll stdcall'; function GetModuleFileNameEx(hProcess: THandle; hModule: Longint; var lpFilename: Char; nSize: DWORD): DWORD; external 'GetModuleFileNameEx{#A}@psapi.dll stdcall'; function OpenProcess(dwDesiredAccess: DWORD; bInheritHandle: BOOL; dwProcessId: DWORD): THandle; external 'OpenProcess@kernel32.dll stdcall'; function GetProcessWorkingDirectory(ProcessName: String): TArrayOfString; var hProcessSnap, hProc: THandle; pe32: TPROCESSENTRY32; szExeFile: array [0..MAX_PATH-1] of Char; szProcName: String; i, iLen: Integer; begin SetArrayLength(Result, 0); hProcessSnap := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); if hProcessSnap = INVALID_HANDLE_VALUE then Exit; pe32.dwSize := sizeof(pe32); if not Process32First(hProcessSnap, pe32) then Exit; while Process32Next(hProcessSnap, pe32) do begin szProcName := ''; while not (pe32.szExeFile[Length(szProcName)] = #0) do szProcName := szProcName + pe32.szExeFile[Length(szProcName)]; if CompareText(szProcName, ProcessName) = 0 then begin hProc := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, False, pe32.th32ProcessID); iLen := GetModuleFileNameEx(hProc, 0, szExeFile[0], MAX_PATH); if iLen > 0 then begin SetArrayLength(Result, GetArrayLength(Result)+1); for i := 0 to iLen-1 do Result[GetArrayLength(Result)-1] := Result[GetArrayLength(Result)-1] + szExeFile[i]; Result[GetArrayLength(Result)-1] := RemoveBackSlash(ExtractFilePath(Result[GetArrayLength(Result)-1])); end; CloseHandle(hProc); end; end; CloseHandle(hProcessSnap); end; procedure InitializeWizard(); var szArray: TArrayOfString; i: Integer; begin //хочу знать откуда калькуляторы запущены szArray := GetProcessWorkingDirectory('calc.exe'); if GetArrayLength(szArray) > 0 then for i := 0 to GetArrayLength(szArray)-1 do MsgBox(szArray[i], mbInformation, MB_OK); end; |
|