2014-03-25 51 views
-1

我有用C++編寫的遺留COM對象。我通過一個安裝程序,並在C#中,包裝應用註冊COM庫我實例化COM對象這樣傳統COM對象停止正確響應

Type type = Type.GetTypeFromProgID("GrpSvr.GrpCall"); 
this.grouperServer = Activator.CreateInstance(type); 
string strMsg = this.grouperServer.GroupInit(this.strCommandFilePath, true, true); 

,然後我使用COM對象進行各種操作和這些調用看起來像

int index = 2; 
string strFieldName = "AXR"; 
this.grouperSever.MakeRec(strFieldName, index); 

這些工作很好(起初)。然後,這些電話就會停止返回正確的結果。我可以確認,我正在將正確的值傳遞給給定的方法,並且在某個點和隨機時,grouperServer對象開始返回廢話。

我無法調試通常意義上的庫,也沒有使用過COM庫。事實上,我可以在循環中傳遞一個COM方法的相同值,並且此方法停止返回正確的結果,這表明這可能是動態語言運行時(DLR)的調用問題。我的問題然後變成

如何找出/調試COM對象有什麼問題?

謝謝你的時間。

+0

你的問題需要很多的視角來回答這個問題。所以,調試一下,看看你自己。除了標準代碼的所有其他內容之外,您的「遺留」表明com對象可能會隱藏更新的軟件環境。 – Deduplicator

+0

非常感謝您的回覆。不幸的是,你不能以通常的方式調試COM對象[因爲你會用本機代碼],所以我爲什麼要問'怎樣才能找出COM對象有什麼問題'。不幸的是,你錯誤地將'千里眼'和'經驗'這兩個字混淆起來。 – MoonKnight

+0

不是。你沒有提供你的COM對象或某種方式來識別它,所以任何回答的人都必須列出所有可能做錯的事情,並且似乎可以工作一段時間,或者成爲認證的心理學家。 – Deduplicator

回答

1

您沒有對應用程序的執行環境或線程模型進行任何說明。我的猜測是:你的COM對象在註冊表中被標記爲STA對象(ThreadingModel=Apartment),但是在你的C#應用​​程序中,你沒有在具有功能性Windows消息循環的STA線程上使用它。

如果你這樣做,那麼確保這個STA線程是只有線程訪問COM對象。沒有其他線程可以直接調用它,不用編組。

必讀:"INFO: Descriptions and Workings of OLE Threading Models"

這個問題可能也有關聯: 「StaTaskScheduler and STA thread message pumping」。

+1

非常感謝您的回覆。這正是我想要的那種領導。我使用'dynamic'和主[UI]線程執行代碼,有時通過.NET4.0 TPL執行後臺線程池線程(使用Task.Factory.StartNew(()=> ...) )。我現在將閱讀鏈接...再次感謝您的時間。 – MoonKnight

+1

@Killercam,沒問題。根據您的UI框架,使用'Control.Invoke'或'Dispatcher.Invoke'來從UI線程以外的任何線程訪問您的COM對象。我認爲你的問題是不公平的。 – Noseratio