2011-06-15 33 views
-1

當我在Windows XP中調試代碼(如下所示)時,get_tables(&_result)將表列表分配給_result,並將hr的值分配爲S_OK函數get_tables()對Windows 7失敗,但它對Windows XP有效

如果我嘗試相同的代碼與Windows 7(32位),則get_tables功能分配NULL(0X00000)到_result(未除外),和的hr的值變爲「應用程序調用一個接口,被編組爲不同的線程「。我的應用程序然後崩潰。

爲什麼Windows 7(32位)會出現這種情況?

我應該去編組線程?

或者我需要更改Windows 7的一些設置?


// Append the new table 
m_pCatalog->Tables->Append(_variant_t((IDispatch *) pTableNew)); 

在調試我去了這一點(見下文)。

inline TablesPtr _Catalog::GetTables() 
{ 
    struct Tables * _result; 
    HRESULT _hr = get_Tables(&_result); 
    if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this)); 
     return TablesPtr(_result, false); 
} 
+1

請提供一些更多的上下文 – 2011-06-15 05:58:13

回答

0

獲得pTableNew /上比它現在正在使用它的另一個線程創建的 - 這是你的錯誤。

COM接口(包括IDispatch)需要在線程之間編組,除非兩個線程都在MTA中(COINIT_MULTITHREADED)。有幾種編組方式,但有一種簡單的方法可以讓跨線程共享的接口是使用全局接口表並存儲GIT cookie而不是接口指針。本文

http://msdn.microsoft.com/en-us/library/ms678517(VS.85).aspx

有GIT的一個很好的基本解釋。

如果碰巧COM對象是用C++實現的(而不是由第三方代碼提供的)對象之一,另一個高級解決方案將切換到讓對象聚合自由線程編組器(允許使用它直接從任何線程)。這樣做需要對代碼進行其他更改(例如對外部對象一致地使用GIT cookie)以及更多的關注。唐的文章很不錯:

http://www.microsoft.com/msj/0997/activex0997.aspx

馬丁

+0

感謝洛弗爾....我已經forgeted寫一個thing.pls閱讀「我的目標是創建的報告,我可以從兩個不同的選項創建報告,對於一個選項(一個場景)它工作正常,但對於另一個場景它是失敗的..「你認爲我應該真的去封送? – runa 2011-06-17 07:27:08

+0

您是否將接口指針移到另一個線程而不進行編組? – 2011-06-17 07:43:15

相關問題