Delphi动态调用dll返回字符串为乱码

zhhaitao 2009-03-11 05:56:09
win2000下Delphi动态调用dll以字符串形式返回文件名,有时候不对,比如"text.txt",可能返回为"text.,",而且每次返回值可能不一样。另外:win2000操作系统本身也有点问题,运行一段时间会抛出很多rundll32.exe进程
不知道谁知道为什么?
...全文
1214 24 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
24 条回复
切换为时间正序
请发表友善的回复…
发表回复
ruilong88 2010-08-02
  • 打赏
  • 举报
回复
strLcpy???????????
Allan_xd 2009-03-17
  • 打赏
  • 举报
回复
function GetTheStr(buffer: PChar; bufferlen: integer): integer;stdcall;
var ls_src:string;
begin
ls_str := 'This is a demo';
result := min(length(ls_str) + 1,buferlen);
strLcpy(buffer,pchar(ls_str),result);
end;
procedure loader;
var ls_buff:string;
li_len:integer;
begin
ls_buff := stringofchar(' ',32);
li_len := GetTheStr(pchar(ls_buff),32);
if li_len > 0 then
showmessage(copy(ls_buff,1,li_len))
else
showmessage('没有取得任何字符到缓冲区中');
end;
lazycat818 2009-03-17
  • 打赏
  • 举报
回复
function getFileIsValidate(dName: shortstring): PWIDECHAR; stdcall;返回字符串的地址,但是那个字符串在DLL结束的时候已经释放了,所以你得到的结果是不确定的.

正确的方法是如楼上说的定义成function func(buffer: PChar; bufferlen: integer): integer;stdcall;形式, 然后将结果字符串内容拷贝到buffer里.这是API的标准格式,返回值只是表示成功或失败.

zhhaitao 2009-03-16
  • 打赏
  • 举报
回复
能给个例子吗
zhhaitao 2009-03-13
  • 打赏
  • 举报
回复
应该不是,加上这个用报异常
xiaocongzhi 2009-03-13
  • 打赏
  • 举报
回复
是不是要在DLL里Uses 中加ShareMem呀?
zhhaitao 2009-03-13
  • 打赏
  • 举报
回复
能解释下为什么会出现乱码的问题吗
以及function func(buffer: PChar; bufferlen: integer): Boolean; 怎么用,能举个例子吗
zshsuming 2009-03-13
  • 打赏
  • 举报
回复
学习
yc_8301 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 Allan_xd 的回复:]
定义返回字符串信息的dll的接口最好是学着系统API的样子点:
function func(buffer: PChar;  bufferlen: integer): integer;stdcall;
其中buffer所指的空间是由调用者分配,空间大小由bufferlen提供给dll使用
在dll中把要返回的字符串存到buffer所指的位置,注意不要超过了bufferlen所指的长度,最好返回dll实际写入这个buffer中的字符的个数。
这样做就不会有任何问题了。
[/Quote]
顶这个,
的确最好由调用者提供返回缓冲区,这样的就可以避免 由于调用后堆栈复位时带来的 临时对象被销毁 而造成
的数据丢失,导致返回结果(string)乱码等。
但注意,既然由调用者分配内存,就不要忘记使用后销毁内存...!
虎滴小猪猪 2009-03-13
  • 打赏
  • 举报
回复
[Quote=引用 17 楼 Allan_xd 的回复:]
定义返回字符串信息的dll的接口最好是学着系统API的样子点:
function func(buffer: PChar; bufferlen: integer): integer;stdcall;
其中buffer所指的空间是由调用者分配,空间大小由bufferlen提供给dll使用
在dll中把要返回的字符串存到buffer所指的位置,注意不要超过了bufferlen所指的长度,最好返回dll实际写入这个buffer中的字符的个数。
这样做就不会有任何问题了。
[/Quote]

能给个例子吗??
Allan_xd 2009-03-13
  • 打赏
  • 举报
回复
定义返回字符串信息的dll的接口最好是学着系统API的样子点:
function func(buffer: PChar; bufferlen: integer): integer;stdcall;
其中buffer所指的空间是由调用者分配,空间大小由bufferlen提供给dll使用
在dll中把要返回的字符串存到buffer所指的位置,注意不要超过了bufferlen所指的长度,最好返回dll实际写入这个buffer中的字符的个数。
这样做就不会有任何问题了。
zhhaitao 2009-03-13
  • 打赏
  • 举报
回复
这是我的DLL用到的两个函数:
function getFileIsValidate(dName: shortstring): PWIDECHAR; stdcall; //外部调用
function isValidFile(dName: shortstring; valueList: TStrings): Integer;//由getFileIsValidate调用
  • 打赏
  • 举报
回复
这个不影响吧,其实不是很理解你说的是什么。最好有部分代码看看。
zhhaitao 2009-03-13
  • 打赏
  • 举报
回复
我用了pchar,外部调用的函数肯定也用了stdcall,但dll内部自身调用的函数没有加stdcall,不知道会不会有影响呢
  • 打赏
  • 举报
回复
DLL中的返回值建议使用PChar,否则就得加ShareMem。

WIN2000系统虽然有点过时了,但应当没有那么脆弱。楼主检查下DLL,还有stdcall是否追加上了。
free_see 2009-03-13
  • 打赏
  • 举报
回复
建议用PCHAR
magicjove 2009-03-12
  • 打赏
  • 举报
回复

拋出很多可能由于你動態庫釋放問題。即多次調用但為釋放。系統API一般返回的是長字符串來描述文件名,你返回值強制
轉換成PWIDECHAR類型返回試試
ahjoe 2009-03-12
  • 打赏
  • 举报
回复
function func(buffer: PChar; bufferlen: integer): Boolean;

缓冲区由调用者准备。
xjq2003 2009-03-11
  • 打赏
  • 举报
回复
估计是数据类型的问题
hanks_gao 2009-03-11
  • 打赏
  • 举报
回复
楼主的返回值类型是什么类型!不会是String吧?
如果是的话,那就改成PChar再试试吧!
加载更多回复(3)

5,928

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