[英]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.