我得到以下代码来通过句柄获取路径/文件名:
[DllImport("user32.dll", CharSet = CharSet.Auto, SetLastError = true)]
private static extern int GetWindowThreadProcessId(IntPtr handle, out uint processId);
public static string GetProcessPath(IntPtr hwnd)
{
uint pid = 0;
GetWindowThreadProcessId(hwnd, out pid);
Process proc = Process.GetProcessById((int)pid);
return proc.MainModule.FileName.ToString();
}
它在 32 位中工作完美,但在 64 位中出现错误>“仅部分 ReadProcessMemory 或 WriteProcessMemory 请求已完成。”
该项目被编译为 x86(平台目标 x86)。
我该如何修复它?
〜谢谢罗恩
从您的问题来看,您当前已将程序编译为 32 位应用程序。但是,您尝试查询的进程(假设您在 64 位版本的 Windows 上运行)无疑是 64 位进程。这种事情是不允许的 http://blogs.msdn.com/b/oldnewthing/archive/2008/10/20/9006720.aspx。尽管您可以在 64 位版本的 Windows 上运行 32 位应用程序,但它们在专用的 Windows on Windows (WOW64) 子系统下运行。这就是为什么你会得到一个Win32Exception
声称“仅完成了 ReadProcessMemory 或 WriteProcessMemory 请求的一部分”。我同意,如果您还不知道 Windows 如何管理 32 位和 64 位进程,那么这不是最具描述性的错误消息,但有了这些知识,它至少会更有意义。
解决方案是将您的应用程序编译为 64 位应用程序 (x64),或针对“任何 CPU”。之后一切都应该按预期进行。如果可能的话,我建议使用“Any CPU”,这将允许应用程序在 32 位操作系统上以 32 位模式运行,在 64 位操作系统上以 64 位模式运行。这确实是理想的情况,假设:
- 您已正确编写 P/Invoke 定义(即,使用
IntPtr
在适当的情况下,代替Integer
).
- 您不依赖于编译为 32 位的第 3 方 DLL(您没有其源代码)。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)