因此,我们目前正在将一个古老的程序从visual studio 2008(其中一切正常)升级到2017年。我们使用一个dll,应用程序通过ATL连接的类和项目依赖。
不幸的是,所有从这些类调用函数的尝试都会返回异常,大概是因为它无法找到它们。
dll的类在构建时通过regedit成功添加到注册表中,并且uuids与注册的值正确对应。这些类也可以在OLE / COM查看器中找到。
它也只在尝试从我们的某个类调用时中断。尝试从IDispatch中调用函数(有问题的类继承自的函数)正常工作。
在下面的代码中,第一次尝试'm_pRenderer'抛出异常。第二次尝试'test2'没有输入它的if语句,因为CoCreateInstance返回一个错误的变量类型错误
HRESULT res = CoCreateInstance(__uuidof(CBSNullRenderer), NULL, CLSCTX_INPROC_SERVER, __uuidof(IDispatch), (void**)&m_pRenderer);
Log("\nCreateInstance: %ld", res);
ICBSNullRendererPtr test2 = NULL;
HRESULT res2 = CoCreateInstance(__uuidof(CBSNullRenderer), NULL, CLSCTX_INPROC_SERVER, __uuidof(ICBSNullRenderer), (void**)&test2);
Log("\nres2: %ld", res2);
wireHWND mainHwnd = (wireHWND)GetParent(p_hWnd);
if(mainHwnd == NULL)
Log("\nWARNING mainHWND is NULL!");
try {
if (test2)
{
Log("\nDid create NullRenderer!");
test2->SetMainWnd(mainHwnd);
}
if (m_pRenderer)
{
Log("\nDid create NullRenderer!");
m_pRenderer->SetMainWnd(mainHwnd);
}
}
catch (...)
{
}
第2行为m_pRenderer打破了:
inline HRESULT ICBSNullRenderer::SetMainWnd ( wireHWND hwnd ) {
HRESULT _hr = raw_SetMainWnd(hwnd);
if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this));
return _hr;
}
在dll的.tli文件中。
该错误会创建一个“Exception Thrown”对话框,其中包含以下内容:
在0x00007FF9153ED7F2(oleaut32.dll)中抛出异常 AnimgramPro.exe:0xC0000005:访问冲突执行位置 0x00007FF9153ED7F2
我们还尝试在m_pRenderer上使用带有nullrenderer的uuid的QueryInterface。这以另一个错误的变量类型错误结束。
非常感谢任何有关错误的建议或信息。
答案 0 :(得分:0)
所以,我解决了这个问题。显然在我的程序中正确调用dll函数需要' 公共语言运行时支持'已被关闭,并且' 整个计划优化'设置为' 使用链接时间代码生成'