Исключение при попытке использовать googletest для тестирования объекта ATL - PullRequest
1 голос
/ 18 февраля 2012

Я хочу написать несколько модульных тестов для моего COM-объекта с помощью googletest. К сожалению, я получаю исключение, когда CreateInstance вызывается: 0xC0000005: Access violation reading location 0x00000000.

Код в основном выглядит следующим образом:

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();
}

Я могу без проблем вызвать CreateInstance в некоторых существующих (не тестовых) проектах. Я не совсем понимаю COM / ATL, поэтому мне сложно понять, почему я получаю это странное исключение.

1 Ответ

1 голос
/ 21 февраля 2012

@ У Романа была правильная идея.Я поместил следующий выше main () в мой Test.cpp, и все начало работать:

#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;
...