ExceLVBAの構造体をC++で作成したDLLに受け渡すには?

解決


ういうい  2005-10-07 06:32:09  No: 59220

お疲れ様です
現在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型以降のメンバは
すべて値がおかしくなってしまいます。


Blue  2005-10-07 08:57:21  No: 59221

VC側ではおそらく、アライメントの関係で、
構造体のサイズがVBのとちがっているのだと思います。
# VCのデフォルト設定で構造体のメンバのアライメントが8バイトになっていますから。

psa->cbElementsとsizeof( employee )を比較してみるとわかると思います。

解決するには、構造体のメンバの並びを換えるか、構造体のアライメントの設定を換えるかすればいいでしょう。

例えば、
typedef struct tagVBSTRUCT{
    long    bl;
    BSTR    cp;
    double  dbl1;
    double  dbl2;
}VBSTRUCT;
にしてみるとか。


ういうい  2005-10-11 17:57:26  No: 59222

メンバの順番を変更することで受け渡しが行えました
回答の方ありがとうございました。


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

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






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