2010-12-16 3 views
0

우리는 오히려 복잡한 COM 인터페이스와 다소 오래된 COM 같은 구성 요소를 가지고 있습니다. 이러한 인터페이스는 마샬링에 상당히 문제가 있으므로 레지스트리에 아무 것도 등록하지 않고 IMainObject 포인터를 검색하는 구성 요소 DLL에서 CreateMainObject() 함수를 내보내고 IMainObject 인터페이스에는 다른 많은 기능이 있습니다."원시"포인터를 통해 COM 개체를 어떻게 사용합니까?

클라이언트가 결코 CoCreateInstance() 호출하지 이런 식으로 - 대신은 LoadLibraryEx()/GetProcAddress()를 호출하고 CreateMainObject() 함수를 호출합니다. COM은 실제로 장면에 들어 가지 않으므로 마샬링을 수행 할 수 없습니다. 모든 동작은 해당 객체에 대한 메소드를 직접 호출하여 수행됩니다. 모든 것은 매우 빠르지 만 물론 스레드로부터 안전하지 않으며 COM + 대리자에서 작동하지 않습니다.

이러한 COM 인터페이스 사용에 대한 용어가 있습니까?

답변

1

"이 (가) COM 인터페이스의 사용법이 잘못되었습니다"와 같이 사용자가 추구하는 용어가 "잘못된"것입니다.

왜 (당신이 원하는 경우 또는 IDispatch) 후, 하나의 방법, ICreateMainObject::CreateMainObjectIUnknown에서 파생 된 ICreateMainObject를 등록 유효 COM 의미를 사용하여 객체를 생성하기 위해이 방법을 사용하지 마십시오.

+0

조금 가혹한가요? COM 사양에 COM 레지스트리를 사용해야한다는 내용이 있다고 생각하지 않습니다. 또한 그는 내가 볼 수있는 한 COM의 의미에 대한 위반을 암시하는 것도 기술하지 않습니다. –

+0

@Chris Dickson : 첫째, 클라이언트가 DLL 진입 점을 사용하는 경우 모든 방법으로 가서 .h/.lib 쌍을 만들고 DLL을 동적 라이브러리로 사용하는 이유는 무엇입니까? 왜 COM 오버 헤드를 추가합니까? 둘째, 다른 클라이언트가 .NET 인터롭과 같은 클래스를 어떻게 사용해야합니까? 그리고 마지막으로 : COM 인프라가 설정된 곳은 어디입니까? 누가이 모델에서 CoInitializeEx와 CoInitializeSecurity를 ​​호출합니까? 개체가 STA 또는 MTA입니까? 스레드간에 인터페이스를 마샬링해야합니까? IMainObject의 새 버전은 런타임에 어떻게 발견됩니까? 이 배치가 SxS와 함께 작동합니까? –

+0

@Chris Dickson : 등록이 필요없는 COM 및 활성화가 이미 있음을 언급하지 않으려는 것입니다. http://msdn.microsoft.com/en-us/library/ms973913.aspx –

관련 문제