VB.NET将字符串数组传递给C函数

时间:2013-06-30 04:05:36

标签: c++ arrays vb.net

想知道如何使用VB.NET以数组作为参数调用C ++函数:

dim mystring as string  = "a,b,c"
dim myarray() as string
myarray = split(mystring,",")
cfunction(myarray)

cfuncton将使用C ++,但由于其他原因我不能在C ++中使用字符串变量类型,我只能使用char。为了正确接收数组并将其拆分回字符串,我的C ++函数应该是什么样的?

2 个答案:

答案 0 :(得分:0)

基本上,创建一些固定内存来存储字符串,并将其传递给您的函数:

Marshal.AllocHGlobal将为您分配一些可以提供给c ++函数的内存。见http://msdn.microsoft.com/en-us/library/s69bkh17.aspx。你的c ++函数可以接受它作为char *参数。

示例:

首先,您需要将字符串转换为一个大字节[],用空值(0x00)分隔每个字符串。让我们通过分配一个字节数组来有效地做到这一点。

Dim strings() As String = New String() {"Hello", "World"}
Dim finalSize As Integer = 0
Dim i As Integer = 0
Do While (i < strings.Length)
    finalSize = (finalSize + System.Text.Encoding.ASCII.GetByteCount(strings(i)))
    finalSize = (finalSize + 1)
    i = (i + 1)
Loop
Dim allocation() As Byte = New Byte((finalSize) - 1) {}
Dim j As Integer = 0
Dim i As Integer = 0
Do While (i < strings.Length)
    j = (j + System.Text.Encoding.ASCII.GetBytes(strings(i), 0, strings(i).Length, allocation, j))
    allocation(j) = 0
    j = (j + 1)
    i = (i + 1)
Loop

现在,我们将它传递给我们使用Marshal.AllocHGlobal分配的内存

Dim pointer As IntPtr = Marshal.AllocHGlobal(finalSize)
Marshal.Copy(allocation, 0, pointer, allocation.Length)

在此处呼叫您的功能。你需要传递你给这个函数的字符串数量。完成后,请记住释放分配的内存:

Marshal.FreeHGlobal(pointer)

HTH。

(我不懂VB,但我知道C#以及如何使用Google(http://www.carlosag.net/tools/codetranslator/),很抱歉,如果有点关闭!:P)

答案 1 :(得分:0)

这个例子在C#中与VB.NET相同,并且它具有C ++方法的声明,如果你想要它可以使用它。 C#: passing array of strings to a C++ DLL