申し訳御座いませんが、お願いします。
VARIANT型の配列データ(vaData)のポインタを先頭の6バイトを
ずらして7バイト目以降のデータを生成するにはどうしたらよいのでしょうか?
>データを生成するにはどうしたらよいのでしょうか?
とは?あたらしいVARIANT型変数に入れるのでしょうか?
それと、むやみにハンドルを変更しないほうがよろしいかと。
同じハンドルを使っていれば、どれくらいの(プログラミングに対しての)理解があるのか
とか、以前の質問内容がわかったりして、プラスの要素が多いと思いますが。
すみません。以後注意致します。
>あたらしいVARIANT型変数に入れるのでしょうか?
出来るのであれば同じ変数(vaData)に入れ替えたいのですが。
もし複雑でしたら新しいVARIANT変数を作って入れても可能です。
>もし複雑でしたら新しいVARIANT変数を作って入れても可能です。
何で作ってもらおうとしているの?
ここは、質問をするところであって、作成依頼をするところはありません。
誰かに作ってもらいたいのであれば、「高いお金を払って」そういう専門の業者に委託してください。
前回の回答で、配列を取り出すところまで出来ているので
あとはその配列を元に SafeArrayCreateでSAFEARRAYを作成して
格納するだけだと思いますが。
作ってもらおうというわけではありません。
ただ、やり方というかヒントが欲しかったのですが。
そうとらわれたのでしたら申し訳御座いません。
SafeArrayCreateでの引数についてどんな値を入れればよいのでしょうか?
2006/12/01(金) 10:07:52
で自分でサンプル載せていますけど。
>SafeArrayCreate
を使わなくても ReDim(SafeArrayRedim) すればいいかも。
(使ったことないので何もアドバイスできないが。)
ただし、前の6要素を消すということは出来ない(単にサイズを減らすだけ)ので、
データの転記は自分でやる必要があります。
>>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 ) ) )
{
// 成功
}
ツイート | ![]() |