【发布时间】:2017-08-18 21:12:03
【问题描述】:
我有一个第三方提供的测试设备。该设备通过以太网端口连接到计算机,用于在生产环境中测试汽车传感器,该设备提供了 .dll 和 .lib 文件。
当我从 vb.net 中的 dll 调用“connect_function”时,该函数返回一个负数,表示与设备的连接失败。
当我从 vb6 中的 dll 或 C 中的 lib 中调用“连接函数”时,该函数返回零,表示连接成功。
我并不是一个“程序员”,尽管我最终作为制造工程师做了很多编程。我完全无法进一步排除故障。我已经尝试封送数据,直到我脸色发青,但我认为这不是问题,因为调用成功,只是 dll 没有连接。
所以要问的是:vb6 和 c++ 进行函数调用的方式与 vb.net 进行函数调用的方式有什么不同?
更新:2017 年 8 月 22 日: 感谢您的回复!我已经把下面的代码归结为。
在所有情况下,我都没有收到任何编译器错误,但只有在 vb.net 中,dll 才会返回负数。我不明白 dll 是如何知道差异的。
vb.net 代码:
Imports System.Runtime.InteropServices
Module Module1
<DllImport("myDevice.dll")> _
Public Function CreateDeviceObject _
(ByVal deviceType As Integer, _
ByVal deviceNum As Integer, _
ByVal deviceChan As Integer, _
ByVal deviceName As String, _
ByRef pointerToHandle As Integer) As Integer
End Function
End Module
Public Class Form1
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim myHandle As Integer
MsgBox("CreateAPSxObject Returned: " & CreateDeviceObject(2, 1, 1, "yo", myHandle))
End Sub
End Class
VB6 代码:
Private Declare Function CreateDeviceObject Lib "myDevice.dll" _
(ByVal deviceType As Long, _
ByVal deviceNum As Long, _
ByVal deviceChan As Long, _
ByVal deviceName As String, _
ByRef pointerToHandle As Long) As Long
Public myHandle As Long
Private Sub Command1_Click()
MsgBox (CreateDeviceObject(2, 1, 1, "yo", myHandle))
End Sub
C 代码:
#include <stdio.h>
#include <stdlib.h>
int __stdcall CreateDeviceObject (int, int,int,char *,int *);
int main()
{
int myError=0, myHandle;
myError = CreateAPSxObject(2,1,1,"yo",&myHandle);
printf("Return=%d: ",myError);
return 0;
}
【问题讨论】:
-
由于您的 DLL 在 VB6 中工作,因此它必须是 COM DLL。你是从你的 .NET 代码中这样对待它吗?
-
看看这篇 MSDN 文章:Calling COM Components from .NET Clients
-
@STLDeveloper - VB6 几乎可以调用任何使用 stdcall 的 DLL,而不仅仅是 COM DLL。这就是
Declare Function的用途。 -
@CurtisSmith:您能否向我们展示 DLL 的函数声明和您的 VB.NET 版本,以便我们查看和识别可能的问题?本例中VB6和VB.NET的区别主要在于数据类型。
-
由于您没有向我们展示您的代码,我不能肯定地说这是您的问题。是一个整数的大小,在 VB.net 中 long 改变了。在 .net 中,整数是短整数,长整数是整数。
标签: c++ vb.net dll vb6 vb6-migration