DLLでの引数受け渡し

解決


さとう  2006-07-28 23:14:55  No: 62587

たびたび、質問です。

前回の質問でアドバイスを頂き、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*);
}


Blue  2006-07-28 23:22:59  No: 62588

> 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を扱う。結構面倒)


Blue  2006-07-28 23:27:54  No: 62589


のコードはちょっと忘れてください。
想像で書きすぎました。

単に数字を返すだけならば、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 が入ります。


  2006-07-28 23:33:14  No: 62590

zのアドレスをc(0)に代入してるからでしょう。


さとう  2006-07-29 02:47:30  No: 62591

アドバイスありがとうございました。

参考にさせていただきます。


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

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






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