从VB.net Project调用VB6本机dll的问题

时间:2012-01-12 04:23:06

标签: vb.net vb6 interop pinvoke

我有一个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,但这也不起作用。可能是什么问题以及如何使其发挥作用。

1 个答案:

答案 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位。