VARIANT结构(COM)似乎没有成员

时间:2015-06-16 16:43:15

标签: c++ com directshow visual-studio-2015 variant

使用Visual Studio 2015 RC和Windows SDK 7.1以及这个简单的DirectShow代码(带有COM的C ++)

#include <dshow.h>
#include <iostream>

int main ()
{
    CoInitialize(nullptr);


    ICreateDevEnum* devEnum = nullptr;
    CoCreateInstance(
        CLSID_SystemClock,
        NULL,
        CLSCTX_INPROC_SERVER,
        IID_ICreateDevEnum,
        reinterpret_cast<void**>(devEnum)
    );

    IEnumMoniker* monikerEnum = nullptr;
    devEnum->CreateClassEnumerator(
        CLSID_VideoInputDeviceCategory,
        &monikerEnum,
        0
    );

    IMoniker* moniker = nullptr;
    ULONG fetchedCount = 0;

    while (monikerEnum->Next(1, &moniker, &fetchedCount))
    {
        IPropertyBag* propBag = nullptr;
        moniker->BindToStorage(0, 0, IID_IPropertyBag, reinterpret_cast<void**>(propBag));

        VARIANT var;
        VariantInit(&var);

        propBag->Read(L"FriendlyName", &var, nullptr);

        std::cout << var.bStrVal;

        VariantClear(&var);
    }
}

导致:

  

错误C2039:'bStrVal':不是'tagVARIANT'的成员

tagVARIANT结构定义为:

typedef /* [wire_marshal] */ struct tagVARIANT VARIANT;

struct tagVARIANT
    {
    union 
        {
        struct __tagVARIANT
            {
            VARTYPE vt;
            WORD wReserved1;
            WORD wReserved2;
            WORD wReserved3;
            union 
                {
                LONGLONG llVal;
                LONG lVal;
                BYTE bVal;
                SHORT iVal;
                FLOAT fltVal;
                DOUBLE dblVal;
                VARIANT_BOOL boolVal;
                _VARIANT_BOOL bool;
                SCODE scode;
                CY cyVal;
                DATE date;
                BSTR bstrVal;
                IUnknown *punkVal;
                IDispatch *pdispVal;
                SAFEARRAY *parray;
                BYTE *pbVal;
                SHORT *piVal;
                LONG *plVal;
                LONGLONG *pllVal;
                FLOAT *pfltVal;
                DOUBLE *pdblVal;
                VARIANT_BOOL *pboolVal;
                _VARIANT_BOOL *pbool;
                SCODE *pscode;
                CY *pcyVal;
                DATE *pdate;
                BSTR *pbstrVal;
                IUnknown **ppunkVal;
                IDispatch **ppdispVal;
                SAFEARRAY **pparray;
                VARIANT *pvarVal;
                PVOID byref;
                CHAR cVal;
                USHORT uiVal;
                ULONG ulVal;
                ULONGLONG ullVal;
                INT intVal;
                UINT uintVal;
                DECIMAL *pdecVal;
                CHAR *pcVal;
                USHORT *puiVal;
                ULONG *pulVal;
                ULONGLONG *pullVal;
                INT *pintVal;
                UINT *puintVal;
                struct __tagBRECORD
                    {
                    PVOID pvRecord;
                    IRecordInfo *pRecInfo;
                    }   __VARIANT_NAME_4;
                }   __VARIANT_NAME_3;
            }   __VARIANT_NAME_2;
        DECIMAL decVal;
        }   __VARIANT_NAME_1;
    } ;

因此该成员存在于VARIANT结构中。为什么我无法编译代码?

1 个答案:

答案 0 :(得分:5)

bStrVal(在代码中)和bstrVal(在结构定义中)之间似乎只是一个大写问题。请注意S是不同的。 C和C ++是区分大小写的语言。

相关问题