VBで使うDLLをVCで作りました。
VC側で
static keisoku{
int i;
float data[37][99];
};
〜funcmeasure(int j,keisoku *mv){
…
mv->i = 〜;
mv->data[0][2] =〜;
…
}
としました。
VBで、アドレスで渡したい時Byrefと書いてあったのでByref mp as keisoku
としました。
Private type keisoku
i as integer
data(37,99) as double
end type
です。
VBで、mp.iの値は正常なのですが、配列の方がに値が入ってくれません。
配列にすると動きません。なぜですか?
参考資料
int は4バイト
float は4バイト
data[37][99]は要素が0〜36と0〜98で要素数37×99=3663
integer は2バイト
double は8バイト
Option Base = 0 の場合
data(37,99)は要素が0〜37と0〜99で要素数38×100=3800
構造体で受け渡しするのなら、
アラインメントも考慮する必要があります。
とりあえず,
Integer@VB <--> short int@VC++
Double@VB <--> double@VC++
だろ,とか
float data[37][99];とdata(37,99) as double
では確保する数が違うし順番も逆だろ,
ということもありますが,
まずは
Microsoft Knowledge Base JP410837
[VB5] Visual Basic 5.0 から呼び出し可能な DLL の作成例
を見てみることをお勧めします。
おそらく,
#pragma pack(4);
struct keisoku {
short int i; LPSAFEARRAY data;
};
#pragma pack()
ではないかと。
ツイート | ![]() |