2012-02-17 18 views
1

googletestを使用してCOMオブジェクトの単体テストを書きたいとします。残念ながら、CreateInstanceが呼び出されたときに私は例外を受け取ります:0xC0000005: Access violation reading location 0x00000000googletestを使用してATLオブジェクトをテストしようとしたときに例外が発生しました

コードは基本的に次のようになります。私はいくつかの中に何の問題もなくCreateInstanceを呼び出すことができる午前

MyClass.h

class ATL_NO_VTABLE CMyClass 
    : public CComObjectRootEx<CComMultiThreadModel>, 
    public CComCoClass<CMyClass, &CLSID_MyClass>, 
    public IConnectionPointImpl<CMyClass, &IID_IMyClassListener>, 
    public IConnectionPointContainerImpl<CMyClass>, 
    public IDispatchImpl<MyComClass, &IID_MyComClass, &LIBID_MyLib, 1, 0> 
{ 
    ... 
} 

Test.cppの

#include "stdafx.h" 
#include "gtest/gtest.h" 

#include "MyClass.h" 

TEST(MyClassTest, IsCreated) 
{ 
    HRESULT hr(E_FAIL); 
    CComPtr<MyComClass> lMyObject; 
    hr = CMyClass::CreateInstance(&lMyObject); 
    EXPECT_EQ(S_OK, hr); 
} 

int main(int argc, char **argv) 
{ 
    ::testing::InitGoogleTest(&argc, argv); 
    return RUN_ALL_TESTS(); 
} 

既存の(テストではない)プロジェクト。私は本当にCOM/ATLを理解していないので、私はなぜこの奇妙な例外を得ているのか分かりません。

+1

アクセス違反の呼び出しスタック?クラスにはグローバルなATLモジュールクラスが必要な場合がありますが、テストプロジェクトでは初期化されていないままになることがあります。 –

答えて

1

@Romanは正しいアイデアを持っていました。私はTest.cppにmain()の上に以下を置いて、すべてが動作し始めた。

#include "resource.h" 

const IID LIBID_TestLib = {0xA5AD0596, 0x14AE, 0x43A3, {0xB2, 0x5E, 0xF7, 0xF9, 0x19, 0x93, 0xA7, 0x24}}; 

class CTestModule : public CAtlExeModuleT<CTestModule> 
{ 

public: 

    DECLARE_LIBID(LIBID_TestLib) 
    DECLARE_REGISTRY_APPID_RESOURCEID(IDR_TEST, "{575D971E-C35B-470f-BE6B-FFB9145CCCD3}") 

}; 

CTestModule gAtlModule; 
関連する問題