VBからDLL関数を呼びたいが引数がポインタのポインタなんですが


二ノ宮  2007-05-28 18:37:49  No: 98814

VBからDLL関数を呼びたいのです。 
DLL関数 
AD_Open_ADSys(PCI_CONFIG_HEADER_0 **);  となっています。 
ポインタのポインタです。

PCI_CONFIG_HEADER_0 は構造体です。

1.VB側で 
Declare Function AD_Open_ADSys Lib "ADDLL.DLL" (ByRef Config As Long) As Long 
と宣言して呼んでも、DLLが正しく読めませんというエラーとなります。 
2.**はCでポインタのポインタですが、VBではどのような方法で扱えばいいのでしょうか? 

宜しくお願いします。


大吉末吉  2007-05-28 19:36:33  No: 98815

> 2.**はCでポインタのポインタですが、VBではどのような方法で扱えばいいのでしょうか?

VBでは「ポインタを扱う」事はできませんが、
要はDLLに「構造体を示すアドレスを格納した変数のアドレス」を渡せばよいのですよね。

#VB6と仮定して、
隠し関数の「VarPtr関数」で構造体のアドレスを求めて、
Long型変数に代入して、
そのLong型変数を参照渡しで渡すとか・・・


K.J.K.  2007-05-28 19:43:16  No: 98816

VBのバージョンは何でしょう?

VB6以前とVB.NETではIntegerやLongのサイズが異なりますので、
VB6以前用の定義そのままでVB.NETを使うと、そのエラーが発生します。

そうではなく、VB6以前で上記のエラーが発生しているとすれば、引数の
数やサイズには問題がないのならば、その関数はcdecl呼び出し規約を
使っている可能性もあります。

二重ポインタは、VB6以前だとポインタをLong型で受けて、それを構造体に
コピーするのが無難でしょう。VB.NET以降ならば様々な手段がとりえると
思います。

で、マルチポストであるとはいえないのかも知れませんが、他で質問して
有効な回答を得られなかったとしたら、両方にその旨を記しておくべきでは。


二ノ宮  2007-05-28 19:58:51  No: 98817

ご意見ありがとうございます。
バージョンは、VB6を使用しています。


K.J.K.  2007-05-28 20:34:49  No: 98818

ちなみにOSの種類は? 2000やXPだと、例えば"AD680_Open_ADSys"のように関数名も変わったりしません?


K.J.K.  2007-05-28 20:37:53  No: 98819

って、別の製品かも知れないですね。そもそもどこの製品のを使っている
のでしょうか? また、そこには付属のVB用サンプルはありませんか?


二ノ宮  2007-05-28 20:50:15  No: 98820

OSは2000です。
この製品は、PCIに入るADボードで、大手メーカー製品ではありません。
委託製造の会社です。
サンプルは、VCで記述されているのです。
VCでは動作しています。
何年も前の製品なので、聞いてもわからなくて。


K.J.K.  2007-05-28 21:40:14  No: 98821

だとすると、おそらくはcdecl呼び出し規約を使っているのだと
思いますよ。VB6で使うのならばOn Error Resume Nextで流して
しまうとか。


二ノ宮  2007-05-28 21:58:50  No: 98822

K.J.Kさま
ありがとうございます。
何とか使用できる状態を探して、使用してみます。


Blue  2007-05-29 20:01:03  No: 98823

>http://park7.wakwak.com/~efc21/cgi-bin/exqalounge.cgi?print+200705/07050169.txt
明らかに私の解答を受けてから、こちらにポストしていますよね?
あちらでは有効な解答がもらえないと踏んだのでしょうか?(カナリ失礼)

環境がVB6なのでこちらに移動したのであれば、
あちらに移動したとのことを記述しましょう。


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

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






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