我有一个vb6项目,我在其中使用dll库来完成一些任务。为此,我添加了一个声明该库的所有功能的模块,例如:
Declare Function myFunction Lib "abcdapi.dll" (ByVal hVar1 As Long, ByVal hVar2 As Long) As Long
当我调用此函数(以及许多其他类似函数)时,我能够完成工作并更正Long指针返回。但是当我尝试通过VB.net做同样的事情时(通过使用dllimport导入相同的库并调用相同的函数),我得不到任何结果。虽然它确实返回了一些指针但是没有产生正确的结果。
Private Const ABCD As String = "abcdapi.dll"
<DllImport(ABCD)>
Public Shared Function myFunction(ByVal hVar1 As IntPtr, ByVal hVar2 As IntPtr) As IntPtr
End Function
当我尝试调用上面的函数时,它不起作用。我甚至尝试使用该函数在我的vb6项目中创建一个dll,并尝试使用imports关键字来调用新的dll,但这也不起作用。可能是什么问题以及如何使其发挥作用。
答案 0 :(得分:1)
您引用的docos显示:
TM1IMPORT TM1_BOOL TM1API TM1ValBoolGet(TM1U hUser, TM1V vBool );
TM1U和TM1V是否可能在该API中定义为32位数据类型,并且您在64位计算机上运行.NET代码,使IntPtr成为64位数据类型? (如果API附带C头文件,您可以看到如何定义这些数据类型)。尝试将.NET代码重新编译为“x86”并再次尝试。
我刚从上面的评论中复制了此代码:
函数调用如下:
ibOK = TM1ValBoolGet(hUser, voTemp)
在VB.net中:&lt;&lt;&lt;我在这里假设你的意思是VB6
Declare Function TM1ValBoolGet Lib "tm1api.dll" (ByVal hUser As Long, ByVal vBool As Long) As Integer
在vb.net中:
<DllImport(TM1APIDLL)> Public Shared Function TM1ValBoolGet(ByVal hUser As IntPtr, ByVal vBool As IntPtr) As Integer
End Function
这可能是一个错字,但VB6中的返回类型与VB.NET中的返回类型不同。 VB6 Integer为16位,VB.NET中的Integer为32位。