相关疑难解决方法(0)

使用delphi从PID获取完整路径

我需要从PID获得完整路径.

我已经检查了这个问题C++ Windows - 如何从其PID获取进程路径 ,我编写了以下代码:

 function GetFullPathFromPID(PID: DWORD): string;
 var
    hProcess: THandle;
    ModName : Array[0..MAX_PATH + 1] of Char;
 begin
   Result:='';
    hProcess := OpenProcess(PROCESS_ALL_ACCESS,False, PID);
    try
      if hProcess <> 0 then
       if GetModuleFileName(hProcess, ModName, Sizeof(ModName))<>0 then
         Result:=ModName
        else
         ShowMessage(SysErrorMessage(GetLastError));
    finally
     CloseHandle(hProcess);
    end;
 end;
Run Code Online (Sandbox Code Playgroud)

但总是返回此消息:

指定的模块无法找到

如何从PID中获取完整路径?

delphi delphi-xe

11
推荐指数
1
解决办法
1万
查看次数

运行时检查失败#0从kernel32.dll加载QueryFullProcessImageName

我有一个需要在WinXP和Vista64上运行的应用程序.我的程序需要QueryFullProcessImageName()才能在Vista上运行,但不能在XP上运行.

我尝试通过kernel32.dll加载QueryFullProcessImageName()(而不是静态链接),以便在WinXP和Vista上运行相同的可执行文件.加载它的代码是:

//only gets called on vista
bool LoadQueryFullProcessImageName()
{
  HMODULE hDLL = LoadLibrary("kernel32.dll");
  if (!hDLL) return(0);

  //Now use pointer to get access to functions defined in DLL
  fpQueryFullProcessImageName = (LPQueryFullProcessImageName)GetProcAddress(hDLL, "QueryFullProcessImageNameA"); //ANSI version
  if (!fpQueryFullProcessImageName) 
     return false;

  return true;
}
Run Code Online (Sandbox Code Playgroud)

typedef是

typedef WINBASEAPI
BOOL (*LPQueryFullProcessImageName)(
    __in HANDLE hProcess,
    __in DWORD dwFlags,
    __out_ecount_part(*lpdwSize, *lpdwSize) LPSTR lpExeName,
    __inout PDWORD lpdwSize
    );
Run Code Online (Sandbox Code Playgroud)

不幸的是,当取消引用函数指针时,我在Vista上遇到运行时错误:

运行时检查失败#0 - ESP的值未在函数调用中正确保存.这通常是调用使用一个调用约定声明的函数和使用不同调用约定声明的函数指针的结果.

typedef直接来自.h文件,所以我无法理解为什么它会搞乱.有帮助吗?我尝试了很多变种,但没有运气.

c++ winapi function-pointers windows-vista

7
推荐指数
1
解决办法
6523
查看次数