多線程之間COM結構體傳遞(C#)

來源:互聯網
上載者:User

前言:

      此處只提供一個具體的思路,具體的實現與具體的應用相關。

通常,COM中的多線程比一般程式的多線程要複雜的多,這要歸功於微軟的STA和MTA模型,雖然此模型的目的是為降低線程之間的混雜程度,其結果卻是讓線程之間的模型變得更為複雜。

一般在STA的COM對象中,多個線程之間的COM對象資料共用變得非常困難,哪怕即使是傳遞一個COM對象的指標,也可能會出現意向不到的問題。

在《ATL編程指南》中,有一部分講到了STA中多個線程傳遞COM對象的指標的方法,使用的Marshal方式。這種方式在COM介面是比較通用的,也是比較不錯的,但是很多時候,CoMarshallnterThreadInterfaceInStream和CoGetInterfaceAndReleaseStream這兩個API函數並好方面使用,尤其是在不同語言之間,這個方式,可能更加不方便使用。

當底層執行階段程式庫已經是多個線程的時候,而COM只是作為介面封裝而被使用的情況下。在底層執行階段程式庫有自訂結構體的時候,為了能夠支援更多的平台通用性,開發與外部條件(語言)無關的COM組件變得更為重要,這個時候,有兩種方案可以採用,一種是採用SAFEARRAY傳遞資料,這是COM內建支援的一種資料傳遞方式,這種方式非常方便,但是它使用起來並不直觀。另一種方式是使用COM組件作為結構體,用COM屬性作為結構體的成員,這種方式,COM對象與結構體一一對應,看起來非常不錯,但是在不同的線程之間傳遞這個COM組件介面對象,也非常容易出現錯誤。

對於SAFEARRAY的實現,網上已經有一篇又一篇的介紹,再次,不在過多的描述。

對於COM對象(就本身對象的)的實現而言,也是非常簡單的。此處僅對不同線程之間傳遞COM對象的方式做一個介紹。

在COM對象被建立的時候,系統內部可以建立一個全域的介面表,稱為Global Interface Table(GIT),微軟為我們實現了這個介面表的COM對象,通過IGlobalInterfaceTable來實現訪問。當把COM對象放入到GIT中後,在進程內的任何線程都可以訪問這個COM對象的指標,從而也就方便了多線程之間的資料調用。關於這一部分的描述,在網上也是一把一把的。

當不同語言之間傳遞資料的時候,使用IGlobalInterfaceTable的RegisterInterfaceInGlobal介面函數返回的Cookie作為傳遞資料對象,因為這是一個DWORD類型的資料,在任何語言之間都可以方便傳遞。當需要擷取定義的COM對象的時候,使用這個Cookie作為標識符傳遞到此次可以訪問的某個COM對象中(一般為全域的COM對象),當然該COM中要實現一個以Cookie和GUID為標識符,能夠返回一個COM對象,比方說GetObject介面。

使用GetObject返回的對象,在C#中,有一個特殊的地方,那就是該對象是未被Class尾碼添加的對象,比方說註冊的對象介面名稱為IMyCom,那麼在C#中匯入後,會有MyCom和MyComClass兩個內容,前一個是介面,後一個是C#對此的一層封裝。需要注意的是GetObject,返回的僅僅是MyCom這個介面(儘管介面對象已經被建立)。要使用這個介面對象,轉換為MyComClass需要使用Marshal.CreateWrapperOfType(mycom, typeof(MyComClass));然後你才可以正確用這個傳遞出來的COM對象。

這個方法,應該說一個比較可行的方法,同時也困擾了我許久。

http://www.cnblogs.com/ubunoon

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.