C# SymLoadModule64和来自C的GetCurrentProcess

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,

我想使用dbghelp库从pdb文件中获取一些类型和程序信息。现在,由于我喜欢C远远超过C++,我现在正试图让它从C中工作。我有一个C++的工作电话,看起来像:< /P>
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不同