掲示板システム
ホーム
アクセス解析
カテゴリ
ログアウト
CComVariant型のポインタのデータを先頭6バイトずらすには? (ID:63856)
名前
ホームページ(ブログ、Twitterなど)のURL (省略可)
本文
>>SafeArrayCreate >を使わなくても ReDim(SafeArrayRedim) すればいいかも。 >(使ったことないので何もアドバイスできないが。) >ただし、前の6要素を消すということは出来ない(単にサイズを減らすだけ)ので、 >データの転記は自分でやる必要があります。 なんやかんやいっておきながら作ってしまった。orz HRESULT Hoge( CComVariant& v ) { HRESULT hr = S_OK; // BYTE型の配列かどうか if ( !( v.vt & VT_UI1 | VT_ARRAY ) ) return E_INVALIDARG; SAFEARRAY* psa = v.parray; // 1次元配列かどうか if ( ::SafeArrayGetDim( psa ) != 1 ) return E_INVALIDARG; // サイズの取得 LONG lb, ub, size; LONG i, j; ::SafeArrayGetLBound( psa, 1, &lb ); // lb = LBound(psa) ::SafeArrayGetUBound( psa, 1, &ub ); // ub = UBound(psa) size = ub - lb + 1; // 6バイト未満かどうか if ( size < 6 ) return E_INVALIDARG; // データの転記 // 7バイト目以降を6バイト分前にずらす hr = ::SafeArrayLock( psa ); if ( FAILED( hr ) ) return hr; for ( i = lb, j = lb + 6; i <= ub - 6; ++i, ++j ) { BYTE data; hr = ::SafeArrayGetElement( psa, &j, &data ); // data = psa(j) if ( FAILED( hr ) ) return hr; hr = ::SafeArrayPutElement( psa, &i, &data ); // psa(i) = data if ( FAILED( hr ) ) return hr; } hr = ::SafeArrayUnlock( psa ); if ( FAILED( hr ) ) return hr; // 配列のサイズの変更 SAFEARRAYBOUND sab; sab.lLbound = 0; sab.cElements = size - 6; hr = ::SafeArrayRedim( psa, &sab ); // ReDim Preserve psa(size - 6) return hr; } ・・ if ( SUCCEEDED( Hoge( vaData ) ) ) { // 成功 }
←解決時は質問者本人がここをチェックしてください。
更新する
戻る
掲示板システム
Copyright 2021 Takeshi Okamoto All Rights Reserved.