2010-11-10 31 views
1

我對C sharp和C++有很好的瞭解。但我對COM編程完全陌生。我將一些代碼從VC++轉換爲C#。但是VC++代碼涉及到很多COM關鍵字像STDMETHODIMPSTDMETHODCALLTYPE__declspecHRESULT,和其他COM編程概念。我沒有得到什麼是這些COM terminilogies。 但是由於我能理解C++,因此我能夠理解VC++代碼中涉及的邏輯,並將此邏輯轉換爲C#實現IGNORING COM術語。
在我的VC++代碼,某些功能受到具有返回類型STDMETHODIMP,他們只是返回S_OKE_FAIL等。怎能與我轉換到C夏普繼續嗎?我應該在我的C#代碼中返回這些返回S_OK E_FAIL的VC++函數,以及我應該在C#代碼中使用的返回類型,而不是STDMETHODIMP。 ?事實上,在我的VC++代碼中有很多這樣的COM術語,比如「skippedEntity()」「processingInstruction()」等。事實上,這個VC++代碼正在利用名爲「msxml6.dll」的DLL。並在其中實現接口方法。那麼,如果我忽略這些COM術語並繼續將VC++代碼中的邏輯實現爲C#,那麼可以嗎?
請讓我知道同..在將VC++代碼(涉及COM概念)轉換爲C#時,COM如何與C Sharp相關聯?

由於COM是一個陌生的概念對我來說,對不起,如果我問一些愚蠢的疑問或無意義的疑問..

在此先感謝..

回答

2

大寫標識符是宏,它們確保COM接口函數具有正確的簽名。與自動化兼容的COM函數必須使用正確的調用約定__stdcall,並且必須返回指示錯誤或成功狀態的long(hresult)。其他要求是COM接口必須實現IUnknown,並且函數參數類型應該將自身限制爲自動化兼容類型。

CLR中的COM互操作支持確保滿足這些要求。它爲一個自動實現IUnknown的C#接口生成一個v-表,你不必自己實現它。 HRESULT返回值是自動生成的,它從異常映射。函數參數會從它們的非託管類型自動封送到等效的本機類型。

參數類型翻譯是一個相當大的話題,並在任何有關該主題的像樣的書(如Adam Nathan's)中涵蓋。只要說任何兼容自動化的類型都有相應的託管類型即可。更難的是反對VARIANT,串到BSTR和數組SAFEARRAY。

您在C#中使用[ComVisible]屬性來創建COM服務器。其他幾個是相關的,如[Guid]和[InterfaceType]。這在任何例子中都有很好的介紹。您可以使用Tlbexp.exe或更常用的Regasm.exe/tlb創建類型庫。後一種工具是註冊服務器所需的工具,您不能再使用Regsvr32.exe。

0

大多數如果您在項目中添加com-reference(或使用TLBIMP導入),則會自動處理這些內容。

S_OK和S_FAIL被轉換爲例外。見MSDN