【发布时间】:2011-06-26 13:41:10
【问题描述】:
我有一个用 C++ 编写的 ATL exe 服务器(Visual Studio 2010,合并了 proxy-stud dll)。该可执行文件针对 Windows 7 x86 和 x64 编译。两种架构都会发生以下情况:
ATL exe 服务器应该充当“服务器进程”,也就是说 - 每台机器应该存在一个进程(MyATLServer.exe,只有一个!),并且许多客户端(让我们保持简单:在同一台机器上)正在消耗来自它的 COM 对象。服务器保存应用程序状态(在内存中),所有客户端都应该使用服务器公开的 COM 对象“共享”这个状态。
exe 服务器通常在系统启动时启动,因为它由 COM 调用调用以创建它的托管对象之一。该调用源自 spoolsv.exe 进程(打印后台处理程序服务)。这会导致服务器进程在“SYSTEM”用户下运行(我猜是因为 spoolsv.exe 使用“SYSTEM”运行)。
当其中一个客户端从 ATL 服务器创建一个 COM 对象时,另一个进程(又是 MyATLServer.exe)被实例化(在登录到 Windows 的用户下运行),因此它不能与“原始”共享应用程序状态" 一个(在 'SYSTEM' 下运行)。第二个客户端将连接到由登录用户实例化的那个(“第二个”)。
在 WEB 上搜索了无数论坛后,我设法得出以下结论:
1) 我的 ATL 服务器使用默认的(由 VS2010 自动生成的)ATL-Module,它继承自 ATL::CAtlExeModuleT。深入研究 ATL 标头,我确信该模块调用 AtlComModuleRegisterClassObjects 时使用了正确的标志(dwClsContext = CLSCTX_LOCAL_SERVER,标志 = REGCLS_MULTIPLEUSE | REGCLS_SUSPENDED)。所以它排除了这个。
2) 使用 start -> run -> dcomcnfg -> DCOM Config -> MyATLServer -> Properties 我在“身份”选项卡下设置了“此用户”选项(使用本地管理员用户)。在“位置”选项卡中,未选中“在此计算机上运行应用程序”选项并显示为灰色。这让我再次搜索,我来到了这里:http://social.technet.microsoft.com/Forums/en-US/w7itprosecurity/thread/4f63ee11-e472-40f9-85db-a6b235d7579c。 该链接说明 dcomcnfg 实用程序的 x64 版本存在错误,应该在 x64 Windows 上使用它的 32 位版本(开始->运行->'mmc comexp.msc /32')。在两个系统(每个系统)上检查后,我发现“在这台计算机上运行应用程序”选项是灰色的,并且在两个系统上都没有选中。
从这一点开始,我完全迷失了(并试图抑制挫败感...... :-))。 我在正确的道路上吗?以前有人这样做过吗?
或者最初的意图 - 如何让我的 ATL exe 服务器“单处理”?
谢谢!
暗里
【问题讨论】:
-
顺便说一句 - 我也使用 DECLARE_CLASSFACTORY_SINGLETON() 宏作为记录。
-
您好 omrisela,我正在寻找类似的信息。我想知道如何从 catlservicemodulet 中引用我的 com 单例。我想调用 singleton::start、stop、pause in on pause、灌输处理程序,但我不知道如何获取指向单例的指针或引用...
标签: visual-studio-2010 com process atl single-instance