문제

우리는 클라이언트 측면에서 비교적 복잡한 응용 프로그램 (ActiveX / .NET / Delphi / C ++ / COM)을 SXS를 사용하여 비 관리자 배포 및 구형 버전의 제품에서 격리하는 것을 달성하고 있습니다.

우리는 .NET UI, Delphi UI 및 Proc에서 사용하는 COM 서버와 같은 거의 모든 Proc 구성 요소에 대해이 목표를 달성 할 수있었습니다. 구성 요소의 클라이언트 (거의).

그리고 현재 거의 부분이 있습니다. 현재, 우리의 응용 프로그램은 CLECTION SERVER (Delphi ActiveX EXE)에서 (C ++ 부분에서) 호출하여 PROC ActiveX 서버 (Third Party Plugins,) 중 다른 세트를 호출합니다. 어떤 일이 여기에 있습니다, Delphi, C ++, Proc ActiveX Exe가없고 인터페이스를 구현하는 한 모든 것이 있습니다).

우리가 아는대로 SXS는 Proc ActiveX 서버에서 지원하지 않습니다. 그리고 우리는 주요 프로세스의 Proc Com 서버에서와 같이 이러한 객체를 사용할 수 없습니다. 응용 프로그램의 주요 재 작성과 최악의 경우 API 인 API가 사용하는 대중이 직면 한 API의 중단이 필요하기 때문입니다. 우리가 허용 할 수없는 브레이크.

우리는 우연히 발견되었습니다 이 기사 이는 별도의 프로세스에서 실행되는 인터넷 익스플로러 창에서 ihtmldocument2를 추출 할 수있는 방법을 설명합니다. 우리는이 접근법을 생각하게 만들었습니다.

프로세스 서버에서와 같이 ActiveX를 실행하는 2 차 위성 응용 프로그램 / 프로세스를 생성합니다. 그러면 우리는 사용할 것입니다 lresultfromobject 그리고 Objectfromlresult 위성 응용 프로그램에서 ActiveX 객체의 참조를 기본 응용 프로그램 프로세스로 전송합니다. 위성 애플리케이션에는 SXS 모드에서 실행할 수있는 자체 매니페스트 파일이 있습니다.

이 Delphi Activex EXE와 제 3 자 ACIVEX EXE 플러그인간에 통신하기 위해 동일한 접근 방식이 취해집니다.

위의 제안 된 솔루션보다 선호하지 않는 대체 솔루션이 있습니다. 위의 제안 된 솔루션을 선호하는 .NET Remoting 및 .NET COM 프록시 클래스를 사용하여 COM 요청을 .NET으로 변환하여 두 프로세스간에 통신 채널을 열어줍니다. 두 번째 프로세스에서 원격으로 COM으로 돌아갑니다.

그래서 여기에 질문이 있습니다.

  1. 이 접근법에 대해 어떻게 생각하십니까?
  2. 문제에 대한 더 나은 해결책이 있습니까?
도움이 되었습니까?

해결책

할 수 있습니다. 필요한 것 :

  • 응용 프로그램은 COM에 의존하지 않고 서버 자체를 시작해야합니다. 레지스트리에서 제공 한 추가 간접이 필요하지 않으며 CreateProcess () 만 사용하십시오.
  • 서버는 CoregisterClassObject ()를 사용하여 클래스 공장을 메인 () 메소드에 등록해야합니다.
  • 중요 : 각 공장에 사용하는 CLSID는 각 서비스 인스턴스에 대해 고유 한 것으로 변경되어야합니다. 이를 통해 클라이언트가 올바른 서버에 연결할 수 있습니다. 나는 단순히 클래스 공장 clsid와 함께 프로세스 ID를 xor입니다. 클라이언트는 프로세스 ID도 알고 있으므로 동일한 변경을 수행 할 수 있습니다.
  • 응용 프로그램은 객체 공장이 나타날 때까지 기다리기 위해 수면 () 호출이있는 루프로 CocreateInstance ()를 호출해야합니다. 최소 60 초가 지나갈 때까지 실패를 선언하지 마십시오.
  • 응용 프로그램과 서버는 모두 포함하는 매니페스트가 필요합니다. <file> 각 프록시/스터브 DLL에 대한 요소 및 <comInterfaceExternProxyStub> 원격으로 된 각 인터페이스의 요소.

다른 팁

알렉스

Nobugz가 맞습니다. 실행중인 객체 테이블에 액세스하여 현재 델파이 자동화 EXE의 현재 실행중인 프로세스에서 COM 객체 인스턴스를 만들 수 있습니다.

그러나 나는 설명 할 수없는 큰 문제를 발견했다. 이런 방식으로 작업 할 때 변형 디스패치 방법을 통해서만 객체에 액세스 할 수 있습니다.

기본적으로 내 활성 x exe가 등록되지 않은 경우, 인터페이스를 통해 객체를 인스턴스하려고하면 "인터페이스가 지원되지 않음"오류가 발생합니다.

WebUpdate : iautomation;

WebUpdate : = CoAutomation.Create; <- 작동 오류가 아닙니다


WebUpdate : 변형;

webUpdate : = createOleObject ( 'webUpdate.Automation'); <- 잘 작동합니다

regserver를 사용하여 활성 X exe를 등록하면 문제가 사라집니다 !!

그림을 이동!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top