Mfc

MFCでCOleVariantを使用して、CMFCPropertyGridPropertyプロパティウィンドウのプロパティ値を取得します



Use Colevariant Mfc Get Property Value Cmfcpropertygridproperty Property Window



MFCプロパティウィンドウのCMFCPropertyGridPropertyでアイテムの値を取得するときに、誤って間違ったタイプを書き込んだ場合、誤った結果になります。その理由は、COleVariantが実際には特別な構造tagVARIANTから継承しているためです。

  • COleVariantクラス宣言
class COleVariant : public tagVARIANT { // Constructors public: COleVariant() &emsp... COleVariant(BYTE nSrc) COleVariant(short nSrc, VARTYPE vtSrc = VT_I2) COleVariant(long lSrc, VARTYPE vtSrc = VT_I4) COleVariant(const COleCurrency& curSrc) COleVariant(LONGLONG nSrc) COleVariant(ULONGLONG nSrc) COleVariant(float fltSrc) COleVariant(double dblSrc) COleVariant(const COleDateTime& timeSrc) COleVariant(const CByteArray& arrSrc) COleVariant(const CLongBinary& lbSrc) COleVariant(LPCITEMIDLIST pidl) public: const COleVariant& operator=(BYTE nSrc) const COleVariant& operator=(short nSrc) const COleVariant& operator=(long lSrc) const COleVariant& operator=(const COleCurrency& curSrc) const COleVariant& operator=(LONGLONG nSrc) const COleVariant& operator=(ULONGLONG nSrc) const COleVariant& operator=(float fltSrc) const COleVariant& operator=(double dblSrc) const COleVariant& operator=(const COleDateTime& dateSrc) // Implementation public: ~COleVariant() }
  • tagVARIANTの定義
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 }

tagVARIANTは内部的に結合であることがわかります。ユニオンのサイズは、最大のメンバーのサイズです。ユニオンは共有メモリです。一度に有効にできる値は1つだけです。
したがって、COleVariantを使用して属性値を取得する場合、tagVARIANTに対応するメンバーが初期属性値設定を取得する必要があるのはなぜですか。shortをdoubleで取得すると、得られる結果が正しくありません。

// float type CMFCPropertyGridProperty* pPropItem1; pPropItem1 = new CMFCPropertyGridProperty(_T('Float type'), (_variant_t)(float)12.3, _T('')) COleVariant val1 = pPropItem1->GetValue() float fValue = val1.fltVal // double type CMFCPropertyGridProperty* pPropItem2; pPropItem2 = new CMFCPropertyGridProperty(_T('double type'), (_variant_t)(double)212.3, _T('')) COleVariant val2 = pPropItem2->GetValue() double dValue = val2.dblVal // long type CMFCPropertyGridProperty* pPropItem3; pPropItem3 = new CMFCPropertyGridProperty(_T('long type'), (_variant_t)(long)100, _T('')) COleVariant val3 = pPropItem3->GetValue() long lValue = val3.lVal
  • 連合
union MyUnion { int n float f double d } int main(int argc, _TCHAR* argv[]) { MyUnion un un.n = 10 // At this time n in the union is 10 un.d = 3.14 // At this time, d in the union is 3.14, and n is 0 int n n = un.n return 0 }