客户不会与ATL服务部门联系

时间:2009-01-20 17:38:30

标签: c++ com service atl

我遇到了导出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
客户

3 个答案:

答案 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%'