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


かや  2006-12-07 23:10:51  No: 63849

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


Blue  2006-12-07 23:20:05  No: 63850

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

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


かや  2006-12-07 23:28:01  No: 63851

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


Blue  2006-12-07 23:30:53  No: 63852

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

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


かや  2006-12-07 23:55:16  No: 63853

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

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


Blue  2006-12-07 23:58:44  No: 63854

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


Blue  2006-12-08 00:47:08  No: 63855

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


Blue  2006-12-08 02:52:36  No: 63856

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加