如何将 unsigned short* 从 Visual-C++ DLL 传递到 VB.NET
Posted
技术标签:
【中文标题】如何将 unsigned short* 从 Visual-C++ DLL 传递到 VB.NET【英文标题】:how to pass unsigned short* from Visual-C++ DLL to VB.NET 【发布时间】:2017-07-21 00:01:56 【问题描述】:我的 VB.NET 2017 windows 窗体应用程序需要与 Visual-C++ DLL(也是 VS2017)函数 Read_Parameters() 接口,该函数接受两个参数:board# 和指向 256 个元素的参数数组的指针,其中每个参数都是无符号的短的。 如何将匹配的 VB.NET 指针声明为无符号短表?
视觉-C++ 声明:
int Read_Parameters(unsigned char board, unsigned short *params)
...
return something;
相应的 VB.NET 声明
<DllImport("MuseDll.dll")>
Public Shared Function test_Read_Parameters(ByVal board As Byte, ByVal params As UShort()) As Int32
End Function
VB.NET 代码....
Private Sub Button_test_main_board_Click(sender As Object, e As EventArgs) Handles Button_test_main_board.Click
Dim return_status As Int32
Dim board_index As Byte
Dim parameter_table(256) As UShort
parameter_table(0) = 2
board_index = 1
return_status = main_board_interface.NativeMethods.test_Read_Parameters( board_index, parameter_table)
If return_status = 513 Then
TextBox_main_board_comm.Text &= "test_return_int return OK =" & return_status & vbCrLf
Else
TextBox_main_board_comm.Text &= "test_return_int return FAULT!! = " & return_status & vbCrLf
Return
End If
return_status 应该是 513,但每次都是不同的大 #
【问题讨论】:
很可能是给定函数名的数组,所以是ByVal UShort()。请注意,它不知道数组有多大。这是相当冒险的,如果你传递的数组太短,那么它会破坏 GC 堆。胸怀大志。 board 参数应该是字节。与本机代码的所有者交谈,很可能有人已经这样做了。 “我遇到了敌人,他们就是我们。”我可以控制 DLL 和 VB 源。再次感谢汉斯! 其实我不想传数组,我想传一个指向数组的指针,原因很明显。 你的答案(以及文森特的第四个场景),汉斯。而且我认为它只是传递指针而不是整个短数组。 @DougNull :从技术上讲,您永远无法传递整个数组。数组是引用类型,这意味着一旦你创建了一个新数组,它将在内存中拥有一个特定的位置,并且你总是通过它的引用指针访问那个特定的数组。与引用类型相反的是值类型(如Integer
s 和其他结构)。值类型在内存中没有特定位置,因此每次尝试访问时都会创建一个副本。 This answer of mine 包含我刚刚解释的内容的一个相当基本的演示。
【参考方案1】:
根据 C++ 代码使用参数的用途,有几种不同的场景...
第一个参数不一定是Char
。 unsigned char
也可以映射到 Byte
(同样,这完全取决于 C++ 代码对参数的作用)。
第二个参数可以是:
对UShort
的引用,在这种情况下应使用ByRef params As UShort
,或者:
UShort
s 的数组,在这种情况下,它映射到 ByVal params As UShort()
。 -- 看到参数名为params
("parameters") 我觉得这个选项最有可能。
所有四种情况:
<DllImport("MuseDll.dll")>
Public Shared Function Read_Parameters(ByVal board As Char, ByRef params As UShort) As Integer
End Function
<DllImport("MuseDll.dll")>
Public Shared Function Read_Parameters(ByVal board As Byte, ByRef params As UShort) As Integer
End Function
<DllImport("MuseDll.dll")>
Public Shared Function Read_Parameters(ByVal board As Char, ByVal params As UShort()) As Integer
End Function
<DllImport("MuseDll.dll")>
Public Shared Function Read_Parameters(ByVal board As Byte, ByVal params As UShort()) As Integer
End Function
【讨论】:
第四个场景,文森特。谢谢! (顺便说一句,我是瑞典人的 1/4,还不算太寒酸) @DougNull:很高兴我能帮上忙! “Lycka 直到!” ;) -- 我很想知道你是瑞典人的 1/4 吗? (如果你是 1/2,我会理解的)- 你有瑞典祖父母吗?以上是关于如何将 unsigned short* 从 Visual-C++ DLL 传递到 VB.NET的主要内容,如果未能解决你的问题,请参考以下文章
将 Long 转换为 Unsigned Short Int / Strtol
将 unsigned short * 转换为 unsigned int *
fortran 如何定义 unsigned short integer