2013-08-20 2 views
0

UI가있는 독립 실행 형 응용 프로그램에서 MTA로 실행되는 독립 프로세스 서버가 있습니다.Out of Process MTA 문제의 COM 서버

서버는 다음과 같은 방법으로 초기화됩니다.

난 그냥에 연결된 모든 클라이언트없이 가까운 다음 응용 프로그램을 시작하고 1

initialization begin 
    CoUninitialize; 
    CoUninitialize; 
    CoUninitialize; //i have to call it three times to be able to initialize the MTA 
    OLECHECK(ComObj.CoInitializeEx(nil, COINIT_MULTITHREADED)); 
    TAutoObjectFactory.Create(ComServer, MyServer, 
    Class_MyServer,ciMultiInstance, tmFree); 
end; 

시나리오. 다음과 같은 오류가 발생하는 동안 : Runtime error 216 at 00408A2E 추적 할 수 없어서 COM과 관련이있는 것으로 보이고 잘못된 것으로 생각합니다.

는 오류가 나는 STA에 서버를 초기화 발생하지 않는 경우

initialization begin 
    TAutoObjectFactory.Create(ComServer, MyServer, 
     Class_MyServer,ciMultiInstance, tmSingle); 
end; 

나는 또한 초기화 섹션에서 스레드를 생성하고 Thread.execute에서 서버를 만들려고하고있다 한 2

시나리오 닫는 동안 오류는 발생하지 않지만 클라이언트는 서버의 첫 번째 인스턴스를 찾지 않고 대신 다른 인스턴스를 활성화합니다.

procedure TDCOMThread.Execute; 
var dwReturn:DWORD; 
    Msg:TMsg; 
    H:THandle; 
begin 
    OleCheck(ComObj.CoInitializeEx(nil, COINIT_MULTITHREADED)); 
    TAutoObjectFactory.Create(ComServer, MyServer, 
     Class_MyServer,ciMultiInstance, tmFree); 
    H:=EVentStop.Handle; 
    while true do 
    begin 
     dwReturn:=MsgWaitForMultipleObjects(1,H,false,200,QS_ALLINPUT); 
     case dwReturn of 
     WAIT_OBJECT_0: break; 
     (WAIT_OBJECT_0+1): begin 
      while PeekMessage(msg,0,0,0,PM_REMOVE) do 
       Dispatch(Msg); 
     end; 
     WAIT_TIMEOUT:begin 
          while PeekMessage(msg,0,0,0,PM_REMOVE) do 
          Dispatch(Msg); 
         if Terminated then 
         break; 
         end; 
     WAIT_FAILED:begin 
       break; 
     end; 
     WAIT_ABANDONED: 
     begin 
      break; 
     end; 

     end; 
    end; 
    CoUninitialize; 
end; 

초기화 섹션

initialization begin 
     EVentStop:=Tevent.Create(true); 
     EVentStop.ResetEvent; 
     DThread:=TDCOMThread.Create(true); 
     DThread.Resume; 
    end; 

어떻게 MTA에서 서버를 초기화하는 방법과 다음과 같은 문제를 건너 뛸 수 있도록 조언을 줄 수 :

  1. 를 수행하지 가까운
  2. 서버 중 오류가 있습니다 서버 응용 프로그램의 다른 인스턴스를 시작하지 수동으로 클라이언트를 시작했습니다 -이 문제는 내가 서버를 초기화하는 스레드를 사용할 때 온다
+0

'CoUninitialize'를 세 번하면 'Coinitialize'를 세 번해도 안됩니까? 누군가 당신 앞에서 그것을했고 다른 CoUninitialize는 단지 감소 할 것이고 당신의 경우에는 MTA를 완전히 종료시킬 것입니다 ... –

+4

시나리오 1이 너무 잘못되어 더 이상의 고려가 필요하지 않습니다. Delphi의 COM 인프라에서 공동으로 초기화하는 것입니다. – Medinoc

+0

이것은 파이프를 설치하기 위해 빌딩 아래에 3 개의 파운데이션을 불어내는 것과 같습니다. –

답변

0

시나리오 2에서 새로 만든 팩토리에서 RegisterClassObject를 호출 해 봅니다. 공장에서 메인 스레드로 생성 된 경우 - RegisterClassObject가 자동으로 호출됩니다.

+1

나를 '옵션 2'로 대답하는 것처럼 보입니다. –

+0

저는 CoRegisterClassObject와 CoRevokeClassObject를 사용하여 몇 달 전에 그것을 풀었습니다. 정확하게 똑같아서 나는 대답을 유효한 것으로 받아 들일 것이다. – danisius