CComVariant型のポインタのデータを先頭6バイトずらすには?


かや  2006-12-07 14:10:51  No: 63849  IP: 192.*.*.*

申し訳御座いませんが、お願いします。
VARIANT型の配列データ(vaData)のポインタを先頭の6バイトを
ずらして7バイト目以降のデータを生成するにはどうしたらよいのでしょうか?

編集 削除
Blue  2006-12-07 14:20:05  No: 63850  IP: 192.*.*.*

>データを生成するにはどうしたらよいのでしょうか?
とは?あたらしいVARIANT型変数に入れるのでしょうか?


それと、むやみにハンドルを変更しないほうがよろしいかと。
同じハンドルを使っていれば、どれくらいの(プログラミングに対しての)理解があるのか
とか、以前の質問内容がわかったりして、プラスの要素が多いと思いますが。

編集 削除
かや  2006-12-07 14:28:01  No: 63851  IP: 192.*.*.*

すみません。以後注意致します。
>あたらしいVARIANT型変数に入れるのでしょうか?
出来るのであれば同じ変数(vaData)に入れ替えたいのですが。
もし複雑でしたら新しいVARIANT変数を作って入れても可能です。

編集 削除
Blue  2006-12-07 14:30:53  No: 63852  IP: 192.*.*.*

>もし複雑でしたら新しいVARIANT変数を作って入れても可能です。
何で作ってもらおうとしているの?
ここは、質問をするところであって、作成依頼をするところはありません。
誰かに作ってもらいたいのであれば、「高いお金を払って」そういう専門の業者に委託してください。

前回の回答で、配列を取り出すところまで出来ているので
あとはその配列を元に SafeArrayCreateでSAFEARRAYを作成して
格納するだけだと思いますが。

編集 削除
かや  2006-12-07 14:55:16  No: 63853  IP: 192.*.*.*

作ってもらおうというわけではありません。
ただ、やり方というかヒントが欲しかったのですが。
そうとらわれたのでしたら申し訳御座いません。

SafeArrayCreateでの引数についてどんな値を入れればよいのでしょうか?

編集 削除
Blue  2006-12-07 14:58:44  No: 63854  IP: 192.*.*.*

2006/12/01(金) 10:07:52
で自分でサンプル載せていますけど。

編集 削除
Blue  2006-12-07 15:47:08  No: 63855  IP: 192.*.*.*

>SafeArrayCreate
を使わなくても ReDim(SafeArrayRedim) すればいいかも。
(使ったことないので何もアドバイスできないが。)
ただし、前の6要素を消すということは出来ない(単にサイズを減らすだけ)ので、
データの転記は自分でやる必要があります。

編集 削除
Blue  2006-12-07 17:52:36  No: 63856  IP: 192.*.*.*

>>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 ) ) )
{
    // 成功
}

編集 削除