ATL结构从dll

时间:2017-09-13 10:14:44

标签: c++ dll atl

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

非常感谢任何有关错误的建议或信息。

1 个答案:

答案 0 :(得分:0)

所以,我解决了这个问题。显然在我的程序中正确调用dll函数需要' 公共语言运行时支持'已被关闭,并且' 整个计划优化'设置为' 使用链接时间代码生成'

相关问题