2017-09-13 75 views
-1

因此,我们目前正在将一个古老的程序从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。这以另一个糟糕的变量类型错误结束。

任何意见或可能相关错误的信息将不胜感激。

+0

第一个参数到'CoCreateInstance()'应该是CoClass的CoClass ID(CLSID),我们希望它是一个实例。您似乎正在将它传递给接口“ICBSNullRenderer”的接口ID(IID)。没有CoClass就像'CCBSNullRendered'你想获得一个实例吗? –

+0

日志显示2次调用'CoCreateInstance'的结果是什么? –

+0

@KapilDhaimade道歉,这是我写这个问题的错误。你的建议已经做了没有效果。 –

回答

0

所以,我解决了这个问题。显然,正确调用我的程序中的DLL功能要求“公共语言运行库支持”打开的,并且“全程序优化”设置为“使用链接时代码生成