我想根据进程信息得到对应的程序文件h:Thandle; Filename:array [0..255] of char;h := openProcess(Process_All_Access, true,p.ProcessID);//p.ProcessID是进程ID GetModuleFileName(h,@Filename,255); 可得到的总是空值,不知为什么?
var s:ShortString; begin GetModuleFileName(openProcess(Process_All_Access, true,GetCurrentProcess),@s,255); showmessage(s); end;
procedure RefreshList; //刷新进程列表 var h:THandle; procEntry32:TProcessEntry32; isEnd:Bool; s:ShortString; begin list1.clear; h:=createToolhelp32snapshot(TH32CS_SNAPPROCESS,0); procEntry32.dwSize:=sizeof(TProcessEntry32); isEnd:=Process32First(h,procEntry32); while isEnd do begin GetModuleFileName(openProcess(Process_All_Access, true,procEntry32.th32ProcessID),@s,255); list1.Items.Add(s); isEnd:=Process32Next(h,procEntry32); end; CloseHandle(h); end;但不知为什么list1中总是空值?
GetModuleFileName的API宣告如下: DWORD GetModuleFileName( HMODULE hModule, // handle to module LPTSTR lpFilename, // file name of module DWORD nSize // size of buffer ); Delphi宣告如下 function GetModuleFileName(hModule: THandle; lpFileName: PChar; nSize: DWord): DWord; stdcall;hModule 參數是傳入在Process中所載入的Module(Exe, dll)的Handle, 可以由API EnumProcessModules取得所有Process所載入的Module lpFileName, 必需傳入承接Module FileName的Buffer的內存位置 nSize, 指出由lpFileName傳入的Buffer的大小, 以Byte來計算 以下範例: function GetModuleName(hModule: THandle): string; var Buf: array[0..MAX_PATH] of Char; begin if GetModuleName(hModule, Buf, MAX_PATH) = 0 then RaiseLastWin32Error; Result := string(Buf); end;
看msdn
HMODULE GetModuleHandle(
LPCTSTR lpModuleName // module name
);
直接用酒可以了。
或者用GetModuleHandle
看msdn
HMODULE GetModuleHandle(
LPCTSTR lpModuleName // module name
);
Filename:array [0..255] of char;h := openProcess(Process_All_Access, true,p.ProcessID);//p.ProcessID是进程ID
GetModuleFileName(h,@Filename,255); 可得到的总是空值,不知为什么?
begin
GetModuleFileName(openProcess(Process_All_Access, true,GetCurrentProcess),@s,255);
showmessage(s);
end;
var
h:THandle;
procEntry32:TProcessEntry32;
isEnd:Bool;
s:ShortString;
begin
list1.clear;
h:=createToolhelp32snapshot(TH32CS_SNAPPROCESS,0);
procEntry32.dwSize:=sizeof(TProcessEntry32);
isEnd:=Process32First(h,procEntry32);
while isEnd do
begin
GetModuleFileName(openProcess(Process_All_Access, true,procEntry32.th32ProcessID),@s,255);
list1.Items.Add(s);
isEnd:=Process32Next(h,procEntry32);
end;
CloseHandle(h);
end;但不知为什么list1中总是空值?
DWORD GetModuleFileName(
HMODULE hModule, // handle to module
LPTSTR lpFilename, // file name of module
DWORD nSize // size of buffer
);
Delphi宣告如下
function GetModuleFileName(hModule: THandle; lpFileName: PChar; nSize: DWord): DWord; stdcall;hModule 參數是傳入在Process中所載入的Module(Exe, dll)的Handle, 可以由API
EnumProcessModules取得所有Process所載入的Module
lpFileName, 必需傳入承接Module FileName的Buffer的內存位置
nSize, 指出由lpFileName傳入的Buffer的大小, 以Byte來計算
以下範例:
function GetModuleName(hModule: THandle): string;
var Buf: array[0..MAX_PATH] of Char;
begin
if GetModuleName(hModule, Buf, MAX_PATH) = 0 then RaiseLastWin32Error;
Result := string(Buf);
end;