ATL结构破坏了DLL的COM对象
问题描述:
因此,我们目前正在将一个古老的程序从Visual Studio 2008(其中一切正常)升级到2017.我们使用了一个dll,它的应用程序通过ATL和项目依赖项。ATL结构破坏了DLL的COM对象
不幸的是,从这些类调用函数的所有尝试都会返回异常,可能是因为它找不到它们。
当构建dll的类成功添加到注册表时,通过regedit添加到注册表中,并且uuids与注册值正确对应。这些类也可以在OLE/COM-viewer中找到。
它也只在试图从我们的一个类中调用时才会中断。尝试从有问题的类继承的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文件。
错误创建一个 “引发的异常” 对话框具有以下:
在异常 AnimgramPro.exe在0x00007FF9153ED7F2(的oleaut32.dll)抛出:0000005:访问冲突执行位置 0x00007FF9153ED7F2
我们还尝试在m_pRenderer上使用QueryInterface和nullrenderer的uuid。这以另一个糟糕的变量类型错误结束。
任何意见或可能相关错误的信息将不胜感激。
答
所以,我解决了这个问题。显然,正确调用我的程序中的DLL功能要求“公共语言运行库支持”打开的,并且“全程序优化”设置为“使用链接时代码生成”
第一个参数到'CoCreateInstance()'应该是CoClass的CoClass ID(CLSID),我们希望它是一个实例。您似乎正在将它传递给接口“ICBSNullRenderer”的接口ID(IID)。没有CoClass就像'CCBSNullRendered'你想获得一个实例吗? –
日志显示2次调用'CoCreateInstance'的结果是什么? –
@KapilDhaimade道歉,这是我写这个问题的错误。你的建议已经做了没有效果。 –