2011-03-04 3 views
0

정상적인 응용 프로그램에서 제대로 작동하는 플러그인 세트를 작성했습니다. 하지만 서비스 응용 프로그램에서 사용하려고하면 서비스가 CreateComObject 기능에 도달하면 서비스가 중지됩니다. 서비스 응용 프로그램에서 COM 플러그인을 사용할 수 있습니까?서비스 응용 프로그램 및 com 플러그인

procedure TWCMService.CreateControllerList; 
var 
    List: TAutoFreeList<TController>>; 
    i: integer; 
    Plugin: IPluginInterfaces; 
begin 
    try 
    List := TAutoFreeList<TController>.Create; 
    DatabaseModule.IBDatabase1.Connected := true; 
    DatabaseModule.SelectControllers(List); 
    DatabaseModule.IBDatabase1.Connected := false; 
    Plugin := CreateComObject(StringToGuid('{F2959AEC-644F-49E4-9012-B9B3BF34B43F}')) as IPluginInterfaces; 
    for i := 0 to List.Count - 1 do 
     begin 
     Plugin.Init(StringToGuid(List[i].PluginId)); 
     FAvailControllers.Add(CreateComObject(Plugin.GetCommunicationPluginGuid) as ICommunicationPlugin); 
     FAvailControllers[i].Init(Self as IServiceApplication); 
     FAvailControllers[i].SetMAC(List[i].ControllerMAC); 
     MessageBox(0, 'Dodany', 'Uwaga', MB_OK); 
     end; 
    List.Free; 
    FAvailControllersCurrentIndex := 0; 
    Timer1.Enabled := true; 
    except 
    raise Exception.Create('WCM Serwis: Error Message'); 
    end; 
end; 
+1

코드를 올바르게 포맷하십시오. 붙여 넣기를 선택하고 {} 버튼을 클릭하십시오. –

답변

3

안된 그냥 내 머리 위로 떨어져 ... 당신은 아마 당신이 COM (으로 CoInitialize를 호출)를 초기화 할 필요가 있음을 발견 할 것이다, 이것은 일반적으로 윈도우 응용 프로그램과 함께 당신을 위해 수행 (: 이 코드 응용 프로그램에서 실행 또는 체인 위로 올라가십시오.) 서비스 애플릿으로이 작업을 수행하지 않았 으면 직접 처리해야합니다.

0

위에서 말한 것처럼 COM이 초기화되었는지 확인해야합니다. 그러나 그것이 주된 이유가 아닐 수도 있습니다.
Interbase를 사용 중이며 데이터베이스에 연결할 때 네트워크를 통해 데이터베이스 서버와 통신 중일 수 있습니다. (DB가 동일한 시스템에 있더라도!) 그러나 Windows 서비스에는 기본적으로 네트워크 액세스가 없으므로 서비스에 네트워크 기능에 대한 종속성을 추가해야합니다.
문제는 in this question과 같을 수 있으므로이 사본이 중복됩니다!

0

보안과 관련 될 수 있습니다. 운영 체제에 따라 다릅니다. 서비스는 다른 계정으로 실행될 수 있습니다. 이 계정의 권한으로는 원하는 COM 개체를 만들지 못할 수 있습니다. 그냥 추측 해.

+0

고맙습니다. 해결책은 간단했습니다. CoinitializeEx (nil, COINIT_APARTMENTTHREADED)를 OnServiceStart 이벤트에 삽입하고 OnServiceStop 이벤트를 초기화해야했습니다. –

0

문제는 내가 경험 한 것과 유사 할 수 있습니까? EIntfCastError 'Interface not supported' when run as a TServiceApplication

내가 tmSingle에서 tmApartment에 스레딩 모델을 변경, 즉 TComObjectFactory.Create를 오브젝트를 작성할 때. 그런 다음 서버를 등록 취소하고 다시 등록했습니다. 프레스토 악장! 왜 잘 모르겠지만 그것은 나를 위해 작동합니다.

+0

죄송합니다, 아래에 귀하의 의견을 놓친 작동했다. – Lars

관련 문제