3

前の質問bad DLL calling conventionで、DLLから関数を呼び出そうとしたときにエラーメッセージが表示され続ける理由を尋ねました。一般的なコンセンサスは、呼び出し規約をに変更する必要があるというものでしたcdecl。理にかなっています。

残念ながら、関数宣言のインポートに直接配置することはできません。「ラッパーDLLを作成する」か「DLLのタイプライブラリを作成する」必要がありました。

私の主な仕事はC#であり、この言語で非常に長い間作業するのはこれが初めてであるため、私はVBに非常に慣れていません。このタスクを実行する方法が正確にわかりません。

ラッパーDLLがどのように役立つかについても混乱しています。おそらく、コードで関数のインポートを装飾することはできませんが、cdeclその正確な関数のインポートを新しいVB6 DLLに移動してから、そのDLLを参照すると、突然機能しますか?

4

2 に答える 2

4

私は実際、この質問はこのトピックに関してより優れていたと思います。

要約すると、「関数宣言のインポートのすぐそこに配置」できますが、VB6 IDE はそのようなことをデバッグする方法を知りません。しかし、コンパイラはそれをうまく処理します。それを dll にコンパイルすると、メイン プロジェクトはコンパイルされた機能にアクセスできます。

おそらく、これらを dll に移動する方法を尋ねていますか? その場合は、「ActiveX Dll」タイプの新しいプロジェクトを作成する必要があります。PwrUSB のような名前を付けます。次に、PwrUSBApi などにクラスを追加します (または、提供されている場合はデフォルト/空のクラスの名前を変更します)。次に、プロパティ ウィンドウで、クラスを GlobalMultiUse に設定します。MDeclares というモジュールで、すべての宣言をドロップします。

'from your other post...
Public Declare Function InitPowerDevice CDecl Lib "PwrDeviceDll.dll" (ByRef firmware() As Byte) As Long

PwrUSBApi クラスに戻ります。

'forward your calls to the dll
Public Function InitPowerDevice (ByRef firmware() As Byte) As Long
   InitPowerDevice  = MDeclares.InitPowerDevice(firmware)
End Function

API からより本格的なオブジェクト モデルを作成することもできますが、すべての API を整理するまでは、この単純なラッパーから始めます。

そうそう、メイン プロジェクトに戻って、新しいラッパー PwrUSB.dll への参照を [プロジェクト] メニューに追加します。次に、コードでは次のように使用します。

Dim numOfDevices as Long 
Dim firmware() As Byte
Redim firmware(0 to 31)
numOfDevices = PwrUSB.InitPowerDevice(firmware)

幸運を。

于 2012-12-18T13:36:11.827 に答える
1

VB6 のラッパー DLL は、CDecl デコレータを使用するか、DLL の関数シグネチャを処理するために作成されたタイプ ライブラリを使用する必要があります。

このための VB6 ラッパーを作成する唯一の利点は、CDecl が効果を持たない VB6 IDE 内から呼び出しプログラムをデバッグしやすくすることです。ラッパーは小さく、ネイティブ コード DLL として一度作成されるため、そこで CDecl が有効になります。

追加の回答については、他のスレッドを参照してください。あなたの本当の問題は、正しい種類の議論を渡していないことだと思います。

于 2012-12-17T19:07:57.350 に答える