DOBON.NET DOBON.NETプログラミング掲示板過去ログ

DLL関数の呼び出し

  • 題名: DLL関数の呼び出し
  • 著者: mezashi
  • 日時: 2008/09/02 11:55:46
  • ID: 22895
  • この記事の返信元:
    • (なし)
  • この記事への返信:
  • ツリーを表示
環境/言語:[VB6,VB2005,WinXPSP3]
分類:[VB6以前]

あるDLLを使って関数を使用しています。
DLLはC++で作成されたものです。
VB2005でコーディングしたときは問題ないのですが
VB6のときは"エラー49,DLLが正しく読み込めません"となります。

VB6の場合(VB2005はLong引数をIntPtrにしています)
Public Declare Sub FB_SetReceiverHWND Lib "FieldBus.dll" Alias "?_FB_SetReceiverHWND@@YAXPAUHWND__@@@Z" (ByVal Hwnd As Long)

Hwnd = FindWindow(vbNullString, WINDOW_NAME)
FB_SetReceiverHWND(Hwnd)

同じコードであるのにVB6で通らないのはなぜでしょうか?
ちなみに今回DDE通信を簡易的に使用したいのでVB6で作成したいと思っています。

ご教授お願いします。
・C++側に「__stdcall」をつけてみる。
・defファイルを作ってみる。

既に上記は行っていらっしゃいますか?
■No22896に返信(もょもとさんの記事)
> ・C++側に「__stdcall」をつけてみる。
> ・defファイルを作ってみる。
>
> 既に上記は行っていらっしゃいますか?

もょもとさん ご回答ありがとうございます。

このDLLファイルは自分で作成したものではなく
ソースも一部かけている(ファイルが足りない)ものしか持っていません。
C++に詳しい方がラッパーしようとしてくれましたが
作成がうまくできなかったようです。

ちなみに私ほとんどC++がわかりません。(^^;)
.defファイルはちなみにあります。

あと答えていただいたのに恐縮ですが、
なぜVB2005で動作してVB6ではエラーが発生するかという点が
とても気になっています。
このDLLをもっていないとわからないですよね・・・・すみません。
■No22901に返信(mezashiさんの記事)
> ■No22896に返信(もょもとさんの記事)
>>・C++側に「__stdcall」をつけてみる。

これをやってうまく行くなら、呼び出し規約が違うから、
ということになると思います。

> なぜVB2005で動作してVB6ではエラーが発生するかという点が
> とても気になっています。

VB6のDeclare文は呼び出し先との規約をstdcallとして扱いますので、
他の呼び出し規約だとうまく行きません。

VB2005のDeclare文ではどうなのかはわかりませんが、
DllImport属性を使ったAPI呼び出しの場合は、呼び出し規約に何を使用するかを明示することができますので、
stdcall以外も利用できます。

> このDLLをもっていないとわからないですよね・・・・すみません。

そうですね。C++側の状況がわからないと何ともいえないですね。
#私ではどのみちC++側見てもわからないですが
  • 題名: Re[4]: DLL関数の呼び出し
  • 著者: mezashi
  • 日時: 2008/09/02 16:55:19
  • ID: 22905
  • この記事の返信元:
  • この記事への返信:
    • (なし)
  • ツリーを表示
■No22903に返信(よねKENさんの記事)
よねKENさん ご回答ありがとうございます。

ちなみにDLLの引数のない関数を呼び出した場合はエラーが発生しませんでした。

> VB6のDeclare文は呼び出し先との規約をstdcallとして扱いますので、
> 他の呼び出し規約だとうまく行きません。
>
> VB2005のDeclare文ではどうなのかはわかりませんが、
> DllImport属性を使ったAPI呼び出しの場合は、呼び出し規約に何を使用するかを明示することができますので、
> stdcall以外も利用できます。

なるほど呼び出し規約が違うということがあるのですか・・・
うーんDllImportは使ってないんですけどねー

DOBON.NET | プログラミング道 | プログラミング掲示板