Excel VBA質問箱 IV

当質問箱は、有志のボランティア精神のおかげで成り立っています。
問題が解決したら、必ずお礼をしましょうね。
本サイトの基本方針をまとめました。こちら をご一読ください。

投稿種別の選択が必要です。ご注意ください。
迷惑投稿防止のため、URLの入力を制限しています。ご了承ください。


5733 / 13645 ツリー ←次へ | 前へ→

【49163】構造体でDLLに値を渡す方法 パンチ 07/5/25(金) 17:51 質問[未読]
【49182】Re:構造体でDLLに値を渡す方法 neptune 07/5/26(土) 15:35 回答[未読]
【49190】Re:構造体でDLLに値を渡す方法 パンチ 07/5/27(日) 5:01 お礼[未読]

【49163】構造体でDLLに値を渡す方法
質問  パンチ  - 07/5/25(金) 17:51 -

引用なし
パスワード
   初めまして、パンチと申します。

計算を速くするために、EXCEL(VBA)からVC++2005で作ったDLLに値を投げて、計算結果をEXCEL上に投げ返すプログラムを作っています。
例えば、EXCELでa=1,b=2を定義して、DLLからa+bの値を返すようなプログラムは、過去レスを参考にして以下のように作れました。

**VBA側**
Declare Function TEST Lib "test.dll" Alias "?TEST@@YGNNN@Z"; (ByVal a As Double, ByVal b As Double) As Double

Public Sub sum()
  
  Dim a As Double
  Dim b As Double
  a = 1
  b = 2
  
  Cells(1, 1).Value = TEST(a, b)
  
End Sub


**DLL側**(関数の所だけを示しています))
__declspec (dllexport) double WINAPI TEST(double a,double b)

{
    double c;
    c=a+b;
    return c;
}

しかし、これでは値が一つ(c)しか帰ってこないため、複数の値(例えば、c=a+bとd=a-bなど)を返すようなプログラムを作りたいと思っています。
たぶん構造体を使って書くんだろうと思いまして、
microsoft.com/japan/msdn/columns/office/office03082001.aspx
「DLL 関数にユーザー定義型を渡す」
を参考に作ったのですが、以下のプログラムではRecord.c=Record.d=0となって返ってきてしまいます。
こういった方法をご存じの方がいましたら、ご教授いただければと思います。

**VBA側**
Declare Sub Point Lib "point.dll" _Alias "?Point@@YG?AUkouzou@@XZ" (outdata As tei)

Type tei        ' 構造体
  a As Double       
  b As Double
  c As Double
  b As Double
End Type

Public Sub sum()
  Dim Record As tei
  
  Record.a = 1
  Record.b = 2
  
  Point Record 'HPにはこういった書き方で更新されると書いてあるが、本当か?
  
  Cells(1, 1).Value = Record.c
  Cells(2, 1).Value = Record.d
End Sub


**DLL側**(関数の所だけを示しています))

struct kouzou{
    double a ;
    double b ;
    double c ;
    double d ;
}tei;

__declspec (dllexport) kouzou WINAPI Point()

{
    tei.c=tei.a+tei.b;
    tei.d=tei.a-tei.b;
    return tei;
}

【49182】Re:構造体でDLLに値を渡す方法
回答  neptune  - 07/5/26(土) 15:35 -

引用なし
パスワード
   こんにちは

久しぶりに書いたので忘れきっていました。思い出す良い機会でした。
私も聞かれても殆ど説明できませんから各コマンドの詳しくは
MSDNで調べて下さい。

一応動作確認はしてます。こんなので良いんですかね?

/*C*/
/*defファイル*/
LIBRARY   VBDLL
EXPORTS
       dllTypetest

/*Test用cppファイル*/
/*VC6でWin32 DDL作成
#include "stdafx.h" //自動的に作られるヘッダーファイル
#define WINAPI __stdcall

struct kouzou{
        double a ;
        double b ;
        double c ;
        double d ;
        double ans;
}tei;

__declspec( dllexport ) int __stdcall dllTypetest(kouzou *);

BOOL APIENTRY DllMain( HANDLE hModule,
            DWORD ul_reason_for_call,
            LPVOID lpReserved
                     )
{
  return TRUE;
}

//int型を返していますが、構造体も返すことができます。
__declspec( dllexport ) int WINAPI dllTypetest(kouzou *pkouzou)
{
        pkouzou->ans = pkouzou->a + pkouzou->b + pkouzou->c + pkouzou->d;
        return 0;
}
'VB
Private Type kouzou
  a As Double
  b As Double
  c As Double
  d As Double
  ans As Double '戻り値用
End Type

'Dllのパスは適当に書き換えてください。
Declare Function dllTypetest Lib "D:\programings\VBDLL.dll" (typ As kouzou) As Long

Sub t()
Dim typ As kouzou
Dim ret
  With typ
    .a = 1
    .b = 2
    .c = 3
    .d = 4
    .ans = 0
  End With
  ret = dllTypetest(typ)
  MsgBox typ.ans
End Sub

【49190】Re:構造体でDLLに値を渡す方法
お礼  パンチ  - 07/5/27(日) 5:01 -

引用なし
パスワード
   お返事ありがとうございます。

試してみたところ、無事にできました。ありがとうございました。

5733 / 13645 ツリー ←次へ | 前へ→
ページ:  ┃  記事番号:
2610219
(SS)C-BOARD v3.8 is Free