【发布时间】: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 :从技术上讲,您永远无法传递整个数组。数组是引用类型,这意味着一旦你创建了一个新数组,它将在内存中拥有一个特定的位置,并且你总是通过它的引用指针访问那个特定的数组。与引用类型相反的是值类型(如
Integers 和其他结构)。值类型在内存中没有特定位置,因此每次尝试访问时都会创建一个副本。 This answer of mine 包含我刚刚解释的内容的一个相当基本的演示。
标签: c++ vb.net visual-c++