COM exe, C++, and 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界面的项目。
感谢您的时间。
答案"有没有一种方法可以与mingw做同样的方法。#IMPORT是可选工具,读取com类型库(嵌入在二进制中,TLB通常对应于.IDL文件,但这也是可选的),并生成C/C 严重取决于只有Visual Studio提供的.C和.H文件的代码。
"我可以使用mingw做com的答案"当然是的。我对mingw和工具的了解不多,但是您可以使用任何编译器进行COM,因为COM是(仅)二进制标准。
如果您摆脱了#Import,则必须更改使用生成的代码(在#IMPort指令导致的.tlh文件中),COM助手,包装器等。工作,但从技术上讲是可能的。
现在,在您的上下文中,我想这确实取决于.exe的类型库(您的com类,接口等)的大小。Visual Studio的#Import增加了价值,因此您必须评估它为您添加的价值。
如果只是一个类,例如一个界面,那么摆脱#IMPORT可能会很有趣。如果.exe已经具有与TLB相对应的.H文件,则可以使用它们,否则您必须自己重新列出一些(然后再次更改使用生成的包装器的代码)。
您问这个问题的唯一事实使我想知道您是否对COM有足够的了解(没有犯罪:-)摆脱视觉工作室。
com子系统是Windows API的一部分,您可以使用c调用该API访问它。
但是,其中涉及大量的样板。支持com"开箱即用"的编译器已经写了所有这些样板,并将其包装成编译的库,模板标头等的某种组合。
这些编译器提供的通常的工具套件的另一部分是可以从现有编译对象中读取COM接口定义的一部分。出于这个原因,COM对象通常包含其接口的二进制表示。
有几种方法可以在此处继续使用G ;一个选项是遵循此广泛的轮廓:
- 使用您的MSVC安装读取COM对象并产生描述接口的C标头文件。
- 从该标头文件中挑选枚举和GUID。
- 在G 中,使用Windows API使用这些枚举和GUIDS调用对象。
如果您想在g 中撰写对象,那么您需要做更多的工作,因为您需要实现很多事情,但是可能会做。
过去,我已经成功地使用了G (作为测试COM对象的一部分)。可能有人可以为使用com对象甚至为创作而开发一个不错的开源套件,而不是依赖MSVC,但我不知道这样的事情。
我建议您阅读Don Box的书籍,他们会填补很多差距,以了解您只有通过使用com并阅读互联网而了解com的情况。
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 如何将C++中的库和头与MinGW一起使用
- 为什么与常规GCC不同,即使有"学究性错误",MinGW-GCC也能容忍丢失的返回类型
- C++核心准则 C35 对于接口类"A base class destructor should be either public and virtual, or protected and nonv
- 为什么C++逐位AND运算符在不同大小的操作数中表现为这样
- 为什么 Clang 不允许"and"作为函数名称?
- 无法在windows上使用mingw将sqlite3与c连接
- 位阵列上的快速AND运算
- 是否可以在 C++03 中定义'move-and-swap idiom'等效项
- MinGw 无法从 cmake 编译测试文件
- MSYS2 MinGW程序包中缺少grpc_cpp_plugin协议
- COM exe, C++, and MinGW
- g++ (MinGW), C++11 and SSE
- libcurl link with mingw and clion
- Sublime Text 2 and MinGW
- virtual noexcept(true) errors: MinGW and gtkmm
- uint24_t and uint48_t in MinGW
- MinGW and std::thread
- stoi and std::to_string on mingw 4.7.1
- Eclipse, minGW and C++11