Как DLL может читать строковые типы данных из разных языков программирования?

0

У меня есть динамический код библиотеки ссылок, который я создал с помощью С++, например

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++?
В чем разница между

  • Строка в VB
  • char * в C++
  • Строка в delphi
  • PChar в delphi

Как delphi и VB отправляют строки в библиотеку? Как библиотека может получать строки из разных языков программирования и разных типов данных?

  • 1
    Ваш код не работает. Вы не можете освободить строку, и код .net пытается освободить ее, используя CoTaskMemFree. Вы можете сделать так, чтобы вызывающая сторона выделяла выходной буфер и использовала StringBuilder. Или используйте COM BSTR.
  • 1
    @cahyo: почему вы используете char в C ++ и string в Delphi? Это будет работать в не-Unicode Delphi, потому что строка AnsiString и нет преобразования между PChar. Но когда вы используете Unicode Delphi (2009+), строка - это UnicodeString. Вы должны использовать тот же тип, который PAnsiChar. Вы также можете искать в stackoverflow ... stackoverflow.com/questions/237106/…
Показать ещё 1 комментарий
Теги:
dll
vb6

1 ответ

2
Лучший ответ

От 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.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню