C# SymLoadModule64和来自C的GetCurrentProcess
我想使用dbghelp库从pdb文件中获取一些类型和程序信息。现在,由于我喜欢C远远超过C++,我现在正试图让它从C中工作。我有一个C++的工作电话,看起来像:< /P>C# SymLoadModule64和来自C的GetCurrentProcess,c#,c++,dbghelp,C#,C++,Dbghelp,我想使用dbghelp库从pdb文件中获取一些类型和程序信息。现在,由于我喜欢C远远超过C++,我现在正试图让它从C中工作。我有一个C++的工作电话,看起来像:< /P> const TCHAR* pModName = argv[1]; HANDLE currentProcHandle = GetCurrentProcess(); DWORD64 ModBase = ::SymLoadModule64 ( currentProcHandle,
const TCHAR* pModName = argv[1];
HANDLE currentProcHandle = GetCurrentProcess();
DWORD64 ModBase = ::SymLoadModule64 (
currentProcHandle,
NULL,
pModName,
NULL,
0,
0);
然而,当尝试从C调用该函数时,我不断得到错误:
[DllImport("dbghelp.dll", SetLastError = true)]
public static extern ulong SymLoadModule64(IntPtr hProcess, IntPtr hFile,
string ImageName, string ModuleName,
ulong BaseOfDll, uint SizeOfDll);
[...]
var loadedModule = SymLoadModule64(
currentProcHandle,
System.IntPtr.Zero,
"C:\\Path\\To\\Executable.exe",
string.Empty,
0,
0);
结果loadedModule被设置为0,Marshal.GetLastWin32Error返回6个错误\u无效\u句柄。现在,我认为,因为它似乎是一个句柄的问题,我可以使用原生函数来检索它,以避免由于C句柄检索东西到C++期望的不兼容而导致的任何缺陷。然而,尽管
Process.GetCurrentProcess().Handle;
总是返回一些或多或少有意义的内容10081036,…,调用
[DllImport("kernel32.dll")]
static extern IntPtr GetCurrentProcess();
GetCurrentProcess();
总是返回-1
因此:对于如何从C获得SymLoadModule64的主要问题,我非常感谢您的任何意见,当然,我也想知道为什么调用GetCurrentProcess失败。提前感谢。有关如何在C语言中使用SymLoadModule64的主要问题的工作代码,请参见末尾显示的回复
还可以看到这个问题和答案-它有一些很好的代码,可以帮助您开始…您作为第一个参数传递给SymLoadModule64的进程句柄可以是任意值,它实际上不必是进程的有效句柄。但是,对于要使用的每个进程句柄,必须首先通过调用SymInitialize为该值初始化dbghelp
至于,值-1是引用当前进程的伪句柄。它可以用于大多数需要句柄的Windows函数。请注意,函数返回伪句柄的事实已经有了很好的证明。它没有失败,-1是正常的返回值。这是一个伪句柄。使用当前进程和硬编码,exe的路径看起来是错误的。您正在调用SymInitialize吗?string.Empty与NULL不同