簡體   English   中英

純C中的Win32 COM編程

[英]Win32 COM Programming in Pure C

我有一個編程項目,需要訪問一些較低級別的Windows API(特別是WASAPI)。 我對C#,Java和PHP等高級編程語言很有經驗,而且我對C / C ++只有一點了解。

我想在這個項目中使用C(而不是C ++),因為C ++有點可怕 在Visual Studio中將我的項目的C / C ++設置更改為編譯為C代碼后,我注意到對__uuidof任何調用都不起作用,因為它們是特定於C ++的。

我的問題是雙重的:

  1. 是否可以編寫在純C中使用COM的Win32程序
  2. 如果是這樣,應該避免使用純C嗎?
  1. 是的,可以使用使用COM的寫純C程序,事實上這是10 - 15年前的常見做法。

  2. 你不是通過使用C做自己的幫助(正如你已經注意到的那樣)。 例如,ATL在您做COM時提供了很多幫助,可以幫助您避免常見錯誤。

如果我是你,我會去C ++,即使最初的門檻可能稍微高一點。 如果您沒有該書,也可以獲得該主題的書籍。 在網絡中有很多例子,但是有一些東西可以引導你,因為COM編程不適合膽小者,無論你使用的是C還是C ++。

COM在C部分之外使用了相當小的C ++子集,並且不需要使用許多“可怕”項目,例如:

  • 例外 - 如果你沒有正確使用它們,這些可以真正咬你C ++(你需要真正購買RAII成語,如果你習慣了更傳統的C / Win32編碼,它可能會習慣); 但異常根本不是COM的一部分:COM使用返回代碼進行所有錯誤處理。 有一些包裝器和編譯器擴展,如果你願意,可以將COM的返回代碼轉換為C ++異常,但它是選擇加入的。

  • 類層次結構和繼承 - 繼承也不是COM本身的一部分,除了所有COM接口派生自(或從IKnknown方法開始)的事實。 但是,您不需要了解有關使用 COM的多個虛擬繼承的任何信息。 其中一些對於了解您是否自己實現 COM對象非常有用,而不是僅僅使用它。 (例如,使用C ++多重繼承是實現暴露多個接口的COM對象的一種非常常見的方式;但它不是唯一的方法。)

  • 模板 - 再次,不是COM的一部分,但有幾個庫 - 例如。 MFC和ATL - 使用模板使COM更易於使用。 對於像CComPtr這樣的智能指針類來說尤其如此,它將為您處理一些引用計數,允許您的代碼專注於做真正有趣的事情,而不是讓它包含管家的東西。

COM和C ++之間的主要聯系是Windows上的所有C ++編譯器都會以與COM所需內容完全匹配的方式在內存中布局C ++對象。 這允許您使用COM對象,就像它是一個C ++對象一樣,這使得代碼相當簡潔,因為語言/編譯器會為您處理一些非常簡單但冗長的內容。

所以不要在C中執行以下操作(逐步執行vtable並明確傳遞此參數):

pUnk->lpVtbl->SomeMethod(pUnk, 42);

您可以在C ++中執行以下操作:

pUnk->SomeMethod(42);

你真的不想輸入 - > lpVtbl並確保你通過每個COM調用傳遞正確的'this'參數(切割和粘貼時要小心!),對嗎?

我的建議是找到一本好的COM書 - 里面的COM是一個很好的 - 然后開始使用你熟悉的C ++子集。 一旦你知道如何使用COM指針“raw”,並自己使用QI,AddRef等,那么也許你可以使用幫助庫來使用模板為你做一些簿記。 決定使用將COM錯誤映射到C ++異常的包裝器是一個更大的跳躍,因為您需要首先編寫異常安全的C ++代碼,因此需要首先了解這些問題。 但我想不出任何好的理由 - 除了純粹的好奇心 - 回歸並使用來自普通C的COM。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM