На что распространяется __declspec (uuid ("ComObjectGUID"))? - PullRequest
5 голосов
/ 03 июня 2011

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

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

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

Ответы [ 2 ]

6 голосов
/ 03 июня 2011

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

4 голосов
/ 06 сентября 2011

Вы также можете использовать шаблоны (черты), если вам нужно статически «прикрепить» 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);
...