Delphiで作成されたDLLをVBで使用sするには

解決


ダイアシス蔵  2003-08-12 08:46:19  No: 79000

ご存知な方いましたら教えてください。
 現在、VB6.0を使用してDELPHIで作成したDLLを使いたいのですが一応以下のように
 Declare文で
 Public Declare Sub Initial_Opereation Lib "D:\マスター\Master.dll" (ByVal EXENAME As String)とフルパス指定でファイルを指定しているのですが実行されている形跡がありません。
 Delphiで作ったものは駄目なのかまたは、上の文が誤りなのか、ご存知な方いましたら教えてください


nanashi  2003-08-12 23:19:29  No: 79001

> Delphiで作ったものは駄目なのかまたは、上の文が誤りなのか、ご存知な方いましたら教えてください

Delphi製のDLLも使えます。
私も最近Delphiを使い始めたんですが、問題無く使えてます。

> 実行されている形跡がありません。

と言われても「実行して無いんじゃないでしょうか?」としか言えません。
Delphiで簡単なFunctionを作って戻り値を確認してみればVBから使えることは分かると思います。

DLLの関数を呼び出すところをちゃんと通っているかどうか、
また、希望通りの動作をしないならDLL側の作りをもう一度確認した方がいいと思います。


ダイアシス蔵  2003-08-13 01:51:30  No: 79002

nanashiさん、お返事ありがとうございます。

再度、VB側でDLLの関数呼出しているかなど確認してみました。その結果DLL側の問題で実行されないことが判り訂正できました。アドバイスありがとうございます。

上記のDLLはクリアしたのですが、他のDLLでは引数として構造体の変数を
渡すものがあるのですが、これもDLLが正しく呼出しできないというエラーが発生します。

自分は構造体が何か関係しているのではないかと考えているのですが良く判りません。
Declare文ではByRefで変数を宣言していますがそれだけでは不足なのでしょうか?
構造体はinteger型,string型の2種類で構成されています。

重ね重ねで申し訳ありませんが、教えてください。


nanashi  2003-08-13 02:31:31  No: 79003

まだ構造体をDLLに渡したりしたことがないのでハッキリとは分かりませんが
String型に関わるエラーでしょうか?

ちょっと私では役不足だと思うので、
下記のスレに似たような投稿がありましたのでご参考ください。

http://madia.world.coocan.jp/vb/vb_bbs/200206_02060011.html


ダイアシス蔵  2003-08-13 02:37:10  No: 79004

nanashi さん  早速のご返事ありがとうございます。
スレを参考に探ってみたいと思います。

誠にありがとうございます。


魔界の仮面弁士  2003-08-13 02:54:30  No: 79005

> これもDLLが正しく呼出しできないというエラーが発生します。
これは、Declare宣言に誤りがある事を示しています。
データ型や引数の数に誤りが無いかを確認してください。

例えば、
  Declare Function GetCursorPos Lib "user32" (ByRef lpPoint As POINTAPI) As Long
と書くつもりで、
  Declare Function GetCursorPos Lib "user32" (ByRef lpPoint As POINTAPI)
のようなコードを書いた場合などに、そのようなエラーが発生します。

> 自分は構造体が何か関係しているのではないかと考えているのですが良く判りません。
> Declare文ではByRefで変数を宣言していますがそれだけでは不足なのでしょうか?
DLL側の仕様がわからない事には、何とも言えませんね。。。

例えばDLL側が、構造体を値渡しのデータとして要求するような場合は、
ByRefは使えないので、下記の資料のように、ユーザー定義型の各メンバを
スタックに積み上げて配置する必要があります。
http://support.microsoft.com/?kdid=161301

> 構造体はinteger型,string型の2種類で構成されています。
これらは、VB6の Integer型、String型の事でしょうか。
その場合はまず、アライメントに気を付けてください。
VBはシングルバイトアライメントになっていないので、たとえば、
  A As Integer
  B As Integer
  C As String
のように、Integerが2つ連続で並んでいる場合は良いですが、
  A As Integer
  B As String
  C As Integer
のように、Integerが奇数個単位で配置されている場合は、2バイト単位ずつ
データがずれてしまう可能性があります。

それから、String型フィールドが、固定長なのか自由長なのかも
確認してください。自由長の場合は、DLLの呼び出し前に、
Stringメンバを初期化しておく必要がありますので。


ダイアシス蔵  2003-08-13 04:42:01  No: 79006

魔界の仮面弁士さん  ご返事ありがとうございます。

DLL側の構造体は値渡しの仕様になっておりますのでhttp://support.microsoft.com/?kdid=161301を参照してみたいと思います

Integer型,String型も確認してみます。

貴重なアドバイスを誠にありがとうございます。これらのアドバイスを元に
探っていきたいと思います。


魔界の仮面弁士  2003-08-13 06:31:03  No: 79007

失礼しました。
  http://support.microsoft.com/?kdid=161301
ではなく、
  http://support.microsoft.com/?kbid=161301
です。


nanashi  2003-08-13 21:46:05  No: 79008

Integer型、String型を含む構造体を扱う 簡単なDLLを作って試してみましたが
特に問題も無く動きました。
DLL側はString型を使わず、PCharやArray of Charを使えば大丈夫そうです。

ご存知だとは思いますが、
VBのInteger型はDelphiではSmallint型、
VBのLong型はDelphiではInteger型なので、この辺りにも気をつけて下さい。


ダイアシス蔵  2003-08-15 00:30:37  No: 79009

やっとDLLを実行させることができました。

nanashi さん、魔界の仮面弁士さんいろいろなアドバイスを頂きましたこと
誠にありがとうございました。

今後も質問等あるとかと思いますので宜しくお願いいたします。


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

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






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