如何将Delphi字符串传递给Prism DLL?

Mar*_*ber 5 delphi oxygene delphi-prism delphi-2010

我们尝试将字符串从本机Delphi程序传递给Delphi Prism DLL.传递整数没有问题,但DLL中的字符串不匹配.我们看到了Robert Love的代码片段以回应另一个问题,但是没有本机Delphi程序的代码.

我们如何将Delphi中的字符串传递给Delphi Prism DLL?

Rob*_*cke 8

最好的方法是使用WideString.

有几个原因.

  • 它是Unicode并且在D2009之前工作
  • 它的内存是在ole32.dll中管理的,因此不依赖于Delphi的内存管理器或CLR GC.
  • 您不必直接处理指针

在Oxygene中,你可以像这样写:

type
  Sample = static class
  private
    [UnmanagedExport]
    method StringTest([MarshalAs(UnmanagedType.BStr)]input : String;
                      [MarshalAs(UnmanagedType.BStr)]out output : String);
  end;

implementation

method Sample.StringTest(input : String; out output : String);
begin
  output := input + "ä ~ î ?";
end;
Run Code Online (Sandbox Code Playgroud)

"MarshalAs"告诉CLR如何来回编组字符串.没有它,字符串将作为Ansi(PAnsiChar)传递,这可能不是您想要做的.

这是如何从Delphi使用它:

procedure StringTest(const input : WideString; out output : WideString);
  stdcall; external 'OxygeneLib';

var
  input, output : WideString;
begin
  input := 'A b c';
  StringTest(input, output);
  Writeln(output);
end.
Run Code Online (Sandbox Code Playgroud)

此外,永远不要使用未明确定义的类型用于外部接口.您不得使用PChar进行DLL导入或导出.因为如果你这样做,当你用D7或D2009编译它时会遇到异常(取决于原始开发系统是什么)


vcl*_*per 1

Delphi Win32 中字符串的管理方式与 .Net 中的字符串不同,因此您不能将 .Net 字符串传递给 Delphi Win32,反之亦然。

要交换字符串值,最好使用两个编译器都支持的 PChar 类型。这与将字符串值发送到 Windows API 函数的方式相同。

问候

PS 我不是罗伯特;-)