delphi编写dll遇到的问题 library utf8string;usesSystem;{$R *.RES}function UTF8STRS(str:pchar): pchar; stdcall;export;beginResult :=pchar(UTF8Encode(str));end;exportsUTF8STRS;beginend.我用这段代码生成了一个dll,供其他程序调用,编译没有问题,但是调用的时候总是出现内存错误!不知道是哪里出了问题哪位兄弟能帮忙解决一下 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 提示Undeclared identifier: 'strcopy' library utf8string;usesSystem,SysUtils,Classes;{$R *.RES}function UTF8STRS(str:pchar): pchar; stdcall;export;beginResult :=strcopy(UTF8Encode(str));end;exportsUTF8STRS;beginend.还是不行,我修改成这样后[错误] utf8string.dpr(10): Incompatible types: 'UTF8String' and 'PAnsiChar' function UTF8STRS(str:pchar): pchar; stdcall; 不好意思,我delphi刚开始学,就这样一句一句的,我实在是搞不清楚 library utf8string;usesSystem,SysUtils,Classes;{$R *.RES}function UTF8STRS(str:pchar): pchar; stdcall;beginResult :=strcopy(UTF8Encode(str));end;exportsUTF8STRS;beginend.就算是改成这样也不行 function UTF8STRS(str:Pchar): pchar; stdcall;这样定义是有问题的,返回值占用的内存不能释放,会存在内存泄露问题。可以修改成如下函数定义:function UTF8STRS(source: PChar; dest: PChar): Boolean; stdcall;source为传入的UTF8格式字符串dest为转换后的字符串返回值为true/false这样内存都是由调用DLL的程序申请和释放的,不会存在内存泄露的问题,但是需要保证在外边申请的dest内存足够容纳转换以后的新串大小。 我调用了没出错呀function UTF8STRS(str:PChar): PChar; stdcall;external 'utf8string.dll'{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);var s:string;begin s:=utf8strs(PChar(Memo1.text)); Memo1.Lines.Add(s);end; 验证过了,没问题啊!<?xml version="1.0" encoding="UTF-8"?><School> <Techer> <Tearcher1 name = "Chen" age="25" Height="180" /> <Tearcher2 name = "Chen" age="25" Height="180" /> </Techer> <Dom Floor="8"/></School> 菜鸟问题,缓冲区是什么,请各位大哥帮我解释解释,谢谢。 打包时数据库路径设置问题 要毕业设计,大家说选什么课题好? 关于locate 初学者的问题! help!!! 一个小型的酒店让我帮助开发一个酒店管理系统,请高手指点,最好有思路及编程方法。高分相送。 用Delphi怎么实现Internet共享设置? 在线等高手解决 请问我定义的类,用不同的方法来调用其中的方法有和区别? dephi中怎样实现在一个form中放一个逼真的时钟?(时间跟系统时间一样) 如何给外部程序的dll里面的函数挂钩? 关于SendMessage获取ListBox内容的问题
Undeclared identifier: 'strcopy'
System,SysUtils,Classes;{$R *.RES}function UTF8STRS(str:pchar): pchar; stdcall;export;
begin
Result :=strcopy(UTF8Encode(str));
end;exports
UTF8STRS;begin
end.还是不行,我修改成这样后
[错误] utf8string.dpr(10): Incompatible types: 'UTF8String' and 'PAnsiChar'
System,SysUtils,Classes;{$R *.RES}function UTF8STRS(str:pchar): pchar; stdcall;
begin
Result :=strcopy(UTF8Encode(str));
end;exports
UTF8STRS;begin
end.
就算是改成这样也不行
这样定义是有问题的,返回值占用的内存不能释放,会存在内存泄露问题。可以修改成如下函数定义:
function UTF8STRS(source: PChar; dest: PChar): Boolean; stdcall;
source为传入的UTF8格式字符串
dest为转换后的字符串
返回值为true/false这样内存都是由调用DLL的程序申请和释放的,不会存在内存泄露的问题,但是需要保证在外边申请的dest内存足够容纳转换以后的新串大小。
{$R *.dfm}procedure TForm1.Button1Click(Sender: TObject);
var
s:string;
begin
s:=utf8strs(PChar(Memo1.text));
Memo1.Lines.Add(s);
end;
<School>
<Techer>
<Tearcher1 name = "Chen" age="25" Height="180" />
<Tearcher2 name = "Chen" age="25" Height="180" />
</Techer>
<Dom Floor="8"/>
</School>