套 套牢1 Unregistered / Unconfirmed GUEST, unregistred user! 2001-04-05 #1 一个dll回传的result----Pchar应该在调试时可以看到它的值。 但我发现有时(pchar)较短时可以,一旦长了,就无法访问,总是ACCESS VIOLATION 不知什么原因
K Kylix㊣ Unregistered / Unconfirmed GUEST, unregistred user! 2001-04-05 #3 用完后要FreeMem 。^-^ 可能还需要进行字符串的复制
房 房客 Unregistered / Unconfirmed GUEST, unregistred user! 2001-04-05 #4 AllocMem()----FreeMem() GlobalAlloc()----GlobalFree() GetMem()----FreeMem() New()----Dispose() StrAlloc()----StrDispose() StrNew()----StrDispose() VirtualAlloc()----VirtualFree()
AllocMem()----FreeMem() GlobalAlloc()----GlobalFree() GetMem()----FreeMem() New()----Dispose() StrAlloc()----StrDispose() StrNew()----StrDispose() VirtualAlloc()----VirtualFree()
Z zhangkan Unregistered / Unconfirmed GUEST, unregistred user! 2001-04-05 #5 nameChar; begin GetMem(Name,5); ... freemem(name,0); end;
套 套牢1 Unregistered / Unconfirmed GUEST, unregistred user! 2001-04-05 #6 书上也是这么说的,可我试了,还是老毛病,我再说详细点 dll声明如下: function ShowAllSearchForm(AHandle:THandle;AConnection:TADOConnection;ATableName:String)char; StdCall;external 'AllSearch.dll' name 'ShowAllSearchForm'; 调用如下: getmem(nastr1,30); nastr1:=ShowAllSearchForm(application.Handle,x,y); str1:=strpas(nastr1); 如果返回值较短,可以查看nastr1的值,但长了就看不到了, 一执行str1:=strpas(nastr1);就出错了。 是不是dll内部对result也要进行申请内存的操作呀
书上也是这么说的,可我试了,还是老毛病,我再说详细点 dll声明如下: function ShowAllSearchForm(AHandle:THandle;AConnection:TADOConnection;ATableName:String)char; StdCall;external 'AllSearch.dll' name 'ShowAllSearchForm'; 调用如下: getmem(nastr1,30); nastr1:=ShowAllSearchForm(application.Handle,x,y); str1:=strpas(nastr1); 如果返回值较短,可以查看nastr1的值,但长了就看不到了, 一执行str1:=strpas(nastr1);就出错了。 是不是dll内部对result也要进行申请内存的操作呀
K Kylix㊣ Unregistered / Unconfirmed GUEST, unregistred user! 2001-04-05 #7 用String作Dll的参数? uses Sharemem 了没有?
W wjiachun Unregistered / Unconfirmed GUEST, unregistred user! 2001-04-05 #8 如果DLL输出的过程或函数带有长字符类型的参数,或者函数返回类型是长字符串或 带有长字符串元素的构造类型,Object Pascal规定无论是DLL还是调用它的程序必 须把ShareMem单元加到Uses部分。而ShareMem单元是从DelphiMM.DLL这个DLL中引入 的接口单元,因此这种程序分发时必须带有DelphiMM.DLL。Delphi建议为了避免使 用DelphiMM.DLL,传递字符串信息时使用PChar或ShortString类型参数。
如果DLL输出的过程或函数带有长字符类型的参数,或者函数返回类型是长字符串或 带有长字符串元素的构造类型,Object Pascal规定无论是DLL还是调用它的程序必 须把ShareMem单元加到Uses部分。而ShareMem单元是从DelphiMM.DLL这个DLL中引入 的接口单元,因此这种程序分发时必须带有DelphiMM.DLL。Delphi建议为了避免使 用DelphiMM.DLL,传递字符串信息时使用PChar或ShortString类型参数。
套 套牢1 Unregistered / Unconfirmed GUEST, unregistred user! 2001-04-05 #9 我试过了, 如果不用string型参数,比较稳定,但还是无法保证不出错。 另外 getmem(nastr1,30); nastr1:=ShowAllSearchForm(application.Handle,x,y); str1:=strpas(nastr1); freemem(nastr1);//这句总是出问题,invalid pointer.为什么?
我试过了, 如果不用string型参数,比较稳定,但还是无法保证不出错。 另外 getmem(nastr1,30); nastr1:=ShowAllSearchForm(application.Handle,x,y); str1:=strpas(nastr1); freemem(nastr1);//这句总是出问题,invalid pointer.为什么?
H hopfield Unregistered / Unconfirmed GUEST, unregistred user! 2001-04-05 #10 你的理解有错! 我所说的Getmem是指在Dll的返回值本身要申请内存空间,如: 在dll中要: GetMem(Result,Size); 至于在调用的程序中,你根本不用申请什么内存空间,只要声明一个String型的变量就可以了 如: str: String; str:=ShowAllSearchForm(application.Handle,x,y);
你的理解有错! 我所说的Getmem是指在Dll的返回值本身要申请内存空间,如: 在dll中要: GetMem(Result,Size); 至于在调用的程序中,你根本不用申请什么内存空间,只要声明一个String型的变量就可以了 如: str: String; str:=ShowAllSearchForm(application.Handle,x,y);
M Macron Unregistered / Unconfirmed GUEST, unregistred user! 2001-04-06 #11 只能用SendMessage传 有一个专门用来传字符串的Message的 忘了叫什么东西了
套 套牢1 Unregistered / Unconfirmed GUEST, unregistred user! 2001-04-06 #12 好象用shortstring来传递参数就没什么问题了,真是搞不清楚是怎么回事, 无论如何问题还是了了,谢谢诸位。