1

USB 電源タップをセットアップしようとしています。

ドキュメントは次のとおりです。

Initializes the Power USB API.

Name: InitPowerUSB 

Parameters: model:returns the model number(1:basic, 2:digIO, 3:watchdog, 4:Smart), firmware: returns firmware version in ?.? format in a character string (major revision and minor revision) 

Return: >0 if successful. Returns number of PowerUSB devices connected

C++ Example:

if (!m_pwrUSBInit)
{
    int model; char firmware[8];
    if ((ret=InitPowerUSB(&model, firmware)) > 0)
    {
        m_pwrUSBInit = 1;
        m_numDevices = ret;
    }
}

私はこれをVB6コードで約1時間動作させようとしていますが、運がありません。プログラムがクラッシュするか、 などのエラーが表示されBad Calling Dll Conventionますtype mismatch

ここに私が持っているものがあります:

Public Declare Function InitPowerUSB Lib "PwrUSBDll.dll" (ByRef model As Integer, ByVal firmware As String) As Integer

Dim model As Integer
model = 0

Dim firmware As String
firmware = ""

If (InitPowerUSB(model, firmware)) > 0) Then

EndIf

ファームウェアをバイト配列、byref、string、integer、long などに変更しようとしましたが、実行したくないようです。

この問題の解決策を知っている人はいますか? ありがとう

4

1 に答える 1

8

のドキュメントがないため、残りの関数シグネチャの問題に答えることはできませんPwrUSBDll.dll

ただし、「不正なDLL呼び出し規約」エラーは、通常、エントリポイントがCDeclあり、VB6は何らかの助けを借りてのみそれらを呼び出すことができることを意味します。

いくつかの修正があります。

明らかなのは、ソースを変更し、StdCall代わりにそのDLLを使用して再コンパイルすることです。

もう1つは、そのDLLのタイプライブラリを作成することです。これは、問題についてVB6に通知し、問題を解決するのに役立ちます。

次に、VB6の文書化されていないCDeclデコレータを使用するオプションがあります。

Public Declare Function InitPowerUSB CDecl Lib "PwrUSBDll.dll" ( _
    ByRef model As Integer, _
    ByVal firmware As String) As Integer

ただし、欠点は、これがIDE内で実行された場合には機能せず、pコードにコンパイルされた場合にも機能しないことです。pコードインタープリターはこのキーワードを処理しません。

したがって、IDEの実行でそれをバイパスして、テスト用のダミーの結果を提供する、ネイティブコードに個別にコンパイルする小さなラッパーDLLをVB6で作成することができます。

警告:

これで問題を解決するには、その引数リストで正しいデータ型を渡していると想定する必要があります。C++intはVB6Longです。これがUnicodeDLLエントリポイントでない限り、そのためにVB6Byte配列を渡す方がおそらく良いでしょう。関数の戻り値もおそらくです。ByRefchar[8]Long

于 2012-12-14T04:09:26.830 に答える