6

레거시 C++ COM 응용 프로그램에 단위 테스트를 추가하려고합니다. 또한 각 빌드에서 오류가 발생하지 않았는지 확인하기 위해 단위 테스트를 실행할 수 있도록 빌드 시스템이 필요합니다. 그러나 우리는 하나의 빌드 머신이 여러 버전을 동시에 빌드 할 수 있도록 빌드 머신이 com dll을 등록해야하는 것을 원하지 않습니다. 우리는 매니 페스트 파일을 사용하여 등록 무료 COM을 사용하는 것으로 변경할 수 있다고 생각했지만 작동하기가 매우 어려웠습니다. 아직 코드베이스가 아니라 Microsoft에서 제공하는 기본 예제를 참조하십시오.
내가이 페이지 http://msdn.microsoft.com/en-us/library/ms973913.aspx#rfacomwalk_topic8 내가 매니페스트 파일을 사용하여 등록되지 않은 DLL을 실행하려고 할 때 단순히 작동하지 않습니다을 사용하고, 나는 "클래스 등록되지 않은 오류"dll을 등록하지 않고 어떻게 C++ COM 코드를 단위 테스트 할 수 있습니까?

샘플 그들이 얻을 (C + +의 COM 서버와 C + + 클라이언트를 사용하여) 잘 일하는 제공하지만, 내가 다시 작성하면 작동하지 않습니다.

우리는 Visual Studio 2013을 사용하고 있으므로 등록 무료 COM 작동 방식이 크게 변경되어이 자습서가 최신 컴파일러와 호환되지 않는 것처럼 보입니다.

Visual Studio의 최신 버전을 사용하여 등록 무료 COM을 사용하는 방법에 대한 리소스를 알려주십시오. 우리가 거기에 도착할 때 우리 자신의 앱에서 더 복잡하게하기 위해 우리는 VS 2013을 사용하고 있지만 2010 컴파일러를 목표로하고 있습니다.

또한 매니페스트 파일보다 등록하지 않고 com 구성 요소에서 C++ 단위 테스트를 실행하는 것이 더 좋은 방법이라면 그 정보를 듣고 싶습니다.

도움 주셔서 감사합니다.

+0

우리는 같은 문제에 직면하고 있습니다. 등록이 필요없는 등록을위한 매니페스트 파일이있는 COM 구성 요소가 있습니다. 샌드 박스 애플리케이션으로 매니페스트가 올바른지 확인합니다. Visual Studio 2013에서 실행되는 기본 테스트로이 샌드 박스를 복제 할 수 없습니다. 테스트는로드되지 않고 "등록되지 않은 클래스"로 실행되고 실패합니다. 테스트 주자가 테스트가 실행되는 활성화 컨텍스트를 망친 것 같습니다. 우리는이 문제를 어떻게 해결할 지 잘 모릅니다. –

답변

1

추가 DLL 경로 매개 변수를 사용하는 고유 한 CoCreateInstance 버전을 구현할 수 있습니다. 코드는 (간결함을 위해 생략 오류 처리 및 기타 세부 사항)이 같은 것입니다 :

HRESULT CoCreateInstanceForTest(dllPath, rclsid, riid, ppv) 
{ 
    HINSTANCE hinst = LoadLibrary(dllPath); // TODO: Maybe it is already loaded 
    dllGetClassObject = GetProcAddress(hinst, "DllGetClassObject"); 
    return dllGetClassObject(rclsid, riid, ppv); 
} 

오류 처리 게다가를, 당신은 또한 당신이 이미로드 된 DLL을 추적 할 필요가있다. 이를 추적하려면 각 요소에 튜플이있는 목록이나 배열을 사용하십시오. 어느 시점에서 그 중 일부 또는 전부를 언로드 할 수 있습니다.

물론 나는 이들이 inproc COM 서버라고 가정합니다.