У меня есть динамический код библиотеки ссылок, который я создал с помощью С++, например
char* _stdcall encrypt(char *plaintext, char *key);
Имя библиотеки - ttvc.
это содержимое файла *.def
LIBRARY ttvc
EXPORTS
encrypt @1
Я пытаюсь вызвать эту функцию из кода vb
Public Declare Function Lock Lib "ttvc.dll" Alias "encrypt"(ByVal plain as String, ByVal key As String)As String
и код delphi
function encrypt(plain:String;key:String;):PChar;stdcall;external 'TTVC.dll';
Мой код работает нормально.
Но я был в замешательстве, в чем разница между строковыми типами данных в Visual Basic, Delphi и C++?
В чем разница между
Как delphi и VB отправляют строки в библиотеку? Как библиотека может получать строки из разных языков программирования и разных типов данных?
От vb
строка ac передается как byval, которая передает адрес первого байта в строке. Вы должны добавить нулевой байт (chr (0)) в строку, так как строки C используют это для идентификации конца строки (потому что процессор делает).
Com и VB использует Bstr. Bstr - это строка C, без символа с нулевым завершающим символом, имеет заголовок, содержащий его длину. Передавая Bstr, вы используете ByRef, который передает адрес заголовка.
В VB вы можете передавать байтовые массивы, передавая ByRef первый элемент массива.
C Строки, BStrings и Byte могут содержать строковые данные. Большинство строковых функций VB работают на байт-массивах.
VB и COM являются unicode. Но VB был разработан для Win95, а это не так. Все строки преобразуются в ANSI для вызовов API (поэтому файлы, строки и все вызовы API - ANSI).
Используйте байтовые массивы для передачи unicode в функции unicode Windows.
В Windows все функции, которые принимают строки ANSI, суффиктируются с помощью A
, а unicode - с W
Функции, которые не принимают строки, не имеют суффикса.
например,
Public Declare Function CreateWindowEx Lib "user32" Alias "CreateWindowExW" (ByVal dwExStyle As Long, lpClassName As Any, ByVal lpWindowName As String, ByVal dwStyle As Long, ByVal X As Long, ByVal y As Long, ByVal nWidth As Long, ByVal nHeight As Long, ByVal hWndParent As Long, ByVal hMenu As Long, ByVal hInstance As Long, ByVal lpParam As Any) As Long
gRtfHwnd = CreateWindowEx(WS_EX_ACCEPTFILES + WS_EX_CLIENTEDGE, barray(0), "", Flags, 0, 0, ScaleX(Me.ScaleWidth, vbTwips, vbPixels), ScaleY(Me.ScaleHeight, vbTwips, vbPixels), Me.hWnd, vbNull, App.hInstance, vbNull)
Windows использует, какой CreateWindows использовался, чтобы определить, требуется ли в окне ANSI или Unicode.