DLL中,部分代码如下:
function Getconfigure(atype:pchar):pchar;export;stdcall;
var
  configFilenametmp : string; 
  f : Tinifile;
 ltype:string;
begin
 ltype:=strpas(atype);
 configFilenametmp:=Gettmp();
   result:='';
 f:=TInifile.Create(configfilenametmp);
 if ltype='time' then
   result:=pchar(f.ReadString('date','time',''));
  f.Destroy;
 Deletefile(configfilenametmp);
end;然后我在同一个DLL的另外一个地方使用这个函数
strpas(GetConfigure(pchar('time')));
最后得到的字符串却不完整,例如本来应该是 2003-12-11
但只返回了20,
但是我在函数里面检查时却是可以正确的得到 2003-12-11
而且如果我把最后两行注释掉,也是可以得到正确的值,
请问各位是什么道理?????????????另外再问一个问题,如果DLL中的函数不需要export,那么使用字符串时是否可以直接使用
string?

解决方案 »

  1.   

    如果我改用string传递,则没有问题,
    但一使用pchar传递,则出现问题,我想和pchar的分配有关,但具体针对这个例子,如何分配pchar呢?我用中间变量试过,
    var
      r:pchar;
      ......
    begin
    ......
      getmem(r,255);
      r:=pchar(f.ReadString('date','time',''));
      result:=r;
      freemem(r);
    ......
    end;问题依旧,是我分配PCHAR的方法不对吗?圆满回答上面问题者愿意单送200分.
      

  2.   

    1,如果返回一个PCHAR,直接在参数里实现就可以了,也推荐采用这种方式;
    比如你要返回PCHAR就可以;这个YOURRETURN就可直接返回了。
    function Getconfigure(atype:pchar;YOURRETURN:PCHAR):INTEGER;export;stdcall;
    2,这个PCHAR不可以直接等的;
    result:=pchar(f.ReadString('date','time',''));
    result:=r;
    你应该用STRCOPY(RESULT,R);
      

  3.   

    我覺得應該這樣用:
    getmem(result,255);
    然後
    StrCopy你的東西進去
    不用FreeMem!不過, 更好的應該是修改聲明
    function Getconfigure(atype:pchar, aRet: Pchar):boolean;export;stdcall;調用前用
    GetMem(aRet, 255),
    if GetConfigure(atype, aRet) then
     Showmessage(StrPas(aRet));
    FreeMem(aRet);