![](http://oshiete.xgoo.jp/images/v2/pc/qa/question_title.png?e8efa67b6d)
OS: WinXP sp2
開発: VB6 sp5 <--> VC6 sp5 MFC OCX
いままでVB/VC間のデータのやりとりをStringで行っていたアプリがありまして、現在はVB側から見たインターフェースをByte()へ変更する作業を行っています。
まず VB --> VC に関して質問ですが
Dim byteStream(5) As Byte
byteStream(0) = 1
byteStream(1) = 2
byteStream(2) = 3
byteStream(3) = 4
byteStream(4) = 5
などとし、メソッドに対してbyteStreamをVariantで渡してやって
C側から const VARIANT FAR& で参照してきて、
この.pcVal(配列の先頭アドレスが入っているはず)をchar*で受け取ろうと思いました。
するとこのアドレスには、先頭のbyteStream(0)の値しか入ってきません。
VB側でVariant = Byte()とするときに値渡しになっているっぽい?のですが、仕組みがわかりません。
この理由が知りたいです。
ODLファイルを変更して対処すべきかもしれませんが、MFCのウィザードが「慎重に行ってください。」とコメントしているので質問させていただきました。
VB側でのメソッドの宣言:
Function SendVariantStream(stream, length As Integer) As Boolean
odlファイルでの宣言:
boolean SendVariantStream(VARIANT stream, short length)
VCの宣言:
BOOL SendVariantStream(const VARIANT FAR& stream, short length);
No.1ベストアンサー
- 回答日時:
VC側で受け取ったときですが、配列を渡しているので、SafeArrayAccessDataを使ってアクセスするべきだと思います。
参照渡しか、値渡しかで、parrayを使うか、pparrayを使うか変わります。
どちらでもいけるようにすると、こんな感じかな...余分なチェックも入ってる気がするけど (^-^;
VARIANT *va;
SAFEARRAY*psa;
HRESULThr;
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の配列がこんなことになってるということ自体を知りませんでした。排他ロックがかかるんですね。
URLを参考に、VC->VBも書いてみました。
//
// VC ---> VBのコード
// buf: C側のバッファ
// bufsize : 渡したい配列の大きさ
//
SAFEARRAYBOUNDbound[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が見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・「I love you」 をかっこよく翻訳してみてください
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・昔のあなたへのアドバイス
- ・かっこよく答えてください!!
- ・あなたが好きな本屋さんを教えてください
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数から配列を返すには?
-
構造体のextern方法
-
MFC - ダイアログボックスのPic...
-
define で 配列
-
Cのエラー
-
C言語の配列のコピーについて質...
-
MFCのCArrayを使った二次元配列
-
C言語の穴埋め問題です
-
C言語から質問です。
-
コンボボックスでデフォルト値...
-
IPアドレスを配列に代入する方法。
-
fclose()でセグメンテーション違反
-
配列の要素数に変数を入れたい...
-
VBのByte配列をVARIANTに格納し...
-
DxlibのLoadgraph()を使ったsta...
-
関数が呼び出されるごとに文字...
-
RAW画像高速表示について
-
char*を初期化したいのですが
-
System.IO.Directory.GetFiles...
-
VBAのプログラムで、DIAG = 1# ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数から配列を返すには?
-
配列の要素数に変数を入れたい...
-
c言語
-
c言語プログラミング 等差数列...
-
define で 配列
-
構造体のextern方法
-
C#で構造体の配列を持った構造...
-
C言語において、 配列要素をひ...
-
MFC - ダイアログボックスのPic...
-
C言語の2次元配列 容量が大き...
-
2次元配列のマスを数える方法...
-
C言語 ファイルの指定された行...
-
Cのエラー
-
コンボボックスでデフォルト値...
-
C#で配列が空かを判定するには?
-
C#でのフィボナッチ数列
-
ポインタを使って構造体の配列...
-
C言語の課題が出たのですが自力...
-
MFCのCArrayを使った二次元配列
-
C言語の配列のコピーについて
おすすめ情報