|
初めまして、パンチと申します。
計算を速くするために、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;
}
|
|