2012-10-18 3 views
1

COM 인터페이스를 기존 응용 프로그램에 추가하려고합니다 (Win32를 사용하여 C++로 작성 됨). 나는 을 사용하여 COM 객체를 사용하므로 인터페이스의 기본 COM 개념 등을 알고 있지만 실제로 컴포넌트를 구현하는 것은 이번이 처음입니다.기존 응용 프로그램에 COM 인터페이스 추가 (EXE)

궁극적으로 나는 VB와 같은 스크립트에서 내 응용 프로그램을 자동화하기 위해 COM 인터페이스를 사용할 수 있기를 원합니다.

  1. 내 응용 프로그램은 out-of-process 서버 (즉, MIDL을 사용해야하고 프록시 DLL과 스텁 DLL에 대한 코드를 생성해야 함)로 작동해야합니다.
  2. 일단 서버가 생기면 IDispatch 인터페이스를 구현하여 자동화 기능을 추가 할 수 있습니다.

MIDL과 함께하는 서버 인 EXE와 그 이후의 상황이 조금 가파르므로 IDPatch로 이동하기 전에 모든 것을 먼저 파악하고 싶습니다.

Dale Rogerson이 "Inside COM"이라는 책을 읽고 EXE 서버를 장 완료했습니다 (다음 장에서는 자동화에 대해 다룹니다).

"EXE 서버"장에서는 서버와 클라이언트를 구현하는 예제 코드를 제공합니다. 그러나 서버를 수동으로 시작해야합니다. 이것은 나를 혼란스럽게합니다. 분명히, 내 응용 프로그램 (= 서버)이 클라이언트 프로세스에 의해 사용될 때,이 여분의 수동 단계가 필요하지 않아야합니다. 자동으로 서버를 시작하는 메커니즘이 있습니까? 또는이를 달성하기 위해 자동화가 필요합니까? 현재, 수동으로 서버를 시작해야한다는 전망은 내가 올바른 방향으로 움직이고 있는지 의심 스럽습니다.

더 많은 지식이있는 사람이 누락 된 정보를보고 올바른 방향으로 나를 가리켜 주길 바랍니다.

답변

1

아니요, COM 서버는 일반적으로 수동으로 시작되지 않습니다. COM이 자동으로 EXE를 시작할 수 있도록하는 데 필요한 레지스트리 키에 대해 이야기하는 것을 피하기 위해 책이 제안한 이유를 잘 모릅니다. 그렇지 않으면 매우 복잡하지는 않습니다. 응용 프로그램의 Application coclass를 EXE에 대한 경로를 제공하는 LocalServer32 키 값으로 등록하십시오.

그러나 기존 프로그램에서는 특히 드물지 않습니다. 하나의 디자인 결정은 클라이언트 코드가 프로그램을 완전히 제어하도록할지 여부입니다. 또는 프로그램에 이미 기존 사용자 인터페이스가 있지만 다른 코드에 서비스를 노출하려는 경우에도 마찬가지입니다. 후자의 경우 사용자가 일반적으로하는 것처럼 손으로 앱을 시작하도록하는 것이 좋습니다.

1

응용 프로그램이 LocalServer32으로 등록되면 실행 프로세스가 CLSID에 대한 팩토리 개체를 아직 등록하지 않은 경우 지정된 명령 줄을 사용하여 호출됩니다.

이 방법을 사용하면 응용 프로그램이 이미 실행중인 경우이 인스턴스가 서버 측을 제공 할 수 있고, 그렇지 않은 경우 시작될 수 있습니다.

자동화가 완전히 직각입니다. 구성 요소는 IDispatch을 구현하여 자동화와 호환됩니다.