2009-01-20 3 views
0

COM 개체를 내보내는 ATL 서비스에 문제가 있습니다. 로컬 서비스로 실행되지만 Windows 서비스로 실행될 때는 연결할 수 없습니다. 서비스가 올바르게 시작되고 실행되지만 내 클라이언트 (아래 코드)는 항상 "서비스를 시작하지 못했습니다."오류로 실패합니다.클라이언트가 ATL 서비스와 통신하지 않습니다.

우리는 똑같은 것을보고 있으며,이 문제를 내 PC에서 재현 할 수있는 최소한의 프로젝트를 작성했습니다.

파일 -> 새 프로젝트
비주얼 C++ -> ATL "ATL 프로젝트"
이름 : "이면 MyService"응용 프로그램 설정에서
선택 "서비스 (EXE)"

로 이동 "클래스보기 이면 MyService "
마우스 오른쪽 클릭" "및 추가 -> 클래스
선택 :"ATL 단순 개체 "
짧은 이름을"MyObject를 "

로 이동 "솔루션보기"
마우스 오른쪽 버튼으로 클릭 "솔루션 '이면 MyService'"를 추가 - 이것은 "비주얼 C++"입니다> "새 프로젝트"
을 -> "는 Win32" "Win32 콘솔 Applicaion"
이름 :

#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"
확인 client.cpp에서 "ATL에 대한 일반적인 헤더 파일을 추가"상자

,이 코드를 사용3210 프로젝트 "MyClient"는 "MyService"에 종속됩니다.

솔루션을 빌드하십시오. 명령 프롬프트에서


실행 다음 명령을
이면 MyService/서비스
순 시작이면 MyService
클라이언트

답변

1

당신은 옵션 "공통 헤더 파일을 추가합니다 : ATL"을 선택합니까 응용하여 MyClient에를? 이 테스트는 잘 작동합니다.

사용자 계정 (기본값은 시스템 계정)에서 실행중인 서비스를 디버깅 IDE에서 액세스 할 수 있도록 설정합니다.

잠금 해제.

0

progid에서 추가 레지스트리 항목을 만들어야 할 수 있습니다. ATL의 레지스트리 템플릿 버그 (비주얼 스튜디오 2008가있다 마이클

0

- 당신이 http://msdn.microsoft.com/en-us/library/3ts2dxc8.aspx

에 '으로 CoInitializeSecurity'

Microsoft는 예를 공급 요구하고 어디는 표시되지 않습니다 /2010). 그.상기 다음 행을 추가 this MSDN blog

에 설명 된 구성 요소 RGS 파일은 AppID에 값을 누락 "의 TypeLib ... 'MyObject.rgs에 라인

val AppID = s '%APPID%' 
관련 문제