C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: VBからVC作成DLL(doubleポインタ)の呼び出し


(過去ログ 41 を表示中)

[トピック内 10 記事 (1 - 10 表示)]  << 0 >>

■21283 / inTopicNo.1)  VBからVC作成DLL(doubleポインタ)の呼び出し
  
□投稿者/ moro (11回)-(2008/06/30(Mon) 10:39:00)

分類:[VB6 以前] 

いつもお世話になっております。
moroと申します。

VB6からVC6で作成したDLLの呼び出しでエラーが発生し困っています。
VC6でそのDLLを呼び出しした際には正常に動作しました。

VC宣言:
short 関数( double* 配列X, double* 配列Y, int 数値,
      double* 小数点数値1, double* 小数点数値2, double* 小数点数値3);

VC呼び出し:
long 戻り値;
double 配列X[3];
double 配列Y[3];
int 数値;
double 小数点数値1,小数点数値2,小数点数値3;

戻り値 = 関数( 配列X, 配列Y, 数値, &小数点数値1, &小数点数値2, &小数点数値1);

VB宣言:

Public Declare Function 関数 Lib "DLL格納先フルパス"
(ByRef 配列X() As Any, ByRef 配列Y() As Any, ByVal 数値 As Integer,
ByRef 小数点数値1 As double, ByRef 小数点数値2 As double, ByRef 小数点数値3 As double) As Long

VB呼び出し:
 Dim 戻り値 As Long
Dim 数値 As Integer
Dim 配列X(n) As double
Dim 配列Y(n) As double
Dim 小数点数値1 As double
Dim 小数点数値2 As double
Dim 小数点数値3 As double

戻り値 = 関数(配列X(), 配列Y(), 数値, 小数点数値1, 小数点数値2, 小数点数値3)

VBで上記呼び出しで実行した場合、DLLの呼び出しに失敗しましたというエラーメッセージが出力されます。

VBにてVCへ配列を渡すときにはAs Anyで宣言すれば問題ないと考えております。
ですのでdoubleポインタの渡しが正しくないのではないかと考えます。

上記内容についての解決方法をご存知の方がいらっしゃいましたらご教授願います。




引用返信 編集キー/
■21284 / inTopicNo.2)  Re[1]: VBからVC作成DLL(doubleポインタ)の呼び出し
□投稿者/ 鶏唐揚 (215回)-(2008/06/30(Mon) 10:46:09)
2008/06/30(Mon) 10:58:53 編集(投稿者)

No21283 (moro さん) に返信
> 戻り値 = 関数(配列X(), 配列Y(), 数値, 小数点数値1, 小数点数値2, 小数点数値3)
ここなんですが、Cの場合配列変数自体がアドレスを指すので問題ないですが
VB6の場合「『配列の先頭』のアドレスを渡す」という考え方なので

戻り値 = 関数(配列X(0), 配列Y(0), 数値, 小数点数値1, 小数点数値2, 小数点数値3)

になると思います(記憶違いだったらすみません^^;)
引用返信 編集キー/
■21285 / inTopicNo.3)  Re[2]: VBからVC作成DLL(doubleポインタ)の呼び出し
□投稿者/ moro (12回)-(2008/06/30(Mon) 11:14:45)
鶏唐揚さん
ご回答ありがとうございます。

関数の呼び出し部分を
戻り値 = 関数(配列X(0), 配列Y(0), 数値, 小数点数値1, 小数点数値2, 小数点数値3)
に変更したところ以下のエラーメッセージが表示されるようになりました。

コンパイルエラー:型が一致しません。配列またはユーザー定義型を指定してください。

試しに宣言部を以下のように変更してみましたが
戻り値 = 関数(配列X, 配列Y, 数値, 小数点数値1, 小数点数値2, 小数点数値3)
DLLの呼び出しに失敗しましたというエラーメッセージが表示されます。

配列の渡し方を変更したらエラーメッセージが変わるということは
やはり配列X, 配列Yの指定に問題があり、その他の変数は特に問題ないということなのでしょうか。

