DLL的输出,超难问题(高手请进) (50分)

  • 主题发起人 主题发起人 miky_sun
  • 开始时间 开始时间
M

miky_sun

Unregistered / Unconfirmed
GUEST, unregistred user!
DLL要输出多个pchar数据:<br>function StringResult(Fchar,FLen: pchar;FAA,Fbb,Fcc: PChar):Integer;stdcall;<br>其中Faa,Fbb,Fcc为要输出的数据,他们的空间由Dll来开辟。这时该怎么做?
 
如果空间是由Dll来申请的,得用<br>function StringResult(Fchar,FLen: pchar;var FAA,Fbb,Fcc: PChar):Integer;stdcall;<br>并且,在主程序里用完了后记得释放.<br>
 
TO:LeeChange:<br>加上Var还是不可以的,
 
呵呵,那可能就是你的代码写的有问题了.
 
To:LeeChange<br>代码如下:<br>function StringResult(Fchar,FLen: pchar;Var FAA,Fbb: PChar):Integer;stdcall;<br>var<br>&nbsp; ss : string;<br>begin<br>&nbsp; StringResult := 1;<br>&nbsp; ShowMessage('begin start');<br>&nbsp; ShowMessage(Fchar);<br>&nbsp; ShowMessage(FLen);<br>&nbsp; ss := StringOfChar(Fchar[0],StrToInt(FLen));<br>&nbsp; //<br>&nbsp; ShowMessage('ss='+ss);<br>&nbsp; GetMem(FAA,Length(SS)+2);{在此就出现系统错误}<br>&nbsp; GetMem(Fbb,Length(SS)+2);<br>&nbsp; StrPCopy(FAA,'A='+ss);<br>&nbsp; StrPCopy(Fbb,'B='+ss);<br>&nbsp; //<br>&nbsp; ShowMessage('Dll result &nbsp;pA='+FAA);<br>&nbsp; ShowMessage('Dll result &nbsp;pb='+Fbb);<br>&nbsp; StringResult := 1;<br>end;<br>
 
请来看看
 
请来看看 &nbsp;<br>
 
我写了下面的代码,运行没有报错.你不要局限在出错的地方,仔细分析分析吧.<br>procedure fa(cc: PChar; var aa, bb: PChar);<br>begin<br>&nbsp; GetMem(aa, 10);<br>&nbsp; GetMem(bb, 10)<br>end;<br><br>procedure TForm1.Button1Click(Sender: TObject);<br>var<br>&nbsp; a, b: PChar;<br>begin<br>&nbsp; fa('', a, b)<br>end;
 
声明的var应该可以不加吧,对指针的操作本就是传的地址,不过leechange讲要加<br>我又不敢肯定了:)<br>如果要在dll里使用string类型的话<br>在工程文件的第一个引用位置加上sharemem的引用<br>
 
to 52free:<br>&nbsp; 别急说什么样是对的,编一段试试就行了.<br>&nbsp; 我是这样想的,PChar参数确实是传地址,但如果空间是在函数里申请的,则需要改变指针变量的指向而不是内容,所以加了var.不知道对不对.
 
TO leechange<br>&nbsp; &nbsp;确实如此,你是对的
 
To:LeeChange<br>你说的我也试过,是没有出错但是aa,bb返回不了任何数据。<br>在Dll中可以看到数据,但是在主程序中就看不到数据了。<br>或者说它们是没有指向任何空间!采用这种方法没办法返回数据!<br>我猜想DLL开辟的空间,在返回主程序时是不是被DLL又释放了?
 
后退
顶部