如何实现C++;通过插件DLL的ATL/COM EXE服务器 我有一个C++实现的应用程序。该应用程序有一个插件API,您可以在其中编译dll并将它们放到某个位置,它们将在主机应用程序启动时自动加载到主机应用程序中,自定义功能
是否有一种方法可以使用ATL编译dll,使插件dll将应用程序“转换”为COM exe服务器 如果是inproc服务器,但不是inproc,则以下ATL属性代码可以工作:如何实现C++;通过插件DLL的ATL/COM EXE服务器 我有一个C++实现的应用程序。该应用程序有一个插件API,您可以在其中编译dll并将它们放到某个位置,它们将在主机应用程序启动时自动加载到主机应用程序中,自定义功能,c++,winapi,dll,com,atl,C++,Winapi,Dll,Com,Atl,是否有一种方法可以使用ATL编译dll,使插件dll将应用程序“转换”为COM exe服务器 如果是inproc服务器,但不是inproc,则以下ATL属性代码可以工作: [module(dll, ...)]; 对于exe服务器,我需要: [module(exe, ...)]; 但是,编译器在这方面给了我错误,因为我实际上在编译dll,所以我不得不使用以下命令: [module(unspecified, ...)]; 这编译得很好,“未指定”选项的MSDN说明: 禁用与模块属性相关的ATL
[module(dll, ...)];
对于exe服务器,我需要:
[module(exe, ...)];
但是,编译器在这方面给了我错误,因为我实际上在编译dll,所以我不得不使用以下命令:
[module(unspecified, ...)];
这编译得很好,“未指定”选项的MSDN说明:
禁用与模块属性相关的ATL代码的注入:
注入ATL模块类、全局实例_ATL模块和条目
点函数。。。
项目中的属性
那么,首先,是否有可能通过插件dll将exe写入COM服务器?第二,如果是这样的话,为了使项目正常工作,应该向项目中添加什么样的“ATL模块类、全局实例_AtlModule和条目函数”
- 该应用程序是标准的windows应用程序,因此其主要 入口点是一个WinMain()函数李>
- 插件dll将延迟加载, 所以它不是即时加载exe
我有点业余,COM/ATL文档太深,太大,太宽,我甚至不知道从哪里开始。
< P>属性被扩展成C++代码(顺便说一下,可以在项目设置中更改设置,并将生成的代码保存到文件中供查看)。code>[module(exe,…将您作为要从中继承的附加基类,然后[module(dll,…
将您作为CAtlDllModuleT
。然而,区别不仅仅在于基类,这解释了为什么您不能如此轻松地切换
问题是:C++代码看起来很酷,但后来被贬低了。它仍然是用来建立遗留项目的,但应该保持清晰。
如果项目相对较小,最好是去掉属性。这是非常可行的,因为您可以快速开始使用预处理器生成的扩展非属性代码。另一方面,这可能不像听起来那么容易,因为属性有助于实现COM,而不必过多考虑IDL文件,它们是如何构建的o项目等。如果您负担得起剥离属性,那么您希望这样做
然后,第二步是了解ATL DLL服务器和ATL EXE服务器之间的差异。最简单的方法是使用向导生成两个空项目并比较代码。您需要将相同的差异镜像到项目中,将其从DLL转换为EXE。了解这些差异,最简单的方法可能是usi正在删除新的ATL EXE项目,并从旧项目导入相关的源代码文件
如果您更喜欢使用属性,也许您还是希望从空项目开始,但是我想您需要旧的Visual Studio,因为此选项很久以前就被删除/隐藏了。要创建新的属性化项目,我想,您需要VS 2005或2008。您可以按照自己的要求进行操作(通过第三方支持为exe添加COM支持),但这会很困难,而且很多工具对您并没有帮助
我正在制作第二版,它解释了ATL在封面下为您所做的事情
所有COM服务器都必须支持注册,必须公开类对象,并管理其生存期
我们将在注册部分进行一些快速和松散的操作,因为标准方法使用一些命令行选项调用可执行文件,这显然不适合您。您可以让插件DLL在用户配置单元中自动注册CLSID(有关详细信息,请参阅)-这将避免提升问题。注册有点棘手,因为您需要为exe服务器设置注册密钥,但需要从dll进行设置
加载插件时,插件将调用以公开类对象,卸载插件或应用程序终止时调用
请注意,您需要在exe启动后“很快”调用CoRegisterClassObject
EXE服务器的生命周期管理有点快和松-在发布最后一个引用时,您可能(也可能不)希望卸载主机应用程序
一旦实现了这一点,您就可以毫无困难地使用ATL的cMobject,我相信您可以使用CoRegisterClassObject的ATL对象映射。因此您有两个应用程序,A(带有插件API)和B(很有趣)。你想为a编写一个调用B的插件DLL。对吗?如果是这样,你想做的是使B成为一个exe COM服务器,然后为a编写一个单独的插件DLL,该插件DLL将协同创建实例B(作为进程外服务器),然后调用B。不,这是另一种方式。我有应用程序a(带有插件API)我想为a编写一个插件DLL,使a成为COM exe服务器,这样B就可以调用CoCreateInstance a作为进程外服务器。