No21284 (鶏唐揚 さん) に返信
> 2008/06/30(Mon) 10:58:53 編集(投稿者)
>
> ■No21283 (moro さん) に返信
>> 戻り値 = 関数(配列X(), 配列Y(), 数値, 小数点数値1, 小数点数値2, 小数点数値3)
> ここなんですが、Cの場合配列変数自体がアドレスを指すので問題ないですが
> VB6の場合「『配列の先頭』のアドレスを渡す」という考え方なので
>
> 戻り値 = 関数(配列X(0), 配列Y(0), 数値, 小数点数値1, 小数点数値2, 小数点数値3)
>
> になると思います(記憶違いだったらすみません^^;)
引用返信 編集キー/
■21287 / inTopicNo.4)  Re[3]: VBからVC作成DLL(doubleポインタ)の呼び出し
□投稿者/ 鶏唐揚 (216回)-(2008/06/30(Mon) 11:30:12)
No21285 (moro さん) に返信
> コンパイルエラー:型が一致しません。配列またはユーザー定義型を指定してください。
Declare文のAs AnyをAs Doubleに変えてから配列X()、配列X(0)、配列Xの3パターン試してみてください。
(今確認環境がないのでmoroさん任せになってしまいますすみません)

あと、配列だからAs Anyでないといけない、なんてことはないはずなので
他の型を渡す可能性がゼロならばAs Doubleにしておきましょう
(というか、DLL内で型の選り分けしてないなら、As Anyは危ないです)
引用返信 編集キー/
■21289 / inTopicNo.5)  Re[4]: VBからVC作成DLL(doubleポインタ)の呼び出し
□投稿者/ オガシン (9回)-(2008/06/30(Mon) 12:26:41)
Public Declare Function 関数 Lib "DLL格納先フルパス"
(ByVal 配列X() As double, ByVal 配列Y() As double, ByVal 数値 As Integer,
ByRef 小数点数値1 As double, ByRef 小数点数値2 As double, ByRef 小数点数値3 As double) As Long

で定義して

戻り値 = 関数(配列X(), 配列Y(), 数値, 小数点数値1, 小数点数値2, 小数点数値3)

で呼び出すのはどうでしょうか?
引用返信 編集キー/
■21301 / inTopicNo.6)  Re[5]: VBからVC作成DLL(doubleポインタ)の呼び出し
□投稿者/ moro (13回)-(2008/06/30(Mon) 14:49:57)
鶏唐揚さん、オガシンさん ご回答ありがとうございます。

鶏唐揚さんへ
>Declare文のAs AnyをAs Doubleに変えてから配列X()、配列X(0)、配列Xの3パターン試してみてください。
Declare文のAs AnyをAs Doubleに変更して配列X()、配列Xを実行したところ
DLLの呼び出しに失敗しましたというエラーメッセージが表示されます

配列X(0)で実行したところ
コンパイルエラー:型が一致しません。配列またはユーザー定義型を指定してください。
が表示されます。

オガシンさんへ
> 戻り値 = 関数(配列X(), 配列Y(), 数値, 小数点数値1, 小数点数値2, 小数点数値3)
>
> で呼び出すのはどうでしょうか?
上記で実行を試みたのですが、配列の定義をByValに変更した際に、
配列はByRefで宣言してくださいのエラーメッセージが表示されます。


VC作成DLLをVBで呼び出す場合、.DEFファイルが必要ではないかと考え、格納してみましたが
DLLの呼び出しに失敗しましたというエラーメッセージが表示されます。

引き続き調査を行います。




引用返信 編集キー/
■21304 / inTopicNo.7)  Re[3]: VBからVC作成DLL(doubleポインタ)の呼び出し
□投稿者/ よねKEN (159回)-(2008/06/30(Mon) 14:57:10)
No21285 (moro さん) に返信
> 配列の渡し方を変更したらエラーメッセージが変わるということは
> やはり配列X, 配列Yの指定に問題があり、その他の変数は特に問題ないということなのでしょうか。

その他の部分に関してですが、以下の2点修正が必要だと思います。
ByVal 数値 As Integer → ByVal 数値 As Long (Cのint(32bit)はVB6のLong(32bit))
戻り値の「As Long」 → As Integer (Cのshort(16bit)はVB6のInteger(16bit))

