LoadLibraryEx调用dll时有未经处理的异常,发生访问冲突

您所在的位置:网站首页 opencv读取位置时发生访问冲突 LoadLibraryEx调用dll时有未经处理的异常,发生访问冲突

LoadLibraryEx调用dll时有未经处理的异常,发生访问冲突

2024-06-09 01:18| 来源: 网络整理| 查看: 265

0x000000000006A220 处的第一机会异常(在 testHFHZDll.exe 中): 0xC0000005: 执行位置 0x000000000006A220 时发生访问冲突。 0x000000000006A220 处有未经处理的异常(在 testHFHZDll.exe 中): 0xC0000005: 执行位置 0x000000000006A220 时发生访问冲突。

最近做一个测试,使用LoadLibraryEx的方式动态调用dll,可以调用成功,也可以断点调试,但是一旦添加std::wstring类或者其他复杂一点的类,就报错,如上图所示。

异常位置:: _CSTD wcslen(_First));

报错位置,如上图所示。

如果函数为空,或者执行简单的加减法,则不报错。

//用于调试本地函数 extern DllExport int localCodeTest() { _tstring stDefPath; //注释掉这句话就不报错 int a = 10; int c = a; return 0; }

调用代码如下:

// TODO: 在此添加控件通知处理程序代码 // dynamic call dll HINSTANCE m_hDll = LoadLibraryEx(L"C:\\HFHZTDM.dll", NULL, DONT_RESOLVE_DLL_REFERENCES); if (NULL == m_hDll) { MessageBox(L"Load dll failed!"); return; } else { typedef int (*localCodeTest)(); localCodeTest m_Fun = (localCodeTest)GetProcAddress(m_hDll,"localCodeTest"); if (m_Fun == NULL) { MessageBox(L"Find localCodeTest function failed!"); return; } else { CString str = L""; int c = -1; c = m_Fun(); str.Format(L"返回值 = %d", c); MessageBox(str); } FreeLibrary(m_hDll); }

后来尝试了各种更改选项和设置,都没有结果,于是改用lib的方式调用dll,最终成功,并且发现这个dll其实依赖了很多其他的dll,初期觉得这可能是调用不成功的原因。

使用lib方式调用:  

extern "C" __declspec(dllimport) int localCodeTest(); CString str = L""; int c = -1; c = localCodeTest(); str.Format(L"返回值 = %d", c); MessageBox(str);

在添加了所有依赖的dll后,再次尝试使用LoadLibraryEx的方式调用,错误依旧,因为怀疑不是依赖造成的此问题。经过此次事件,我发现动态调用和静态调用还不能完全等价,当然,由于目前并没有弄清楚这个地方到底为什么调用失败,所以还不能妄下结论。

如果有大佬知道LoadLibraryEx的方式调用遇到此问题的解决办法,感谢能告知一下。

目前暂用的解决办法就是使用lib方式的调用,问题临时解决,如果你正好也遇到了这个问题,不妨尝试一下用lib的方式调用dll。



【本文地址】


今日新闻


推荐新闻


    CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3