试图从VB调用C DLL。 无法获取参数的一个工作(Trying to call a C DLL

2019-07-05 05:53发布

试图建立一个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

我试图改变固件字节数组,按地址,字符串,整数,长,等它只是似乎并不想运行。

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

Answer 1:

我不能回答你的函数签名困境的其余部分,因为我没有你的任何文件PwrUSBDll.dll

然而“坏DLL调用约定”错误通常意味着你有一个CDecl入口点和VB6只能叫那些有一定的帮助。

有一对夫妇的修正。

最明显的一个是modifiy的来源和使用重新编译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代码它会工作。 P码解释器不处理该关键字。

所以,你可能只是绕过它在IDE运行和测试提供假结果, 可以创建在VB6小包装DLL,你分别编译为本地代码。

注意事项:

对于这个解决您的问题,我们不得不假设您正在传递正确的数据类型在参数列表。 A C ++ int是一个VB6 Long 。 你可能最好通过一个VB6 Byte数组ByRef对于char[8]除非这是一个Unicode DLL入口点。 函数的返回值也是最容易Long



文章来源: Trying to call a C DLL from VB. Can't get one of the parameters working
标签: dll vb6