关于EnumProcessModules句柄问题

m0_37551303 2017-03-22 11:04:51

function Process(AFileName: string): string;
var
H: THandle;
P, cbNeeded: DWORD;
fileName: string;
iLen: integer;
hMod: HMODULE;
begin
H := FindWindow(nil, pchar(AFileName));
if H <> 0 then
begin
GetWindowThreadProcessId(H, @P);
if P <> 0 then
begin
H := OpenProcess(PROCESS_ALL_ACCESS, false, p);
if H > 0 then
begin
if EnumProcessModules(H, @hMod, sizeof(hMod), cbNeeded) then//就是这里,自己测试的EXE可以获得句柄,在另一个EXE上无法获得。
begin
SetLength(fileName, MAX_PATH);
iLen := GetModuleFileNameEx(h, hMod, PCHAR(fileName), MAX_PATH);
if iLen <> 0 then
begin
SetLength(fileName, StrLen(PCHAR(fileName)));
Result := fileName;
end;
end;
CloseHandle(h);
end;
end;
end;


小弟我写了这样一个函数,根据窗口名获得该程序的路径。自己测试的可以。在其他程序上EnumProcessModules无法获得句柄是怎么回事?请大神帮帮
...全文
709 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
m0_37551303 2017-03-26
  • 打赏
  • 举报
回复
问题还是没有解决,结帖吧。
m0_37551303 2017-03-23
  • 打赏
  • 举报
回复
引用 7 楼 lyhoo163 的回复:
function TProcessManage.CheckProcess(ProcessName: string;out ProcessID:DWORD): Boolean;
var
  aps:array[1..1024] of DWORD;
  hProcess, cb:cardinal;
  procCnt, hModule:DWORD;
  i:integer;
  ret:LongBool;
  moduleFileName:array[1..100] of ansichar;
begin
  Result := False;
  EnumProcesses( @aps, sizeof( aps ), cb );
  procCnt := cb div sizeof( DWORD );
  for i:=1 to procCnt do
  begin
    hProcess := OpenProcess( PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, aps[i] );
    if hProcess = 0 then continue;
      ret := EnumProcessModules( hProcess, @hModule, sizeof(hModule), cb );
    if not ret then continue;
      GetModuleBaseName( hProcess, hModule, @moduleFileName, sizeof( moduleFileName ) );
    if lstrcmpi( @moduleFileName, PAnsiChar(ProcessName)) = 0 then
    begin
      //MessageBox( 0, '已经运行', 'xxx', MB_OK );
      ProcessID := aps[i];
      Result := True;
    end;
  end;
end; 
请参考。。。。
ret := EnumProcessModules( hProcess, @hModule, sizeof(hModule), cb );依旧无用啊
m0_37551303 2017-03-22
  • 打赏
  • 举报
回复
引用 6 楼 DelphiGuy 的回复:
CreateToolhelp32Snapshot返回一个进程快照handle 对这个handle,Process32First、Process32Next循环取ProcessID 对ProcessID用OpenProcess 然后QueryFullProcessImageName // 如果要从32位程序找出64位进程的映像名(包括路径)必须用这个 最后CloseHandle 网上应该能找到例子,你搜一下吧
我的函数就是要通过窗口名获得进程路径。网上的例子都要调用EnumProcessModules我没头绪啊。
lyhoo163 2017-03-22
  • 打赏
  • 举报
回复
function TProcessManage.CheckProcess(ProcessName: string;out ProcessID:DWORD): Boolean;
var
  aps:array[1..1024] of DWORD;
  hProcess, cb:cardinal;
  procCnt, hModule:DWORD;
  i:integer;
  ret:LongBool;
  moduleFileName:array[1..100] of ansichar;
begin
  Result := False;
  EnumProcesses( @aps, sizeof( aps ), cb );
  procCnt := cb div sizeof( DWORD );
  for i:=1 to procCnt do
  begin
    hProcess := OpenProcess( PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, false, aps[i] );
    if hProcess = 0 then continue;
      ret := EnumProcessModules( hProcess, @hModule, sizeof(hModule), cb );
    if not ret then continue;
      GetModuleBaseName( hProcess, hModule, @moduleFileName, sizeof( moduleFileName ) );
    if lstrcmpi( @moduleFileName, PAnsiChar(ProcessName)) = 0 then
    begin
      //MessageBox( 0, '已经运行', 'xxx', MB_OK );
      ProcessID := aps[i];
      Result := True;
    end;
  end;
end; 
请参考。。。。
  • 打赏
  • 举报
回复
CreateToolhelp32Snapshot返回一个进程快照handle 对这个handle,Process32First、Process32Next循环取ProcessID 对ProcessID用OpenProcess 然后QueryFullProcessImageName // 如果要从32位程序找出64位进程的映像名(包括路径)必须用这个 最后CloseHandle 网上应该能找到例子,你搜一下吧
m0_37551303 2017-03-22
  • 打赏
  • 举报
回复
引用 4 楼 DelphiGuy 的回复:
可以试一下CreateToolhelp32Snapshot
CreateToolhelp32Snapshot 怎么用啊。能帮我写个例句么?感谢
  • 打赏
  • 举报
回复
可以试一下CreateToolhelp32Snapshot
  • 打赏
  • 举报
回复
right
m0_37551303 2017-03-22
  • 打赏
  • 举报
回复
引用 1 楼 DelphiGuy 的回复:
32位程序只能枚举32位进程,64位程序可以枚举32、64或者全部,要用EnumProcessModulesEx。
亲,这么也就是说Delphi7无法枚举64位程序了?
  • 打赏
  • 举报
回复
32位程序只能枚举32位进程,64位程序可以枚举32、64或者全部,要用EnumProcessModulesEx。

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