You'll find it in ObjBase.h:

//  IID_PPV_ARGS(ppType)

//      ppType is the variable of type IType that will be filled

//

//      RESULTS in:  IID_IType, ppvType

//      will create a compiler error if wrong level of indirection is used.

//

extern "C++"

{

    template<typename T> void** IID_PPV_ARGS_Helper(T** pp)

    {

        // make sure everyone derives from IUnknown

        static_cast<IUnknown*>(*pp);

       

        return reinterpret_cast<void**>(pp);

    }

}

 

#define IID_PPV_ARGS(ppType) __uuidof(**(ppType)), IID_PPV_ARGS_Helper(ppType)

And it allows you to write code like this:

CoCreateInstance(CLSID_SearchFolderItemFactory,

                 NULL,

                 CLSCTX_INPROC_SERVER,

                 IID_PPV_ARGS(&pSearchFolderItemFactory));

or

pContact->QueryInterface(IID_PPV_ARGS(&pPersistInit));

or

#define DECLARE_COM_SMARTPTR(x) _COM_SMARTPTR_TYPEDEF(x, __uuidof(x));

DECLARE_COM_SMARTPTR(IShellItem)

IShellItemPtr shellItem1;

SHCreateItemFromParsingName(L"C:\\Users\\YvesDolc", 0, IID_PPV_ARGS(&shellItem1));

 

Hapy New Year!