2014-09-04 3 views
1

Что я пытаюсь сделать здесь, просто создайте экземпляр интерфейса. На самом деле должно быть так просто. Я следил за любыми материалами в Интернете и материалами для чтения, которые я могу найти и не могу решить эту проблему для жизни меня.CoCreateInstance Returning E_INVALIDARG

Это сводится к HRESULT, который возвращается из CoCreateInstance, являющегося E_INVALIDARG. Я изменил параметры, насколько могу, попытаюсь заставить его работать, но все равно не могу его получить. Поэтому, пожалуйста, взгляните, и, надеюсь, кто-то может указать на что-то простое, я уже смотрю.

//Instantiate the sink class and hold a pointer to it. 
    m_pSink = new CSink(); 

    HRESULT hr = CoInitialize(NULL); 

    //Get a pointer to sinks IUnknown, no AddRef. CMySink implements only 
    //dispinterface and the IUnknown and IDispatch pointers will be same. 
    LPUNKNOWN pUnkSink = m_pSink->GetIDispatch(FALSE); 

    CLSID clsidInterface; 
    hr = CLSIDFromProgID(L"Automation.AutomationInterface", &clsidInterface); 

    ICALib::IAutomationInterface *p_Interface = NULL; 
    hr = CoCreateInstance(clsidInterface, NULL, CLSCTX_LOCAL_SERVER, ICALib::IID_IAutomationInterface, (void**)p_Interface); 

    if (hr != S_OK) // Show a message box if the Instance of the interface is not created and do not create the object. 
    { 
     CMessageBox(CMessageBox::WARNING_OK).Show(IDS_WARNING_BADLICENSE); 
     m_failedToCreate = TRUE; 
     this->~CMainClass(); 
     return; 
    } 

    //Establish a connection between source and sink. 
    //m_pUnkSrc is IUnknown of server obtained by CoCreateInstance(). 
    //m_dwCookie is a cookie identifying the connection, and is needed to terminate the connection. 
    BOOL result = AfxConnectionAdvise(p_Interface, m_pSink->GetGUID(), pUnkSink, FALSE, &m_dwCookie); 

(Фактические имена не отображаются в этом коде из-за юридических обязательств)

+0

OT, но 'this-> ~ CMainClass();' довольно подозрительно –

ответ

2

Вам нужно взять адрес p_Interface и передать в CoCreateInstance. Поскольку вы просто передаете указатель NULL для последнего аргумента.

+0

Святое дерьмо Я не могу поверить, что я этого не видел, большое спасибо: D –

+0

Чтобы избежать такого рода ошибок, подумайте об использовании [IID_PPV_ARGS] (http://msdn.microsoft.com/en-us/library/windows/desktop/ee330727 (v = vs.85) .aspx) macro –

Смежные вопросы