CComSafeArray<VARIANT> fields;
hr = _tab_file->get_Fields(fields.GetSafeArrayPtr());
for (LONG i = fields.GetLowerBound(), ie = fields.GetUpperBound(); i <= ie; ++i)
{
CComVariant fld = fields.GetAt(i); // (1) raises DISP_E_BADVARTYPE (0x80020008L)
// Next code works fine
CComQIPtr<ITabField> field = fields.GetAt(i).punkVal; // (2) Ok
_bstr_t fieldName;
hr = field->get_Name(fieldName.GetAddress());
::OutputDebugString(fieldName + _T("\n")); // Ok
}
ライン(1):fields.GetAt(i)
戻りCComVariant
。この値をコピーコンストラクタと呼ばれるCComVariant fld
に割り当てようとすると、コピーコンストラクタ内でCComVariant::Copy
メソッドが呼び出されます。例外を発生させます( "bad variable type"、DISP_E_BADVARTYPE (0x80020008L)
)。 同時に、ライン(2)はうまく機能します。行(1)の何が問題なのか、それを修正する方法エラー:CComVariant ::コピーで "悪い変数の型" CComSafeArray
EDIT:これはget_Field
(SAFEARRAY
を充填)するためのコードです。
STDMETHODIMP TabFile::get_Fields(SAFEARRAY** fields)
{
if(mapInfoFile_ == 0)
return E_UNEXPECTED;
int fieldCount = getFieldCount();
SAFEARRAY* arr = ::SafeArrayCreateVector(VT_UNKNOWN, 0, fieldCount);
for(LONG i = 0; i < fieldCount; i++)
{
QField* field = getQField(i);
ITabField* tabField = TabField::CreateInstance();
tabField->put_Name(_bstr_t(field->GetNameRef()));
tabField->put_Type(field->GetNativeFieldType(i));
::SafeArrayPutElement(arr, &i, tabField);
tabField->Release();
}
*fields = arr;
return S_OK;
}
'GetAt(i)'はあなたに 'CComVariant&'型を与えます。したがって、 'fld'変数を参照型に更新し、そこに何があるのか、なぜ物が代入/複製を使わないのかを確認できます。 @RomanR。 –
[OK]を、私は(CComVariant&fld = fields.GetAt(i);のように)書き直しました。うまく動作しますが、私は現在どのように理解するのか分かりません。コピーコンストラクタの問題は何ですか? – Loom
これで 'fld'変数があり、それを検査することができます。その '.vt'が良好で、迷惑でないかどうか確認してください。結局のところ、この値はコピーには有効ではないので、何か問題があり、デバッガでそれを見ることができるはずです。 –