[q=El Sanchez]определение рабочей папки процесса:
« скрыть
Код:
Код:

#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;
С 64-битными процессами не катит. Как пример, калькулятор или ArchiCAD.exe на Windows7-64
ArchiCAD.exe 32-битный видится, 64-битный такой же процесс. нет.
Может кто поправить?