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

根据 C++ 代码使用参数的用途,有几种不同的场景...

第一个参数不一定是Charunsigned char 也可以映射到 Byte(同样,这完全取决于 C++ 代码对参数的作用)。

第二个参数可以是:

UShort 的引用,在这种情况下应使用ByRef params As UShort,或者:

UShorts 的数组,在这种情况下,它映射到 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

将 unsigned char 音频转换为 short

C ++:从wchar_t *转换为unsigned short *是否安全?

如何在 C 中将 short 转换为 unsigned char *buf?