C# 为什么ReadProcessMemory总是返回false?
不知道为什么,但是对于某些ReadProcessMemory总是返回false。始终按如下方式导入:C# 为什么ReadProcessMemory总是返回false?,c#,C#,不知道为什么,但是对于某些ReadProcessMemory总是返回false。始终按如下方式导入: [DefaultDllImportSearchPaths(Kernel32.Path)] [DllImport(Kernel32.Dll)] private static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [Out] byte[] lpBuffer, int nSize, IntPtr lpN
[DefaultDllImportSearchPaths(Kernel32.Path)]
[DllImport(Kernel32.Dll)]
private static extern bool ReadProcessMemory(IntPtr hProcess, IntPtr lpBaseAddress, [Out] byte[] lpBuffer, int nSize, IntPtr lpNumberOfBytesRead);
以下是运行ReadProcessMemory的结果(IntPtr HandleWithAllAccess、IntPtr ProcessBaseAddress、byte[]BufferSizeOf500、int TheSize500、IntPtr.Zero)代码>
注意:为了避免人们开始问不相关的问题,Kernel32是一个具有dll名称和找到它的路径的类
读取操作进入了进程的不可访问区域,这就是它返回false的原因。感谢Jeroen Mostert链接文档,我将从现在起将SetLastError设置为true。DllImport(..,SetLastError=true)
。然后抛出新的Win32Exception()
实际上会告诉您函数返回FALSE时失败的原因。还列出了它可能失败的一些原因。1)执行SetLastError=true
没有引发任何异常。2) 我忘记了如果请求的读取操作进入进程中不可访问的区域,函数将失败。
,可能就是这样。SetLastError=true
不应返回任何内容,非托管函数也不会自动生成托管异常。它指示封送拆收器捕获SetLastError()
的结果,以便在需要检查详细信息时可以访问Win32Exception
调用此函数并格式化结果消息。每当函数记录“要获取扩展的错误信息,请调用GetLastError
”时设置此选项是一个好主意。从现在起我会这么做的。