2009-06-24 3 views
0

을 인스턴스화하는 중 오류가 발생했습니다. 현재 만든 간단한 시스템에서 COM DLL을 사용하려고 애 쓰고 있습니다. 모든 것이 성공적으로 컴파일되지만, 런타임에는 CoCreateInstace가 S_OK를 반환하지만, 어쨌든 내 객체 포인터가 NULL을 반환합니다.COM 개체

이 인터페이스 포인터는 내 클래스 헤더에 만들어집니다. 가장 이상한 점은 메서드 스택에 같은 포인터 유형을 인스턴스화하면 올바른 개체가 만들어 지지만 BASE com 클래스를 만들려고하면 __hook을 호출하면 액세스 위반이 발생한다는 것입니다.

도움이 될 수있는 몇 가지 다른 측면

: CoInitalizeEx로 프로그램을 실행하려고

  • 이 COINIT_MULTITHREADED 및 COINIT_APARTMENTTHREADED

  • 프로젝트로 시작은 그 안에 COM DLL을 사용하는 DLL입니다

  • 새 스레드를 시작하지 않고 동일한 방법을 시도했지만 오류가 지속됩니다.

  • 테스트 프로그램 (스레드가없고 실행 가능)을 만들었으며 개체가 정상적으로 만들어지고 올바르게 연결되었습니다. 그래서 내 추측 그것은 DLL 자체 또는 관련 스레드와 관련이 있습니다.

추 신 : 보너스 질문으로, Google에서 COM과 관련된 유리한 것을 반환하지 않는 이유는 무엇입니까? :)

답변

2

COM 개체의 IUnknown :: QueryInterface 구현 버그로 들리지만 출력 포인터를 설정하지 않고 S_OK를 반환합니다. 대한

CoCreateInstance를 서버가 기본적으로-PROC : 메모리에

  • 로드 DLL
  • 전화 DllGetClassObject 클래스 공장에게 할당 클래스 공장에서
  • 호출하여 IClassFactory :: CreateInstance 함수를 얻을 수 있습니다 새 개체
  • 새 인터페이스에서 IUnknown :: QueryInterface를 호출하여 원하는 인터페이스를 가져옵니다.

모든 단계에서 NULL이지만 S_OK를 반환하면 끝 부분의 QI 호출을 제외하고는 충돌이 발생합니다.

+0

이 방법은 내가 만든 샘플 앱도 실패하게 만들 것이므로 그렇게 생각하지 않습니다. –

0

발견 된 문제 : module 속성이 정적 라이브러리에 정의되어있어 COM 객체가 미쳐 버렸습니다. DLL 소스로 이동하면 문제가 해결됩니다.