お疲れ様です
現在Excel2000とVc6を使用して作業をしています。
今回ExcelVBAからVc6で作成したDllに構造体のデータを受け渡す
実装が必要になりました。MSDNやこちらの過去ログでdouble型を
使用しなければ受け渡せる用になったのですが、double型のデータを
下記例の用に構造体に使用すると正しく受け渡せなくなってしまいます
何か受け渡しの方法に間違い等ありましたらご指摘のほうよろしく
お願い致します
[VB側]
Public Type tagCPPSTRUCT
bl As long
dbl1 As Double
cp As String
dbl2 As Double
End Type
Public Declare Function sampletest1 Lib "webTestDll.dll"
( l() As tagCPPSTRUCT) As Long
Dim Data(3) As tagCPPSTRUCT
Data(0).bl = True
Data(0).dbl1 = 0.0001
Data(0).dbl2 = 0.0002
Data(0).cp = "AAAAA"
Data(1).bl = False
Data(1).cp = "BBBBB"
Data(1).dbl1 = 0.00001
Data(1).dbl2 = 0.00002
Data(2).bl = True
Data(2).cp = "CCCCC"
Data(2).dbl1 = 0.000001
Data(2).dbl2 = 0.000002
Call sampletest1(Data)
[VC側]
typedef struct tagVBSTRUCT{
long bl;
double dbl1;
BSTR cp;
double dbl2;
}VBSTRUCT;
__declspec(dllexport) long __stdcall sampletest1( LPSAFEARRAY *ppsa )
VBSTRUCT employee;
LPSAFEARRAY psa = *ppsa;
long idx[1], lb, ub;
SafeArrayLock(psa);
SafeArrayGetLBound(psa, 1, &lb);
SafeArrayGetUBound(psa, 1, &ub);
for (idx[0] = lb; idx[0] < ub; idx[0]++) {
SafeArrayGetElement(psa, &idx[0], &employee);
・
・
・
double型を使用しなければSafeArrayGetElement後「employee」に
値が入るのですが、double型を使用するとdouble型以降のメンバは
すべて値がおかしくなってしまいます。
VC側ではおそらく、アライメントの関係で、
構造体のサイズがVBのとちがっているのだと思います。
# VCのデフォルト設定で構造体のメンバのアライメントが8バイトになっていますから。
psa->cbElementsとsizeof( employee )を比較してみるとわかると思います。
解決するには、構造体のメンバの並びを換えるか、構造体のアライメントの設定を換えるかすればいいでしょう。
例えば、
typedef struct tagVBSTRUCT{
long bl;
BSTR cp;
double dbl1;
double dbl2;
}VBSTRUCT;
にしてみるとか。
メンバの順番を変更することで受け渡しが行えました
回答の方ありがとうございました。
ツイート | ![]() |