簡體   English   中英

ATL 結構在來自 dll 的 COM 對象上中斷

[英]ATL structures break on COM objects from dll

因此,我們目前正在將一個古老的程序從 Visual Studio 2008(一切正常)升級到 2017 年。我們使用一個 dll,應用程序通過 ATL 和項目依賴項連接到它的類。

不幸的是,從這些類調用函數的所有嘗試都返回異常,大概是因為它找不到它們。

dll 的類在構建時通過 regedit 成功添加到注冊表中,並且 uuid 與注冊值正確對應。 這些類也可以在 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 (...)
{

}

m_pRenderer 在第 2 行中斷:

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) 處拋出異常:0xC0000005:訪問沖突執行位置 0x00007FF9153ED7F2

我們還嘗試在 m_pRenderer 上使用 QueryInterface 和 nullrenderer 的 uuid。 這以另一個錯誤的變量類型錯誤結束。

任何可能相關的錯誤的建議或信息將不勝感激。

所以,我解決了這個問題。 顯然,在我的程序中正確調用 dll 函數需要關閉“公共語言運行時支持”並將“整個程序優化”設置為“使用鏈接時間代碼生成

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM