Имя пользователя:
Пароль:
 

Показать сообщение отдельно

Аватара для mariolast

Ветеран


Сообщения: 717
Благодарности: 80

Профиль | Отправить PM | Цитировать


[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-битный такой же процесс. нет.
Может кто поправить?

Отправлено: 09:54, 19-07-2012 | #445