2013-02-19 5 views
3

필자는 Delphi 2010에서 소매 응용 프로그램의 플러그인 역할을하는 작은 COM 서버를 작성했습니다. 소매 응용 프로그램은 각 인터페이스에 대해 TAutoObjectFactory.Create을 호출하는 추가 인터페이스를 등록하는 "발견"인터페이스를 찾습니다. 이것은 잘 작동하고 있습니다 - 모든 플러그인 인터페이스는 설계된대로 작동합니다.ComClass를 찾았습니다. 이제 어떻게 참조 할 수 있습니까?

하지만 지금은 코드를 복제 할 필요가 없도록 다른 인터페이스에서 공용 인터페이스를 공용 메서드라고 부릅니다. 간단하게 보입니다. 사용하고자하는 인터페이스의 ClassID를 찾으려면 ComClassManager.ForEachFactory으로 전화하십시오. 그 일을 너무했습니다!

하지만 클래스를 찾았으므로 이제는 그 방법 중 하나를 호출하기 위해 찾은 클래스 (또는 클래스 참조?)를 사용하거나 캐스트하는 방법과 같이 사소한 최종 단계로 인해 어려움을 겪습니다.

ForEachFactory으로 전송 한 "FactoryProc"에서 TComObjectFactory의 ComClass 속성을 사용한다고 가정하지만 TClass는 실제 클래스 개체에 대한 클래스 참조 (at 적어도 나는 이것을 올바르게 이해하고 있기를 바란다). 클래스 참조에 약간 희미합니다.이 속성을 캐스팅하거나 다른 방식으로 참조 해제하려고하면 액세스 위반 또는 컴파일러 오류가 발생합니다.

제안 사항?

+0

ComClassManager에 클래스 참조 목록이 있지만 런타임에 생성 된 실제 개체 목록이 없는지 궁금해졌습니다. 아마도 그 이유는 ComClass를 객체로 사용하려고 할 때 액세스 위반이 계속 발생하기 때문입니다. 그것은 결국 ComObjectManager가 아니라 "ComClassManager"라고합니다 ... –

답변

3

귀하의 의견에 맞습니다. ComClassManager은 인스턴스가 아닌 클래스를 처리합니다. 필요한 것은 (응용 프로그램 로컬 구현) running object table (또는 이와 비슷한)이므로 플러그인 인스턴스가 서로 상호 작용할 수 있습니다.

실제로 구현하는 방법은 실제로 필요한 부분에 달려 있습니다. 실행중인 모든 인스턴스에서 메소드를 호출하거나 특정 클래스의 인스턴스에서만 메소드를 호출 할 수 있습니다.

+0

고마워요, 그건 의미가 있습니다. 그리고 실행 개체 테이블에 링크를 주셔서 감사합니다 - 좋은 자원! –