Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/visual-studio-2010/4.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++ ATL COM类的单个实例_C++_Visual Studio 2010_Com_Atl - Fatal编程技术网

C++ ATL COM类的单个实例

C++ ATL COM类的单个实例,c++,visual-studio-2010,com,atl,C++,Visual Studio 2010,Com,Atl,我有一门COM课程。它可以由我自己以外的进程访问。每个进程都创建自己的类实例。有没有一种方法可以使COM对象在创建它的所有进程之间共享 COM单身汉是我唯一想到的。但是,我没有使用它的任何经验。我继承的代码库通过在COM项目中声明一个静态“实现”实例来实现这一点 COM类只是提供了一个到该实例的接口。通过这种方式,COM类的多个实例有效地提供了对COM服务器中的单例实现对象的访问 请注意,这通常需要同步构造。COM进程外服务器中的单例。如果服务器已经在DLL中实现,请考虑使用COM+将其配置为进

我有一门COM课程。它可以由我自己以外的进程访问。每个进程都创建自己的类实例。有没有一种方法可以使COM对象在创建它的所有进程之间共享


COM单身汉是我唯一想到的。但是,我没有使用它的任何经验。

我继承的代码库通过在COM项目中声明一个静态“实现”实例来实现这一点

COM类只是提供了一个到该实例的接口。通过这种方式,COM类的多个实例有效地提供了对COM服务器中的单例实现对象的访问


请注意,这通常需要同步构造。

COM进程外服务器中的单例。如果服务器已经在DLL中实现,请考虑使用COM+将其配置为进程外。这样,您将两全其美。

CreateInstance(…,CLSCTX_服务器,…)会完成同样的任务吗?基本上,实例位于服务器端,客户端只连接到它?如果它位于DLL中,则不会失败。CLSCTX_服务器意味着存在独立的EXE服务器,并且可以作为进程运行。COM+是你的朋友。DECLARE\u CLASSFACTORY\u SINGLETON是答案吗?是否允许一个实例在我的C++代码和客户端JScript代码之间生存?@汉斯,我的不理解是DeCurrasCultFythySyStLeNon违反了ICLASTFACK::CREATIN()和COM的身份规则,并且它应该不包含在ATL中。我看到唐·博克斯在1999年的TechEd中表现得最好,当时他在数百名观众面前,以他标志性的戏剧风格,打开程序文件中的ATL源文件,并立即删除了宏定义。除非微软能解决这个问题,但我相信这是一个根本性的问题。或者,除非Box是错的,这在COM中并不经常发生。我不记得所有的细节。将DECLARE_CLASSFACTORY_SINGLETON与这个答案中的方法进行对比。使用DECLARE_CLASSFACTORY_SINGLETON,您的CreateObject()将在每次被请求时向COM提供相同的COM接口指针。它对COM撒谎,它需要一个指向新COM对象的新指针。在这个解决方案中,有一个单例,但是CreateObject提供了新的COM对象,为COM客户机包装单例非COM对象。这种方法确实尊重COM规则。COM对象是独立的,并且遵循COM的生存期规则;他们都调用共享对象与COM无关。我确实有一个EXE,其中定义了我的COM对象。将有一些JScript实例化对象(或者获取对象的引用,如果已经存在)并使用它。在my EXE中,大型代码(C++)将创建或获取对已存在对象的引用。