На что распространяется __declspec(uuid(" ComObjectGUID "))?

У меня есть кусок кода, который использует специфичное для Microsoft расширение C++:

interface __declspec(uuid("F614FB00-6702-11d4-B0B7-0050BABFC904"))
ICalculator : public IUnknown
{ 
    //...
};

На что распространяется это предложение? Как я могу переписать его с ANSI C++?

2 ответа

Решение

Это не макрос, поэтому он не "расширяется" ни к чему. Он просто украшает тип с заданным UUID в метаданных объектного файла, которые затем могут быть извлечены позже с помощью оператора __uuidof.

Вы также можете использовать шаблоны (черты), если вам нужно статически "прикрепить" guid к интерфейсу. Рассматривать:

В обычном h-файле вы создаете пустой неспециализированный шаблон:

template<typename TInterface> struct TInterfaceTraits {}

При определении вашего интерфейса напишите специализацию шаблона для него (или вы можете написать его в любом другом месте, в том числе непосредственно перед использованием):

class ICalculator : public IUnknown
{ 
    //...
};
template<> struct TInterfaceTraits<class ICalculator > { 
    static GUID guid() { 
        return IID_ICalculator ; 
    } 
};

Затем, чтобы получить его, вы можете написать что-то вроде:

ICalculator *pCalcFace;
pObject->QueryInterface(TInterfaceTraits<ICalculator>::guid(), (void**)pCalcFace);

Конечно, вы можете написать (я оставляю это вам) шаблонную оболочку для QueryInterface, которая будет использовать черты для автоматического предоставления правильного guid, и это будет еще проще в использовании, т.е.

ICalculator *pCalcFace = QueryInterface<ICalculator>(pObject);
Другие вопросы по тегам