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 代码进行大约一个小时的工作,但没有运气。该程序要么崩溃,要么显示错误,例如Bad Calling Dll Conventiontype 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、字符串、整数、长整数等。它似乎不想运行。

有谁知道这个问题的解决方案?谢谢

4

1 回答 1

8

我无法回答您其余的函数签名问题,因为我没有您的PwrUSBDll.dll.

然而,“Bad DLL calling convention”错误通常意味着您有一个CDecl入口点,而 VB6 只能在一些帮助下调用这些入口点。

有几个修复。

显而易见的一个是修改源代码并使用重新编译该 DLL StdCall

另一种方法是为该 DLL 创建一个类型库,这有助于将问题告知 VB6 并解决它。

然后您可以选择使用 VB6 的未记录 CDecl 装饰器:

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

然而,缺点是这在 IDE 中运行时不起作用,编译为 p-code 时也不起作用。p 代码解释器不处理这个关键字。

因此,您可以在 IDE 运行中绕过它并提供虚拟结果进行测试,或者您可以在 VB6 中创建一个小型包装 DLL,将其单独编译为本机代码。

注意事项:

为此,为了解决您的问题,我们必须假设您在该参数列表中传递了正确的数据类型。C++int是 VB6 Long。除非这是一个 Unicode DLL 入口点,否则你最好传递一个 VB6Byte数组。函数返回值也最有可能。ByRefchar[8]Long

于 2012-12-14T04:09:26.830 回答