DLL 如何从不同的编程语言中读取 String 数据类型?

How can a DLL read String data types from different programming languages?

我有一个用 C++ 创建的动态 link 库代码,像这样

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

一个c字符串作为byval传递,它传递字符串中第一个字节的地址。您必须向字符串添加一个空字节 (chr(0)),因为 C 字符串使用它来标识字符串的结尾(因为 CPU 确实如此)。

Com 和 VB 使用 Bstr。 Bstr 是一个 C 字符串,没有空终止字符,有一个 header 包含它的长度。传递 Bstr 您使用 ByRef 传递 header.

的地址

在 VB 中,您可以通过将数组的第一个元素传递给 ByRef 来传递字节数组。

C 字符串、BString 和字节数组都可以包含字符串数据。大多数 VB 字符串函数适用于字节数组。

VB 和 COM 是 unicode。但是 VB 是为 Win95 设计的,而事实并非如此。 API 调用的所有字符串都转换为 ANSI(因此文件、字符串和所有 API 调用都是 ANSI)。

使用字节数组将 unicode 传递给 Windows unicode 函数。

在 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 来判断 window 是否需要 ANSI 或 Unicode 字符串。