2010-02-16 66 views
5

我们尝试从原生Delphi程序传递一个字符串到Delphi Prism DLL。 传递整数没有问题,但字符串在DLL中不匹配。 我们在回答另一个问题时看到了Robert Love's code snippet,但是没有原生Delphi程序的代码。如何将Delphi字符串传递给Prism DLL?

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

+3

这是一个社区,所以你不应该在你的问题中为单个人解决问题。如果你想这样做,他的答案写评论。如果你写一个问题(在这种情况下更好),尽量将其表述为一般。 – jpfollenius 2010-02-16 13:41:04

+0

同意。罗伯特吉塞克比我能做得更好。 – 2010-04-19 15:05:47

回答

1

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

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

Regards

P.S.我不是罗伯特;-)

+0

对不起,这应该是一个消息给上面提到的代码片段的作者。点击了错误的按钮。 但无论如何,它如何使用PChar。德尔福棱镜没有PChar类型。如果我在本地delphi中使用pchar,并在棱镜中使用字符串,我会得到第一个字符。但只有一个字符。 如何解决这个问题? – 2010-02-16 15:33:09

+1

别担心,马库斯。你还没有足够的声望点,所以你无论如何都不能在别人的问题上发表推荐。这是一个合法的问题。我已经为你编辑它,所以它看起来不像你想发送一个直接的消息,而Stack Overflow不支持。 – 2010-02-16 15:37:40

+0

PChar只是一个指向字符的指针,要发送一个字符串就像你需要先指向第一个字符,然后指定字符串数据的长度,这样另一端就可以从开始点读取数据直到字符串的长度。 如果您的DLL函数正在返回任何字符串值,那么另一端应该提供一个内存空间,并将其起始地址和长度发送给您的函数,以便您的函数可以将输出数据写入该内存空间。 – vcldeveloper 2010-02-16 15:41:02

8

最好的方法是使用WideString。

有几个原因。

  • 这是Unicode和D2009
  • 它的内存OLE32.DLL中进行管理,因此在任德尔福的内存管理器或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; 

“的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. 

此外,永远利用类型,即都没有明确规定,对外部接口。 您不能使用PChar进行DLL导入或导出。因为如果你这样做,当你使用D7或D2009进行编译时(这取决于原始的开发系统是什么),你会遇到异常。