请指教:一个DLL的奇怪问题 ( 积分: 100 )

  • 主题发起人 主题发起人 jsxjd
  • 开始时间 开始时间
J

jsxjd

Unregistered / Unconfirmed
GUEST, unregistred user!
function getFiles(srcMsg,tarMsg,srcFile,tarFile:Pchar;bTarget:boolean):Pchar;stdcall;<br>var<br> &nbsp;s:string;<br> &nbsp;b:boolean;<br>begin<br> &nbsp;result:=nil;<br> &nbsp;SelectFileFrm:=TSelectFileFrm.Create(Application.MainForm);<br> &nbsp;with SelectFileFrm do<br> &nbsp;try<br> &nbsp; &nbsp; &nbsp;if srcMsg&lt;&gt;nil then sourceBox.Caption:=srcMsg;<br> &nbsp; &nbsp; &nbsp;if tarMsg&lt;&gt;nil then targetBox.Caption:=tarMsg;<br> &nbsp; &nbsp; &nbsp;srcFiles.Items.Text:=srcFile;<br> &nbsp; &nbsp; &nbsp;targetFile.caption:=tarFile;<br> &nbsp; &nbsp; &nbsp;HasTarget:=bTarget;<br> &nbsp; &nbsp; &nbsp;showmodal;<br> &nbsp; &nbsp; &nbsp;b:=modalresult=mrOk;<br> &nbsp; &nbsp; &nbsp;if b then<br> &nbsp; &nbsp; &nbsp; &nbsp;s:=Trim(srcFiles.items.text)+'||'+Trim(targetFile.caption);<br> &nbsp; &nbsp; &nbsp;// if b then result:=pchar(s+#0); 为什么摆这儿不行<br> &nbsp;finally<br> &nbsp; &nbsp;free;<br> &nbsp;end;<br> &nbsp;if b then result:=pchar(s+#0); &nbsp;//为什么一定摆这儿,而且还要 #0<br>end;
 
function getFiles(srcMsg,tarMsg,srcFile,tarFile:Pchar;bTarget:boolean):Pchar;stdcall;<br>var<br> &nbsp;s:string;<br> &nbsp;b:boolean;<br>begin<br> &nbsp;result:=nil;<br> &nbsp;SelectFileFrm:=TSelectFileFrm.Create(Application.MainForm);<br> &nbsp;with SelectFileFrm do<br> &nbsp;try<br> &nbsp; &nbsp; &nbsp;if srcMsg&lt;&gt;nil then sourceBox.Caption:=srcMsg;<br> &nbsp; &nbsp; &nbsp;if tarMsg&lt;&gt;nil then targetBox.Caption:=tarMsg;<br> &nbsp; &nbsp; &nbsp;srcFiles.Items.Text:=srcFile;<br> &nbsp; &nbsp; &nbsp;targetFile.caption:=tarFile;<br> &nbsp; &nbsp; &nbsp;HasTarget:=bTarget;<br> &nbsp; &nbsp; &nbsp;showmodal;<br> &nbsp; &nbsp; &nbsp;b:=modalresult=mrOk;<br> &nbsp; &nbsp; &nbsp;if b then<br> &nbsp; &nbsp; &nbsp; &nbsp;s:=Trim(srcFiles.items.text)+'||'+Trim(targetFile.caption);<br> &nbsp; &nbsp; &nbsp;// if b then result:=pchar(s+#0); 为什么摆这儿不行<br> &nbsp;finally<br> &nbsp; &nbsp;free;<br> &nbsp;end;<br> &nbsp;if b then result:=pchar(s+#0); &nbsp;//为什么一定摆这儿,而且还要 #0<br>end;
 
注意返回的是pChar<br>// if b then result:=pchar(s+#0); 为什么摆这儿不行<br>如果不是b,則返回nil。<br>if b then result:=pchar(s+#0); &nbsp;//为什么一定摆这儿,而且还要 #0<br>要#0保証字符串總是以Null結尾,從而和Win32 API中使用的Null結尾字符串兼容。
 
一般情况下由 pchar自动转换,不需要自己加 #0,关键还是这一语句位置的问题。<br><br>为什么放在上面不行????
 
// if b then result:=pchar(s+#0); 为什么摆这儿不行<br>不是不行吧??是放在最后判斷好一點吧。<br>兩者沒有什么不同啊。
 
确实如此,否则不奇怪了。可能跟DLL内存管理有关,位置的问题解决了,估计加不加#0也就通了。<br>按理说,也不会和 Free 有关。
 
放在前面与放在后面的结果分别是什么?
 
我也遇到过这种情况,模式窗体调用modalresult后内存好像有一些变化,调试时候可以看到,调用modalresult后pchar变量的值就改变了,后面出现乱码,的确和dll内存管理有关
 
放在上面怎么不行了?<br>难不成还会出编译时问题?[?]
 
诚挚邀请大虾加入我的群:4963281 ,谢谢!
 
多人接受答案了。
 
后退
顶部