• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:VBのByte配列をVARIANTに格納してCOMでVCに渡したい)

VBのByte配列をVARIANTに格納してCOMでVCに渡したい

このQ&Aのポイント
  • VB6とVC6の間でデータのやり取りを行う際、VB側からByte配列をVariantで渡してVC側で受け取りたいが、うまく値が渡らない状況です。VB側でVariantにByte配列を代入する際に値渡しになっているのか、それとも他の理由があるのか疑問です。
  • VB側でVariantにByte配列を代入する際、値渡しになっている可能性があります。VB側でのメソッドの宣言やODLファイルの定義を確認し、対策を検討する必要があります。
  • ODLファイルを変更して対処する方法もあるかもしれませんが、MFCのウィザードが注意を促しているため、質問をしました。VB側でVariantにByte配列を代入する際の仕組みや値の渡し方を理解する必要があります。

質問者が選んだベストアンサー

  • ベストアンサー
  • liwet
  • ベストアンサー率72% (18/25)
回答No.1

VC側で受け取ったときですが、配列を渡しているので、SafeArrayAccessDataを使ってアクセスするべきだと思います。 参照渡しか、値渡しかで、parrayを使うか、pparrayを使うか変わります。 どちらでもいけるようにすると、こんな感じかな...余分なチェックも入ってる気がするけど (^-^; VARIANT *va; SAFEARRAY *psa; HRESULT hr; VARIANT *pi; if (stream.vt == (VT_VARIANT|VT_BYREF)){ va = stream.pvarVal; } else { va = &stream; } if ((va->vt & VT_ARRAY) != VT_ARRAY){ ThrowError(CTL_E_INVALIDPROPERTYVALUE, "引数が配列ではないぞ", 0); } if (va->vt & VT_BYREF){ psa = *va->pparray; } else { psa = va->parray; } hr = SafeArrayAccessData(psa, (void **)&pi); for(int i=0 ; i<arraylen ; i++){ int type = pi[i].vt; int val = pi[i].cVal // ← 1バイト整数の場合、cValにデータが入る } SafeArrayUnaccessData(psa);

参考URL:
http://program.station.ez-net.jp/special/vc/atl-com/variant.asp,http://www.ops.dti.ne.jp/~allergy/com/com.html
saitoha
質問者

お礼

ご回答ありがとうございます。渡せました! COMの配列がこんなことになってるということ自体を知りませんでした。排他ロックがかかるんですね。 URLを参考に、VC->VBも書いてみました。 // // VC ---> VBのコード // buf: C側のバッファ // bufsize : 渡したい配列の大きさ // SAFEARRAYBOUND bound[1]; rgb[0].cElements = bufsize; rgb[1].lLbound = 0; _variant_t variantStream; variantStream.vt = (VT_ARRAY | VT_UI1); 内部形式をバイト配列とする variantStream.parray = ::SafeArrayCreate(VT_UI1, 1, bound); // Byte配列を作成 char* tmpbuf;   // SafeArrayにアクセスするため一時的に使用するポインタ ::SafeArrayAccessData(variantStream.parray, (void**)&tmpbuf); // アクセス開始 ::RtlCopyMemory(tmpbuf, buf, bufsize); // バッファをSafeArrayにコピー ::SafeArrayUnaccessData(variantStream.parray); // SafeArrayを再びロック ---> variantStreamをVBへ # # まだ、SAFEARRAYBOUNDの意味が微妙によくわかってませんが、 # 一応渡すことができました。ありがとうございます #

関連するQ&A