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++中的字符串数据类型有什么区别?
有什么区别
- 字符串在 VB
- C++ 中的字符*
- 字符串在 delphi
- delphi
中的 PChar
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 字符串。
我有一个用 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++中的字符串数据类型有什么区别?
- 字符串在 VB
- C++ 中的字符*
- 字符串在 delphi
- delphi 中的 PChar
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 字符串。