2012-02-01 2 views
1

호출 할 C++ COM interop을 만듭니다. regasm에서 dll 및 tlb 파일을 등록했습니다. 모든 것이 C# 코드의 코드를 변경 한 날이 다가올 때까지 잘됩니다 (인터페이스의 정의를 변경하지 않고 구현이 변경되었습니다). COM의 한 인터페이스가 0x80131509 오류를 반환합니다. 이상한 것은, 그것은 단지 일부 컴퓨터에서 발생했습니다 (내 개발 PC가 잘 작동하므로이 문제를 디버깅 할 수 없음). C# COM이 C++에서 어떻게 작동했는지 명확히 알지 못합니다. 등록한 후에는 윈도우 레지스트리에서 키 값을 생성합니다. (regasm/regfile이 생성 한 것과 같습니다). 어떻게 C++이 COM dll (검색 경로 환경 변수)이 어디에 있는지 알고 있습니까? 그리고 런타임에 tlb 파일의 용도는 무엇입니까?C++ COM interop 오류 호출 : HRESULT 0x80131509

의견이 있으십니까?

답변

0

나는 당신의 문제가 레지스트리와 관련이 있다고 생각한다 ... 당신은 등록을 시도하고 (regasm을 사용하여)이 문제가있는 컴퓨터에서 dll을 등록하려고 시도해야한다.

해당 컴퓨터에서 dll 등록을 취소해도 작동하지 않으면 regedit을 사용하여 DLL을 참조하는 누락 된 레지스트리 키를 검색하고 삭제 한 다음 dll을 다시 등록하십시오. 누락 된 키를 삭제 한 후에 레지스트리 정리 프로그램 중 하나를 사용하여 누락 된 것이 없음을 보증 할 수도 있습니다.

응용 프로그램에서 사용할 디렉토리에 dll을 항상 등록해야하며이 작업은 한 번만 수행해야합니다. dll 등록을 취소해야하는 경우 등록 할 때 사용한 것과 같은 디렉토리에서 항상 dll을 수행해야합니다. 즉, dll이 등록되면 을 이동하지 마십시오.

참고 : dll이 C++ 응용 프로그램과 동일한 경로에 있지 않으면 PATH 환경 변수에서 참조되는 디렉토리에 있어야합니다.

+2

답장을 보내 주셔서 감사합니다. 오늘, 나는 문제 PC에 로그인하고 마침내 그것이 잘못되는 이유를 찾는다. 그것은 예외를 던진 C# COM 부분 때문입니다. 그러나 나는 그것을 잡지 않았습니다. 내가 왜 그것을 재현 할 수 없는지 그들은 차이 데이터베이스에 연결되어있다. – ArdenZhao

0

Visual FoxPro .Net4 C# COM 개체를 호출 할 때 동일한 오류 메시지가 나타납니다.

이 메서드는 몇 가지 유형 중 하나 일 수있는 객체를 반환합니다. 모든 유형은 이러한 유형의 공통 항목과의 인터페이스를 구현 한 추상 클래스에서 파생됩니다.

결국 나는 기본 클래스에서 추상 수정자를 제거하고 공용 및 ComVisible로 만들기로 결정했습니다. 기본 클래스를 추상적으로 원한다고해도,이 문제는 저를 위해 해결되었습니다.