2009-01-20 4 views
0

У меня проблема с службой ATL, которая экспортирует COM-объект. Он работает как локальная служба, но при работе в качестве службы Windows я не могу подключиться. Служба запускается правильно и запускается, но мой клиент (код ниже) всегда терпит неудачу с ошибкой «Не удалось запустить сервис».Клиент не будет разговаривать с службой ATL

Итак, мы смотрим на одно и то же, я собрал минимальный проект, который воспроизведет эту проблему на моем ПК.

File-> New Project
Visual C++ -> АТЛ "АТЛ Проект"
Название: "MyService"
В разделе Настройки приложения выберите "Сервис (EXE)"

Перейти к «Класс View "
правой кнопкой мыши на "MyService" и Add -> Class
выберите: "ATL Simple Object"
Краткое название: "MyObject"

Перейти к "Решение View"
правой кнопкой мыши "Solution 'MyService'" и Add -> "New Project"
Это будет "Visual C++" -> "Win32" "Win32 Console Приложеиние"
Имя: "MyClient"
Проверьте "Добавить общие файлы заголовков для АТЛ" окно

В 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»

Построить решение.

В командной строке выполните следующие команды:
MyService/Сервис
чистый старт MyService
клиент

ответ

1

Вы выберите опцию «Добавить общие файлы заголовков для: АТЛ» в приложении MyClient? Это хорошо работает в моем тесте.

Включить службу, запущенную в вашей учетной записи пользователя (по умолчанию - системная учетная запись) для доступа к отладке IDE.

Хороший замок.

0

Там ошибка в шаблонах АТЛ реестра (Visual Studio 2008/2010). .RGS файл для компонента отсутствует значение AppID, как описано в this MSDN blog

Добавьте следующую строку выше 'TypeLib ... линии в MyObject.rgs

val AppID = s '%APPID%'