Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何实现C++;通过插件DLL的ATL/COM EXE服务器 我有一个C++实现的应用程序。该应用程序有一个插件API,您可以在其中编译dll并将它们放到某个位置,它们将在主机应用程序启动时自动加载到主机应用程序中,自定义功能_C++_Winapi_Dll_Com_Atl - Fatal编程技术网

如何实现C++;通过插件DLL的ATL/COM EXE服务器 我有一个C++实现的应用程序。该应用程序有一个插件API,您可以在其中编译dll并将它们放到某个位置,它们将在主机应用程序启动时自动加载到主机应用程序中,自定义功能

如何实现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

是否有一种方法可以使用ATL编译dll,使插件dll将应用程序“转换”为COM exe服务器

如果是inproc服务器,但不是inproc,则以下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作为进程外服务器。