引用返信 編集キー/
■21306 / inTopicNo.8)  Re[4]: VBからVC作成DLL(doubleポインタ)の呼び出し
□投稿者/ オガシン (11回)-(2008/06/30(Mon) 15:31:48)
2008/06/30(Mon) 15:36:49 編集(投稿者)
ささっとやってみました

●C++の関数
short WINAPI TestFunction(double aryA[],
		        double aryB[],
		        int cnt,
		        double *paramA,
		        double *paramB,
		        double *paramC
				   )
{
	return 255;
}

●VB6のDeclare文
Public Declare Function TestFunction Lib "ヒミツ\test\test.dll" _
                                                    (ByRef aryA() As Double, _
                                                     ByRef aryB() As Double, _
                                                     ByVal cnt As Integer, _
                                                     ByRef paramA As Double, _
                                                     ByRef paramB As Double, _
                                                     ByRef paramC As Double _
) As Integer


●呼び出しプロシージャ
Private Sub Command1_Click()
    Dim a1(5) As Double
    Dim b1(5) As Double
    Dim pa As Double
    Dim pb As Double
    Dim pc As Double
    Dim ret As Integer
    
    ret = TestFunction(a1, b1, 6, pa, pb, pc)
    MsgBox (ret)
End Sub

上記で255が帰ってきたのでこれを参考にして頂けたらいいのではないでしょうか。
#戻り値の型のバイト数が合ってないかもしれませんのでそこは調整してください。

DEFファイルを格納したとありますが
C++のソースのプロジェクトにちゃんとありますかね?
上記ソースの場合は
EXPORTS
    TestFunction
の2行を書いてビルドしてDLLを作成しました。

DLLの作成に関してはちょっと知識不足なので変なこといってたらすみませんorz

引用返信 編集キー/
■21307 / inTopicNo.9)  Re[5]: VBからVC作成DLL(doubleポインタ)の呼び出し
□投稿者/ moro (14回)-(2008/06/30(Mon) 16:18:52)
オガシンさん、よねKENさん ご回答ありがとうございます。

よねKENさんへ
>その他の部分に関してですが、以下の2点修正が必要だと思います。
>ByVal 数値 As Integer → ByVal 数値 As Long (Cのint(32bit)はVB6のLong(32bit))
>戻り値の「As Long」 → As Integer (Cのshort(16bit)はVB6のInteger(16bit))

上記の通り変更しましたが、結果は同じでした。
やはり配列の渡しがうまくいっていないのだと考えます。
配列の渡しさえうまくいけば上記変更で問題ないのかなと考えます。

オガシンさんへ
>上記で255が帰ってきたのでこれを参考にして頂けたらいいのではないでしょうか。
>#戻り値の型のバイト数が合ってないかもしれませんのでそこは調整してください。

同じようなプログラムを作成したところ正しく値が帰ってきました。
ありがとうございました。
オガシンさんのサンプルと異なるところは配列の宣言箇所がdouble* になっているところです。
サンプルまで作成していただいてある程度解決していますので
double*については引き続き調査して解決します。

みなさんありがとうございました。




解決済み
引用返信 編集キー/
■21309 / inTopicNo.10)  Re[6]: VBからVC作成DLL(doubleポインタ)の呼び出し
□投稿者/ オガシン (12回)-(2008/06/30(Mon) 16:52:06)
2008/06/30(Mon) 16:52:36 編集(投稿者)

解決できたようですので、なによりです。
自分も勉強なりました、、という感じですが(笑

> オガシンさんのサンプルと異なるところは配列の宣言箇所がdouble* になっているところです。
> サンプルまで作成していただいてある程度解決していますので
> double*については引き続き調査して解決します。

調べて解決されるとのことですので、余計なおせっかいかもしれませんが

double* 配列X[]

これで宣言すると配列Xは
double型のポインタを格納する配列となってしまうと思います。

例として
double* 配列X[];
double* a;
double b;
とある場合

配列X[1] = a はOKですが
配列X[1] = b はNGになるはずです。
#配列X[1] = &b はOKだと思います。

moroさんの記述されているDLLだともしかしたら変なアドレスの値を参照してしまうのでは?
と思いましたが....

答えになってないかもしれませんが、参考になれば....
(自分の中でポインタがマイブームなので熱くなってしまいました、すみません)
#うそついてたら他の方がフォローしてくれると思っていますorz
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -