C++ cli 在c++/cli
我在一个托管(c++/cli)混合模式库中有一个本机函数,它调用一个单独的本机dll 以下是使用windows GetProcAddress初始化某些函数指针的本机函数: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
//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*);