Reputation: 16492
I need determine when a process id (PID) is 32 or 64 bit application using delphi, how i can do that? I really check the IsWow64Process
function but works with a process handle not a PID.
Upvotes: 11
Views: 3748
Reputation: 2810
if you are checking for the app itself:
{$IFDEF WIN32}
ShowMessage('32-bit App itself');
{$ENDIF}
{$IFDEF WIN64}
ShowMessage('64-bit App itself');
{$ENDIF}
Upvotes: -1
Reputation: 136441
You can use the OpenProcess
function to get a handle to the pid and then call the IsWow64Process
function.
Remember that you must load the IsWow64Process
function using the GetProcAddress
function because some versions of Windows does not include this function.
Check this sample code
{$APPTYPE CONSOLE}
uses
Windows,
SysUtils;
type
TIsWow64Process = function(Handle:THandle; var IsWow64 : BOOL) : BOOL; stdcall;
var
IsWow64Process : TIsWow64Process;
procedure Init_IsWow64Process;
var
hKernel32 : Integer;
begin
hKernel32 := LoadLibrary(kernel32);
if (hKernel32 = 0) then RaiseLastOSError;
try
IsWow64Process := GetProcAddress(hkernel32, 'IsWow64Process');
finally
FreeLibrary(hKernel32);
end;
end;
function PidIs64BitsProcess(dwProcessId: DWORD): Boolean;
var
IsWow64 : BOOL;
PidHandle : THandle;
begin
Result := False;
if Assigned(IsWow64Process) then
begin
//check if the current app is running under WOW
if IsWow64Process(GetCurrentProcess(), IsWow64) then
Result := IsWow64
else
RaiseLastOSError;
//the current delphi App is not running under wow64, so the current Window OS is 32 bit
//and obviously all the apps are 32 bits.
if not Result then Exit;
PidHandle := OpenProcess(PROCESS_QUERY_INFORMATION,False,dwProcessId);
if PidHandle > 0 then
try
if (IsWow64Process(PidHandle, IsWow64)) then
Result := not IsWow64
else
RaiseLastOSError;
finally
CloseHandle(PidHandle);
end;
end;
end;
begin
try
Init_IsWow64Process;
//here pass the pid which you want to check
Writeln(BoolToStr(PidIs64BitsProcess(1940),True));
except
on E:Exception do
Writeln(E.Classname, ': ', E.Message);
end;
Readln;
end.
Upvotes: 16