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

zhhaitao 2009-03-11 05:56:09
win2000下Delphi动态调用dll以字符串形式返回文件名,有时候不对,比如"text.txt",可能返回为"text.,",而且每次返回值可能不一样。另外:win2000操作系统本身也有点问题,运行一段时间会抛出很多rundll32.exe进程
不知道谁知道为什么?
...全文
1306 24 打赏 收藏 转发到动态 举报
写回复
用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)
内容概要:本文针对无刷直流电机驱动的电子机械制动(EMB)执行器,建立了考虑Stribeck摩擦特性的非线性耦合动力学模型,并在Simulink环境中完成了系统级仿真分析。研究综合集成了电机动力学、齿轮传动机构与制动执行机构的动力学特性,构建了高保真的机电一体化系统模型。重点引入Stribeck摩擦模型以精确描述低速工况下执行器内部存在的静摩擦、粘滞摩擦与库仑摩擦之间的过渡行为,有效提升了系统在启停、反向运动等瞬态过程中的动态响应仿真精度。通过多工况仿真验证了模型的有效性,能够准确反映摩擦引起的爬行、滞后与定位误差等非线性现象,为EMB系统的高性能控制算法设计(如摩擦补偿、滑模控制)与结构优化提供了高可信度的仿真平台。; 适合人群:从事汽车电子制动系统、电机驱动控制、机电系统建模与仿真研究的研究生、科研人员及工程技术人员,需具备扎实的机械动力学、自动控制理论基础和MATLAB/Simulink仿真能力。; 使用场景及目标:①用于高精度电子机械制动系统的设计验证与性能预测;②为消除摩擦非线性影响的先进控制策略(如自适应控制、智能控制)提供精确的被控对象模型;③深入探究Stribeck摩擦等非线性因素对系统动态性能(如响应延迟、稳态误差)的作用机理; 阅读建议:读者应结合提供的Simulink模型文件,深入剖析Stribeck摩擦模块的数学实现与参数辨识方法,建议通过改变输入指令(如阶跃、正弦)和负载条件进行对比仿真,以直观理解非线性摩擦对系统动态特性的影响。

5,943

社区成员

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

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