VARIANT 结构 (COM) 似乎没有成员
VARIANT structure (COM) seems to have no member
使用 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);
}
}
导致:
error C2039: 'bStrVal': is not a member of '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 结构中。为什么我无法编译代码?
这似乎只是一个大写问题,介于 bStrVal
(在代码中)和 bstrVal
(在结构定义中)之间。请注意 S
是不同的。 C 和 C++ 是 区分大小写 的语言。
使用 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);
}
}
导致:
error C2039: 'bStrVal': is not a member of '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 结构中。为什么我无法编译代码?
这似乎只是一个大写问题,介于 bStrVal
(在代码中)和 bstrVal
(在结构定义中)之间。请注意 S
是不同的。 C 和 C++ 是 区分大小写 的语言。