C++ cli 在c++/cli

C++ cli 在c++/cli,c++-cli,function-pointers,C++ Cli,Function Pointers,我在一个托管(c++/cli)混合模式库中有一个本机函数,它调用一个单独的本机dll 以下是使用windows GetProcAddress初始化某些函数指针的本机函数: //in header static HMODULE hDll; static void (*MYDLL_Func1)(void*); static void (*MYDLL_Func2)(void); int BeginDll() { if (!hDll) { hDll= LoadLibraryHe

我在一个托管(c++/cli)混合模式库中有一个本机函数,它调用一个单独的本机dll

以下是使用windows GetProcAddress初始化某些函数指针的本机函数:

//in header
static HMODULE hDll;
static void (*MYDLL_Func1)(void*);
static void (*MYDLL_Func2)(void);

int BeginDll()
{
    if (!hDll) {
        hDll= LoadLibraryHelper("mydll.dll");
        if (hDll) {
            MYDLL_Func1 = (LPVOID)GetProcAddress(hDll, "MYDLL_Func1");
            MYDLL_Func2 = (LPVOID)GetProcAddress(hDll, "MYDLL_Func2");

            if (!MYDLL_Func1||
                !MYDLL_Func2)
            {
                FreeLibrary(hDll); hDll= NULL;
            } else {
                Log("were good to go");
            }
        }
    }
    return (hDll!= NULL);
}
现在我想编写一个包装函数来调用这个函数指针,但这样做会得到一个“AccessViolationException”

public ref struct Wrapper密封摘要
{
无效ManagedFunc(IntPtr hwnd)
{
if(begindl())
{
MYDLL_Func1(重新解释转换(hwnd.ToPointer));
MYDLL_Func2();
}
}
}
我并不是假设我可以在c++/cli代码中调用函数指针,我只是想知道一种正确的方法。如果添加api dll的头文件并隐式调用函数,则会遇到这样的问题:如果本机帮助程序dll不在托管dll的目录中,则应用程序会在第一次调用后爆炸。(“AccessViolationException”)


演员是邪恶的。将成员函数强制转换为数据指针是错误的。

出于某种原因,Hans Passat发布了正确的答案,但现在已经不可用了,如果有人想知道这是如何修复的,我总结一下:

函数指针的静态声明导致每个源文件都有自己的副本,因此它们在声明文件中成为以下内容

extern void (*MYDLL_Func1)(void*);
和在源文件中

void (*MYDLL_Func1)(void*);
他还说要将调用约定更改为_stdcall,但这是一个.C文件,但是_cdecl编译得很好

然而,我最终还是切换回包含DLL的头文件并隐式调用函数。出于某种原因,在这个解决方案中,当在调试器之外运行时,我的C#client中出现了缓冲区溢出。由于在尝试调试时问题不存在,我转而使用另一种解决方案。我想我只需要小心,不要在托管DLL和客户端中包含DLL

MYDLL_Func1(hwnd.ToPointer());
extern void (*MYDLL_Func1)(void*);
void (*MYDLL_Func1)(void*);