【问题标题】:Issue in calling VB6 native dll from VB.net Project从 VB.net 项目调用 VB6 本机 dll 的问题
【发布时间】:2012-01-12 04:23:05
【问题描述】:

我有一个 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,但这也不起作用。可能是什么问题,我该如何解决。

【问题讨论】:

  • 你能展示一些调用该函数的代码吗? vb.net的“它不起作用”如何?错误,错误的返回值,它是什么?
  • 函数调用如下: ibOK = TM1ValBoolGet(hUser, voTemp) In VB.net:Declare Function TM1ValBoolGet Lib "tm1api.dll" (ByVal hUser As Long, ByVal vBool As Long) As Integer In vb.net: Public Shared Function TM1ValBoolGet(ByVal hUser As IntPtr, ByVal vBool As IntPtr) As Integer End Function 我没有这个函数的代码,所以不确定其中发生了什么,但函数细节可以在这里看到:publib.boulder.ibm.com/infocenter/ctm1/v9r5m0/topic/…
  • 根据上面的ibm文档链接,如果一切正常,这个函数应该返回1,在vb6它返回1但在vb.net它返回91。我不知道为什么
  • 请编辑您的帖子,而不是在评论中发布代码。该代码实际上是不可读的。
  • @ChrisDunaway 抱歉,事实证明这太难了。现场提到的帮助似乎不适用于我的系统。为了将文本格式化为代码,我按照建议留了 4 个空格,但没有用。然后我插入了 2 个空格来换行,没有用...我什至试图以速率符号写来通知以前的评论者,但这也没有出现在评论中。怎么了,我不知道,我读错了或者压力太大了..我不知道。

标签: vb.net vb6 interop pinvoke


【解决方案1】:

您引用的文档显示:

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 中:

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

【讨论】:

  • 我正在为 x86 环境编译我的代码,并且我有一台 32 位机器。定义 TM1U 和 TM1V 是因为网站解释了参考 C 的函数。但是你可以看看函数是如何在 VB Api 包装器中声明的。 (如上图)有什么想法吗?
  • 我看到了你的声明。无论如何,VB6 Long 数据类型始终是 32 位。但是 IntPtr 数据类型在 x86 上是 32 位,在 x64 上是 64 位,因此我建议它在 .NET 中不起作用的原因。不过,为 x86 编译应该可以防止这种情况发生,所以不太可能。
  • 感谢@tcarvin 我什至在我的 vb.net 项目中将所有 Longs 转换为 Integer,并将所有整数转换为 Int16.. 但仍然不起作用。我已将目标机器从“任何”更改为 x86。但没有变化。错误仍然存​​在。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-27
  • 2021-04-08
  • 2011-12-19
  • 2012-03-04
  • 1970-01-01
相关资源
最近更新 更多