【Delphi】PChar在dll中如何使用
delphi吧
全部回复
仅看楼主
level 7
OOPhappy 楼主
请教一下:我现在自己做了dll。其中一个接口它的声明是这样的:Function Sync ():PChar;
。我在测试的时候就是调用这个动态库的时候也就是
可是莫名其妙的会出异常,然后我用单步调试,一直到了end那里都没有问题,然后再按F7就弹出下面的错误,我有点看不懂,有没懂的,提示一下。
2014年07月22日 01点07分 1
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 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分
1