【Delphi】PChar在dll中如何使用
delphi吧
全部回复
仅看楼主
level 7
OOPhappy 楼主
请教一下:我现在自己做了dll。其中一个接口它的声明是这样的:Function Sync ():PChar;
。我在测试的时候就是调用这个动态库的时候也就是
可是莫名其妙的会出异常,然后我用单步调试,一直到了end那里都没有问题,然后再按F7就弹出下面的错误,我有点看不懂,有没懂的,提示一下。
2014年07月22日 01点07分 1
level 12
pchar本质是一个指针,使用前是需要分配内存空间的。
2014年07月22日 02点07分 2
我试过了,一但用 GetMem(SInf,1024); SInf := TestKisAPI.Sync(); FreeMem(SInf);,程序执行到了FreeMem就会是Project1.exe停止工作。
2014年07月22日 03点07分
回复 OOPhappy :一、不freemem,过程结束后由系统自己释放;二、试试var sinf:string; sinf:=strpas(接口返回值)
2014年07月22日 04点07分
回复 A1Duke :试过了,还是一样的,这个过程一执行完就会显示 project1.exe停止工作。
2014年07月22日 06点07分
level 7
OOPhappy 楼主
现在,我不确定是哪里出现了问题。CreatKisWebAPI(self)是我写的dll的调用的入口函数。TestKisAPI是我封装的一个类,然后
TestKisAPI.GetUrlAndSecret;
TestKisAPI.Sync();都是调用这个类的方法。
如果代码改成下面的的
begin
TestKisAPI := CreatKisWebAPI(self);
TestKisAPI.GetUrlAndSecret;
SInf := TestKisAPI.Sync();
mmo1.Lines.Add(SInf);
end
就是这个过程一执行完(也就是单步调试到了end)就会出现下面
@nirendao1980 @BambooCaep @ls0360
帮忙看看。
2014年07月22日 06点07分 3
level 10
楼主啊 PCHAR,不能做 函数 返回值的。
你去 看看 人家 微软的 API,哪个是返回 PCHAR 的?
另外,为了安全,请使用 PANSICHAR 和 PWIDECHAR。不要乱用。
2014年07月22日 08点07分 4
level 10
其实。也可以让 DLL 的函数 返回 PCHAR 。
但是这个 PCHAR 的内存,必须由 DLL 创建,也需要由 DLL 清理。否则必然出错。
但是 函数都运行完了,你这时候需要用这个 PCHAR 的内容。所以还不能清理。
你只能在 DLL 被销毁的时候清理。
虽然能做到,但是得不偿失,所以 正规的 DLL 的函数都不返回 任何指针。
2014年07月22日 08点07分 5
我现在要返回一个字符串,我记得以前贴吧里面有前辈说,做成DLL最好不要用string做返回类型,要返回PChar,所以我就返回了pchar。可能我的方法有问题吧。我用的是 Result := PChar(Msg);
2014年07月23日 01点07分
回复 OOPhappy :1. string 不能用。2 pchar不能做函数返回值。剩下的你自己去看书。不要再问了,你问了也是白问。
2014年07月23日 01点07分
回复 OOPhappy :你 Msg 这个变量是函数内部的吧。函数运行完,这个变量就失效了。你这种写 DLL 的方法,等于是破坏内存。没蓝屏就不错了。
2014年07月23日 01点07分
level 12
Dll最好不要导出类,或者用纯虚类。
Dll导出的函数最好用stdcall.
Dll中的内存由dll自己管理.
一定要明白这几个东西,特别是用delphi做dll。
你返回PChar是可以的,但是,这个PChar不应该由Dll来分配。
应该是Function Sync (out:PChar):PChar;
返回的值应该=out,这个内存要交给调用者管理,才是比较科学的.
2014年07月23日 03点07分 6
好的,谢谢!
2014年07月23日 04点07分
这才是大拿的水准,原则呀原则,还需要多看书呀
2017年08月24日 07点08分
level 8
问题解决了没有上面这么多大神 说话了
2014年07月25日 00点07分 7
用公司的D7问题依旧,用xe4就没有问题。用D7要在SInf := TestKisAPI.Sync();后面改为 SInf := TestKisAPI.Sync() + #0;就不会报异常,但是程序关闭后进程不会退出。正在找关于内存操作的教课书看一下。
2014年07月25日 01点07分
level 7
OOPhappy 楼主
最近有空,把这个问题给弄了一下从晚上9点搞到了12点终于弄出来了,其实是自己的疏忽大意(或者说是学艺不精吧)弄成的。主要错误2个,第一个CreatKisWebAPI这个函数在dll文件中是用stdcall声明的,然后再调用前声明的时候没有加上stdcall声明。第二个就是没有使用SharaMem,据说是如果使用了string或者动态数组都要弄上这个玩意的(我在这里面使用了pchar)。然后就能够正常的退出和得到结果了。
2014年09月25日 02点09分 8
前面没搞清楚函数调用规则是你平时不留意,你1L出现的问题,明显是调用规则不一致引起的栈崩溃。后面说的这什么shareMem,除非你用了string作为参数或返回值才需要,这不是你程序崩溃的原因
2014年09月25日 08点09分
回复 二小姐 :前面可以算是我自己不留意吧,因为我以前是学C++的,手贱,每次写DLL都会自己下意识的写上stdcall。然后后面的sharemen我是真没有用string作为参数,而是用的pchar,如果不加这个就会报内存地址读写错误。
2014年09月25日 08点09分
回复 OOPhappy :学C++的不也应该记得cdecl和stdcall, fastcall这些么?留意到你从dll中返回了一个类对象,只是给delphi用的话还是bpl更方便
2014年09月25日 08点09分
回复 二小姐 :清注意哦,1L的不是调用规则不一致弄出来的。3L那个才是哦。1L是因为没有加SHAREMEM单元才出来的。我必须承认自己确实学艺不精。自己本身就比较懒,Delphi都是自己自学过来的,只看过小甲鱼的教学视频,没有大手带。新手求轻喷。
2014年09月25日 08点09分
level 1
几个月的时间!!
2014年09月25日 07点09分 9
这个,自己懒 加上老板坑,连续出差做ERP项目实施。2个月加上中秋休息的时间不到5天。哪里来的时间弄这个东西,光对付客户都GG了。剩下的肯定是平时自己有空了就自己去动手解决啊。
2014年09月25日 08点09分
回复 OOPhappy :简直累
2014年09月25日 08点09分
1