为什么我在64位Windows 8上从GetModuleFileNameEx中得到废话?

mca*_*a64 4 delphi winapi 32bit-64bit

我有这个

function NazwaProcesu(const uchwyt: Thandle): string;
var
  pid: DWORD;
  hProcess: Thandle;
  sciezka: array [0..MAX_PATH - 1] of char;
begin
  GetWindowThreadProcessId(uchwyt, pid);
  hProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ, FALSE, pid);
  if hProcess <> 0 then
    try
      GetModuleFileNameEx(hProcess, 0, sciezka, MAX_PATH)
    finally
      Result := sciezka;
      CloseHandle(hProcess);
    end;
end;
Run Code Online (Sandbox Code Playgroud)

在Windows 7 32位没有问题.在Win 8 x64上我有这个:

在此输入图像描述

我想,最后3个条目应该是explorer.exe.感谢帮助.

Dav*_*nan 11

据我所知,当代码在32位进程中执行时,此方法将无法检索64位进程信息.在WOW64模拟器中运行时,这种问题很常见,避免此类问题的最简单方法是在WOW64模拟器外部运行代码.也就是说,以64位进程运行代码.

解决此问题的其他可能方法,如果无法重新编译为64位,则:

  1. 使用单独的64位进程和一些IPC来检索信息.
  2. 使用WMI获取模块文件名.
  3. 使用QueryFullProcessImageName.

我一直强调的另一点是错误检查很重要.您在通话时未能检查错误GetModuleFileNameEx.调用显然是失败的,这就是为什么你最终得到一个未初始化的文本缓冲区.始终检查Windows API调用是否有错误.