请问DLL中使用pchar的问题(40分)

  • 主题发起人 主题发起人 hihaspywww
  • 开始时间 开始时间
H

hihaspywww

Unregistered / Unconfirmed
GUEST, unregistred user!
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?

分不多了,请原谅
 
pchar需要自己控制分配与释放,其实加上ShareMem就可以自由使用string了,
为什么不用呢?
 
不想使用sharemem,总担心会不稳定,不知道担心是否多余?

能否针对这个例子说说pchar如何分配和释放?




 
如果我改用string传递,则没有问题,
但一使用pchar传递,则出现问题,

我想和pchar的分配有关,但具体针对这个例子,如何分配pchar呢?

我用中间变量试过,
var
r:pchar;
......
begin
......
getmem(r,255);
r:=pchar(f.ReadString('date','time',''));
result:=r;
freemem(r);
......
end;

问题依旧,是我分配PCHAR的方法不对吗?

圆满回答上面问题者愿意单送200分.
 
完善的实现有两种方法:
1.从dll导出释放函数;
2.在主程序中分配与释放,并将该指针作为参数传递。
不过如果有一个最大尺寸的话也可以这样:
a: array[0..255] of char;//this is a global var
strpcopy(@a, f.ReadString('date','time',''));
Result := @a;
 
对了,使用ShareMem不会造成什么问题的。
 
好象我已在csdn回答了你的問題了!
直接用GetMem(Result, 255);
StrCopy(Result,...
 
CSDN上也是我贴的,

多谢楼上各位,我先尽快测试.
 
后退
顶部