たびたび、質問です。
前回の質問でアドバイスを頂き、VC++6.0でDLLを作成して
VB6.0で値の取得を行うProgramを作成しています。
下記の文にて問題があります。
VB側で、
1)戻り値が正常に返ってこない
下記の文では、Ret(0)の値を50としたいのですが
まったく違う値。
2)c(1)の値も、目的とした数値にならない
c(0)の値の気がします。
いろいろ悩んだのですが、わからないのです。
分かりにくいかとは思いますが、よろしくお願いします。
**** VB側 ****
---- 標準Module----
Public c(10) As Long
Declare Function least Lib "SAISYOU2.dll" (ByVal a As Long, ByVal b As Long, ByRef c As Long) As Long
---- Form ------
Dim Ret(3) As Long
Ret(0) = least(3, 4, c(1))
**** VC側 DLL ****
----- .cpp ------
SAISYOU2_API long* _stdcall least(long m, long n,long *x)
{
long *z;
z = new long [3];
x[0]=m;
x[1]=n;
z[0]=50;
return z;
----- .h -----
extern "C"{
SAISYOU2_API long* _stdcall least(long, long,long*);
}
> z = new long [3];
xって引数使っていないの?
とりあえず C++ 側で new した値を VBに渡してもダメだと思いますよ。
(GlobalAllocやCTaskMeAllocならできるかもしれないけど)
SAISYOU2_API void _stdcall least( long m, long n, long *x )
{
x[ 0 ] = m;
x[ 1 ] = n;
}
Declare Sub least Lib "SAISYOU2.dll" (ByVal a As Long, ByVal b As Long, ByRef c As Long)
Dim Ret(1) As Long
Call least(3, 4, Ret(0))
MsgBox "Ret(0)=" & Ret(0) & vbCrLf & "Ret(1)=" & Ret(1)
C++側で配列を作りたいならこんな単純な処理ではできませんので。
(SafeArrayを扱う。結構面倒)
↑
のコードはちょっと忘れてください。
想像で書きすぎました。
単に数字を返すだけならば、new して z[ 0 ] = 50;
なんてことはしません。
SAISYOU2_API long _stdcall least(long m, long n,long *x)
{
x[0]=m;
x[1]=n;
return 50;
}
こんだけ。
> Ret(0) = least(3, 4, c(1))
c(1) にしている以上 c(1)に3 が c(2)に4 が入ります。
zのアドレスをc(0)に代入してるからでしょう。
アドバイスありがとうございました。
参考にさせていただきます。
ツイート | ![]() |