Function Test(pInput:PAnsiChar):PAnsiChar; stdcall; var t:AnsiString; begin t := strPas(pInput); showmessage(t); {此处乱码} t := 'test' + t; result := PAnsiChar(t); {返回值依旧乱码} end; ShowMessage(Test(PAnsiChar('Hello world')));试试 pchar 改成pansichar ,string改成AnsiString。
建议你尝试把t定义成AnsiString,然后直接强转使用。
Function Test(pInput:PAnsiChar):PAnsiChar; stdcall;
var t:AnsiString;
begin
t := strPas(pInput);
showmessage(t); {此处乱码}
t := 'test' + t;
result := PAnsiChar(t); {返回值依旧乱码}
end;
ShowMessage(Test(PAnsiChar('Hello world')));试试 pchar 改成pansichar ,string改成AnsiString。
楼上的代码没问题,你把先编译的DLL删掉,改过代码后重新编译一个DLL再试试。
用D2010,重新粘贴了代码,运行结果不正确,另,改成PANSIChar后,如果传递Unicode的字符,比如蒙古文,日文,韩文等,可以正确处理吗?
SysUtils,
Classes,
Dialogs;{$R *.res}Function Test(pInput:PAnsiChar):PAnsiChar; stdcall;
var
t:AnsiString;
begin
t := strPas(pInput);
showmessage(string(t)); {此处乱码}
t := 'test' + t;
result := PAnsiChar(t); {返回值依旧乱码}
end;exports
Test;begin
end.APP:unit Unit1;interfaceuses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls;type
TForm1 = class(TForm)
Button1: TButton;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;var
Form1: TForm1;
Function Test(pInput:PAnsiChar):PAnsiChar; stdcall;external 'Test.dll';
implementation{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
begin
Test('消息');
end;end.
在调用的时候,必须用Stdcall,即:
Function Test(pInput:PChar):PChar; stdcall; external 'TestDLL.dll';用PAnsiChar的话也可以,但是显示不了Unicode字符。
比如 Test("Copyright © 2010") 将弹出:"Copyright ? 2010"D2010可以直接直接用PChar,显示Unicode字符但是在其他语言(VB)中调用的时候,又会出现乱码。无语。
Private Declare Function Test lib "TestDLL.dll" (byval pInput as string) as string先结贴。