steve vreeland Ответов: 1

С помощью COM, Как я могу определить, почему интерфейс не поддерживается.


Насколько мне известно, это должно сработать:::

Вывод ITypeLib Viewer:
library MyServerLib
{
    // TLib : OLE Automation : {00020430-0000-0000-C000-000000000046}
    importlib("stdole2.tlb");

    // Forward declare all types defined in this typelib
    interface IOPCServer;
    interface IOPCBrowseServerAddressSpace;
    ...
    [
      uuid(E31E5782-636C-11D2-B326-0000A0080AC8),
      helpstring("OPC Server Class")
    ]
    coclass OPCServer {
        [default] interface IOPCServer;
        interface IOPCBrowseServerAddressSpace;
    };

    [
      odl,
      uuid(39C13A4D-011E-11D0-9675-0020AFD8ADB3)
    ]
    interface IOPCServer : IUnknown {
        HRESULT _stdcall AddGroup(.....
    };
	...
	
    [
      odl,
      uuid(39C13A4F-011E-11D0-9675-0020AFD8ADB3)
    ]
    interface IOPCBrowseServerAddressSpace : IUnknown {
        HRESULT _stdcall QueryOrganization([out] tagOPCNAMESPACETYPE* pNameSpaceType);
     ....
    };
    ....
};


Код C++::>
const CLSID CLSID_OPCServer = {0xE31E5782,0x636C,0x11D2,{0xB3,0x26,0x00,0x00,0xA0,0x08,0x0A,0xC8}};
	const IID IID_IOPCBrowseServerAddressSpace = { 0x39c13a4f,0x011e,0x11d0,{ 0x96,0x75,0x00,0x20,0xaf,0xd8,0xad,0xb3 } };

	 hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
	 hr = CoCreateInstance( CLSID_OPCServer, NULL, CLSCTX_SERVER, 
											IID_IUnknown, (void **) &(p2sPtrs->pServer) );
	// this was successful and got a pServer pointer
	
	hr = p2sPtrs->pServer->QueryInterface(IID_IOPCBrowseServerAddressSpace, (void **)&m_spBrowse);
	// this fails with 'No such interface supported.'


Как мне определить, в чем заключается проблема?
Мне все кажется правильным.
Может быть, не хватает ступеньки?

Что я уже пробовал:

Попробовал инициализировать
COINIT_APARTMENTTHREADED
без всякой разницы.

1 Ответов

Рейтинг:
1

KarstenK

Ваш единственный шанс это попробовать и проверить возвращаемое значение каждой вызываемой функции (hr-код), которая может быть ошибкой. Первая ошибка ломает победителя!!! Google по смыслу, что шестнадцатеричное значение.

Общие проблемы заключаются в том, что классы не зарегистрированы или не полностью зарегистрированы. Сравните идентификаторы UUID и повторно зарегистрироваться в качестве администратора.

COM работает, в большинстве случаев это какая-то действительно глупая ошибка. ;-)