Как передать параметр char в C DLL из приложения VB6? - PullRequest
3 голосов
/ 13 мая 2019

Я пытаюсь вызвать функцию C в моем приложении VB6.Проблема в том, что эта функция принимает простой char в качестве параметра.Не char указатель массива (char *), а обычный char.

Вот как он объявлен:

#define FM_API extern "C" int _stdcall
FM_API NVF_SetGroupFormat(char *aMarker, char aDecSeparator, int aDigits)

Возвращает -1, если выполнение было успешным, и 0, если выполнениенет.

В самом начале я делал то, что всегда делаю - просто объявил это и все.

Это было мое заявление:

Declare Function SetGroupFormat Lib "C:\Libs\FM_API.dll" Alias "NVF_SetGroupFormat" (ByVal lMarker As String, ByVal lDecSeparator As String, ByVal lDigits As Integer) As Integer

Но это всегдавернул 0 (ошибка / ложь).

Я подумал, что что-то не так с параметрами, которые я передал.Я позвонил автору dll за советом и рассказал ему, как я передаю свои параметры.Это вызов этой функции:

Dim lSt As Integer
lSt = SetGroupFormat("=;\n", ".", 0)

Автор сказал мне, что этот вызов правильный, но он сказал мне, что мое объявление «вероятно» неверно, потому что я объявил lDecSeparator As String, но это должен быть символ.

Основная проблема заключается в том, что char не существует в VB6.

Как объявить и передать char в Dll на основе ac из кода VB6?

1 Ответ

4 голосов
/ 13 мая 2019

В VB6 вы можете использовать строки фиксированной длины для этой цели:

Declare Function SetGroupFormat Lib "C:\Libs\FM_API.dll" Alias "NVF_SetGroupFormat" ( _
    ByVal lMarker As String, _
    ByVal lDecSeparator As String * 1, _
    ByVal lDigits As Integer _
) As Integer

По общему признанию, это было давно, так как я использовал VB6, и мои знания немного устарели;если приведенный выше синтаксис не поддерживается, то определенно сработает следующее:

Type SingleChar
    Value As String * 1
End Type

Declare Function SetGroupFormat Lib "C:\Libs\FM_API.dll" Alias "NVF_SetGroupFormat" ( _
    ByVal lMarker As String, _
    ByVal lDecSeparator As SingleChar, _
    ByVal lDigits As Integer _
) As Integer

В качестве альтернативы вы также можете использовать тип данных Byte для представления одного 8-битного значения, эквивалентного charво внешнем API.Если после этого происходит сбой вызова, это связано с чем-то другим, не связанным с типом параметра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...