문제

유형 라이브러리가없는 32 비트 ATL COM 구성 요소가 있습니다. 그것은 여러 인터페이스를 구현하는 주어진 클래스에 대한 클래스 공장이 있습니다.

프로그램 내 서버로 사용하면 모든 것이 잘 작동합니다. 클라이언트 측은 CocreateInstance ()를 호출합니다. 개체는 인스턴스화되고 QueryInterface ()는 요청 된 인터페이스에 대한 포인터를 검색합니다. 그러나 구성 요소를 com+에 넣으면 더 이상 클래스를 인스턴스화 할 수 없습니다 -CocreateInstance ()는 이제 e_nointerface를 반환합니다.

문제는 COM+가 유형 라이브러리가 없기 때문에 마샬링을 수행 할 수 없다는 것입니다. 어떻게 해야할지 모르겠습니다. 이를 해결하려면 유형 라이브러리를 생성하고 등록해야합니까, 아니면 다른 방법이 있습니까?

도움이 되었습니까?

해결책

URK. 나는 물어 보는 것이 좋습니다 Microsoft.public.vc.atl 내가 당신이 거기에서 더 많은 전문가를 찾을 것이라고 생각합니다. (전문가는 아니지만) 문제는 등록 된 프록시/스터브 문제보다 COM+와 관련이 없다고 생각합니다. (즉, 컴퓨터 외부에서 구성 요소에 액세스하기 위해 자신의 COM 클라이언트를 작성하더라도 동일한 문제가 발생할 수 있습니다) 표준 자동화 호환 인터페이스가 있으면 Windows는 객체만을 마샬링하는 방법을 알고 있습니다. 좋아. 그러나 그렇지 않으면 혼란스러워합니다.

유형 라이브러리가 없으면 프록시/스터브를 등록하거나 사용자 정의 마샬링을 처리하려면 직접 Imarshal을 구현해야합니다. (또는 내가 이해하지 못하는이 "핸들러 마샬링"도 있습니다)

유형 라이브러리가없는 이유에 대한 귀하의 의견 (Microsoft가 이미 정의한 인터페이스 구현이지만 타입이없는 인터페이스)은 저에게 적기가 발생합니다. 자세한 내용을 제공 할 수 있습니까? 그것이 .dll 또는 .exe에있는 것이지만 유형 정보가 라이브러리 자체 내부에 있다면 (외부 .tlb 파일이 아닌) 모든 것이 작동하기 위해 올바른 정보를 추출 할 수있을 것입니다. 프로세스.

(레코드를 위해, 나는 Java를 위해 ATL/COM 프로그래밍을 떠났으므로 과거에 기억하는 것을 알려줄 수 있지만 지금은 도구를 사용하지 않으며 다시 돌아 오기가 어려울 것입니다. 그들에게 더 많은 도움을 제공하기 위해 그들에게. 그러나 Microsoft.public.vc.atl의 사람들은 꽤 똑똑합니다.)

다른 팁

Typelibs는 마샬링을 지원하는 한 가지 방법입니다. 프록시/스터브 DLL (IDL에서 생성)은 또 다른 방법입니다. 그러나 두 경우 모두 처음에는 IDL이 필요합니다.

Microsoft 가이 인터페이스에 Typelib/Proxy DLL 또는 IDL을 제공하지 않는 경우, 이에 대한 이유가있을 수 있습니다. 인터페이스가 비수정 할 수없는 데이터 구조를 사용하거나 기능 포인터를 메소드 매개 변수로 전달해야합니까? 이 경우이 인터페이스를 DCOM을 위해 작동시킬 방법이 없습니다.

어쩌면 당신은 IDL을 재구성 할 수 있지만, 아마도 가능하지는 않을 것입니다. 그러면 마지막 폴백은 사용자 정의 또는 핸들러 마샬링을 사용하는 것이지만, 노력할 가치가 없을 것입니다. 즉, DCOM에 사용되도록 설계되지 않은 DCOM의 인터페이스를 사용하지 않는 다른 경로를 고려하는 것이 좋습니다.

COM 인터페이스가 Microsoft의 기본 Marshaller를 사용하여 Marshallable이하려면 인터페이스에 헤더에 듀얼 또는 Oleautomation 속성이 정의되어 있어야합니다.

인터페이스 포인터 인 정의 된 메소드에 대한 인수가있는 경우 동일한 요구 사항이 해당 인터페이스로 확장됩니다.

또한 인터페이스 이름은 IDL의 라이브러리 섹션에 있어야합니다. 이것은 또한 다른 참조 인터페이스로 확장됩니다.

이러한 조건이 충족되지 않으면 인터페이스가 마샬링 가능하지 않습니다.

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