我有一个用 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'下运行)。第二个客户端将连接到由登录用户实例化的那个(“第二个”)。
在网上搜索了无数论坛后,我设法得出以下结论:
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 服务器“单处理”?
谢谢!
暗里