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에서 서버를 초기화하는 방법과 다음과 같은 문제를 건너 뛸 수 있도록 조언을 줄 수 :
- 를 수행하지 가까운
- 서버 중 오류가 있습니다 서버 응용 프로그램의 다른 인스턴스를 시작하지 수동으로 클라이언트를 시작했습니다 -이 문제는 내가 서버를 초기화하는 스레드를 사용할 때 온다
'CoUninitialize'를 세 번하면 'Coinitialize'를 세 번해도 안됩니까? 누군가 당신 앞에서 그것을했고 다른 CoUninitialize는 단지 감소 할 것이고 당신의 경우에는 MTA를 완전히 종료시킬 것입니다 ... –
시나리오 1이 너무 잘못되어 더 이상의 고려가 필요하지 않습니다. Delphi의 COM 인프라에서 공동으로 초기화하는 것입니다. – Medinoc
이것은 파이프를 설치하기 위해 빌딩 아래에 3 개의 파운데이션을 불어내는 것과 같습니다. –