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