На что распространяется __declspec(uuid(" ComObjectGUID "))?
У меня есть кусок кода, который использует специфичное для Microsoft расширение C++:
interface __declspec(uuid("F614FB00-6702-11d4-B0B7-0050BABFC904"))
ICalculator : public IUnknown
{
//...
};
На что распространяется это предложение? Как я могу переписать его с ANSI C++?
2 ответа
Вы также можете использовать шаблоны (черты), если вам нужно статически "прикрепить" 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);