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。