簡體   English   中英

COM exe,C ++和MinGW

[英]COM exe, C++, and MinGW

有一個奇怪的問題; 我使用的是一家大公司提供的工具,出於某種原因,我覺得有點莫名其妙,而是使用了exe本身定義的COM接口。 在他們提供的示例代碼中,看起來有點像這樣。

#import "C:\\\\Path_To_Exe\\\\the.exe" rename_namespace ("exe_namespace");

據我了解,這是Microsoft Visual C ++編譯器理解COM並與其一起工作的方式,並且我之前有示例代碼可以工作(當前,由於對我的構建環境的偏愛,它無法編譯)。

我的問題是,有沒有辦法對MinGW進行同樣的處理? 我正在研究的項目主要是使用它。 我們可以根據需要使用MSVC,但理想情況下,我希望避免使用多個編譯器。 我目前正在使用cmake進行構建,但是如果需要,我願意使用腳本來構建需要COM接口的項目。

謝謝你的時間。

COM子系統是Windows API的一部分,您可以使用對該API的C調用來訪問它。

但是,這涉及大量樣板。 支持COM“開箱即用”的編譯器已經編寫了所有這些樣板,並將其打包為已編譯的庫,模板標頭等的某種組合。

這些編譯器提供的常用工具套件的另一部分是可以從現有的編譯對象中讀取COM接口定義的工具。 因此,COM對象通常包含其接口的二進制表示形式。

您可以通過幾種方法來使用g ++。 一種選擇是遵循以下大致概述:

  • 使用您的MSVC安裝程序讀取COM對象並生成一個描述該接口的C頭文件。
  • 從該頭文件中選擇枚舉和GUID。
  • 在g ++中,使用Windows API來使用這些枚舉和GUID調用對象。

如果您想用g ++編寫對象,那么您還需要做很多工作來實現一堆東西,但這是可能的。

過去,我已經使用g ++成功地做到了這一點(作為測試我開發的COM對象的一部分)。 可能有人可以開發一個不錯的開源套件來使用COM對象,甚至用於創作,它不依賴於MSVC,但我不知道這種事情。

我建議閱讀Don Box的書,如果您僅通過與COM一起工作並閱讀互聯網來了解COM,它們將填補您在理解方面的許多空白。

答案是“是否可以使用MinGW進行相同的處理”。 #import是一個可選工具 ,可讀取COM 類型庫 (無論是否嵌入二進制文件,TLB通常對應於.idl文件,但也是可選的),並生成嚴重依賴於.c的C / C ++代碼。和僅Visual Studio提供的.h文件。

當然,“我可以用MinGW做COM”的答案是肯定的。 我對MinGW和工具了解不多,但是您可以使用任何編譯器來實現COM,因為COM(只是) 二進制標准

如果您放棄了#import,則必須更改使用生成的代碼(在#import指令產生的.TLH文件中),COM幫助程序,包裝程序等的代碼。這可能需要大量工作,但這在技術上是可能的。

現在,在您的上下文中,我想它實際上取決於.exe的類型庫(您的COM類,接口等的描述)的大小。 Visual Studio的#import增加了價值,因此您必須評估它為您增加了多少價值。

如果只是一個類,例如一個接口,那么擺脫#import可能會很有趣。 如果.exe已經具有與tlb對應的.h文件,則可以使用它們,否則,您必須自己重新聲明一些文件(然后再次更改使用生成的包裝器的代碼)。

您提出問題的唯一事實使我想知道您是否具有足夠的COM知識(沒有冒犯:-)以擺脫Visual Studio。

暫無
暫無

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

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