-1

Vb6 代码运行时出现以下错误。

如何修复错误?

我怎样才能返回一个正常的字符串?

VB6代码

Private Declare Function DllPchar Lib "C:\TEST\Project2.dll" (ByVal AStr As String) As String 

Private Sub Command10_Click() 
  Dim tmp as String 
  tmp  = DllPchar("123"); 
End Sub 

Delphi7代码

function DllPchar( AStr: PChar) : PChar; stdcall; 
4

1 回答 1

3

好吧,您没有提供有关此问题的太多信息。例如,错误消息。以及“DllPChar”的德尔福代码。

但是没关系。我注意到的第一件事是您的 Declare Function 语句正在返回一个字符串。这将不起作用,因为 VB 期望返回 BSTR 类型的值。Delphi 有一种WideStringBSTR.

这很重要的原因是因为 VB 字符串在内部是 UTF-16,即由 COM 内存管理器分配的每个字符 2 个字节的 Unicode 字符串。Delphi PAnsiChar 类型是一个指向8 位ANSI 字符的指针,Delphi 字符串由Delphi 自己的内存管理器分配。它们是不相容的。但是,在 VB6 中有一种特殊情况,您可以在其中使用Declare Function参数,并且 VB 处理并在调用之前ByVal ... As String在VB 字符串和 PAnsiChar 之间进行自动转换,然后在调用之后在 PAnsiChar 和 VB 字符串之间进行转换。

如果在 Delphi 中不能使用 BSTR,最好的办法是重写 DllPchar() 以便它修改AStr参数。或者,创建一个新参数以返回其中的值。

如果您可以使用 BSTR,那么您可以修改AStr为传递它ByRef而不是ByVal. 这将允许您从 VB 传入一个 Unicode 字符串。然后,您通过返回值返回结果。

于 2014-05-23T16:35:46.037 回答