我遇到了导出COM对象的ATL服务的问题。它作为本地服务运行,但作为Windows服务运行时,我无法连接。该服务正确启动并运行,但我的客户端(下面的代码)总是失败并显示错误“无法启动服务”。
所以我们正在看同样的事情,我已经整理了一个最小的项目,可以在我的电脑上重现这个问题。
文件 - >新项目
Visual C ++ - > ATL“ATL项目”
名称:“MyService”
在“应用程序设置”下,选择“服务(EXE)”
转到“课堂视图”
右键单击“MyService”并添加 - >类
选择:“ATL简单对象”
短名称:“MyObject”
转到“解决方案视图”
右键单击“解决方案'MyService'”并添加 - > “新项目”
这将是一个“Visual C ++” - > “Win32”“Win32控制台应用”
名称:“MyClient”
选中“为ATL添加公共头文件”框
在client.cpp中,使用以下代码:
#include "stdafx.h"
#import "../MyService/Debug/MyService.tlb"
#include <iostream>
using namespace MyServiceLib;
int _tmain(int argc, _TCHAR* argv[])
{
::CoInitialize( NULL );
try
{
IMyObjectPtr spQueue( __uuidof( MyObject ) );
}
catch( const _com_error& Err )
{
std::wcout << L"Error: " << Err.ErrorMessage() << std::endl;
}
catch( ... )
{
std::wcout << L"Unexpected Error" << std::endl;
}
::CoUninitialize();
std::wcout << L"Finished" << std::endl;
return 0;
}
打开“项目依赖关系”
项目“MyClient”取决于“MyService”
构建解决方案。
在命令提示符下,运行以下命令:
我的服务/服务
net start MyService
客户
答案 0 :(得分:1)
您是否在应用MyClient中选择了“为ATL添加公共头文件”选项? 这个在我的测试中运行良好。
将服务运行在您的用户帐户(默认为系统帐户),以便在调试IDE中进行访问。
好锁。
答案 1 :(得分:0)
您可能需要在progid下创建其他注册表项。 我不知道你在哪里称'CoInitializeSecurity'
微软提供了一个例子 http://msdn.microsoft.com/en-us/library/3ts2dxc8.aspx
-
迈克尔
答案 2 :(得分:0)
ATL注册表模板中存在一个错误(Visual Studio 2008/2010)。组件的.rgs文件缺少AppID值,如this MSDN blog
中所述在MyObject.rgs中的&#39; TypeLib ...&#39; 行上方添加以下行
val AppID = s '%APPID%'