Объявление строки определенной длины - PullRequest
0 голосов
/ 18 октября 2019

Из Visual Basic мне нужно вызвать функцию в динамически подключаемой библиотеке (DLL), которая реализована в C. Функция C имеет сигнатуру

uint32_t F(char **str);

, где str - этовыходной параметр. Ожидается, что массив *str будет иметь длину не менее n символов. На стороне Visual Basic функция объявлена ​​как

<DllImport("lib.dll", CallingConvention:=CallingConvention.Cdecl)> _
Public Shared Function F(ByRef str As String) As UInteger
End Function

Как мне объявить строку длины n в Visual Basic, которая совместима с формальным параметром функции C F ?

Редактировать: вызов функции работает должным образом, если я объявлю фактический параметр как, например,

Dim str As String = "          "

при условии, что n равно 10. Однако n является переменной.

Ответы [ 3 ]

2 голосов
/ 18 октября 2019

String в VB - это на самом деле BSTR на стороне C, которая является структурой в Windows API.

На стороне C вы используете функции Windows, такие как SysAllocString, для производстваBSTR и освободите память с помощью SysReleaseString.

. Вы не сможете (легко) взаимодействовать с uint32_t F(char **str); между C и VB.

Дальнейшее чтение: https://docs.microsoft.com/en-gb/previous-versions/windows/desktop/automat/string-manipulation-functions

1 голос
/ 21 октября 2019

Как упомянуто TnTinMn в одном из комментариев, объявите фактический аргумент следующим образом:

Dim str As New String(ChrW(0), n)
1 голос
/ 19 октября 2019

Вы можете дополнить строку n пробелами.

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    Dim s As String = ""
    Dim n As Integer = 10
    Dim paddedStr = s.PadRight(n)
    Debug.Print(paddedStr.Length.ToString) 'Prints 10
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...