DLL回传PCHAR的问题(100分)

  • 主题发起人 主题发起人 套牢1
  • 开始时间 开始时间

套牢1

Unregistered / Unconfirmed
GUEST, unregistred user!
一个dll回传的result----Pchar应该在调试时可以看到它的值。
但我发现有时(pchar)较短时可以,一旦长了,就无法访问,总是ACCESS VIOLATION
不知什么原因
 
你要用GetMem申请内存空间
 
用完后要FreeMem 。^-^
可能还需要进行字符串的复制
 
AllocMem()----FreeMem()
GlobalAlloc()----GlobalFree()
GetMem()----FreeMem()
New()----Dispose()
StrAlloc()----StrDispose()
StrNew()----StrDispose()
VirtualAlloc()----VirtualFree()
 
name:PChar;
begin
GetMem(Name,5);
...
freemem(name,0);
end;
 
书上也是这么说的,可我试了,还是老毛病,我再说详细点
dll声明如下:
function ShowAllSearchForm(AHandle:THandle;AConnection:TADOConnection;ATableName:String):Pchar;
StdCall;external 'AllSearch.dll' name 'ShowAllSearchForm';

调用如下:
getmem(nastr1,30);
nastr1:=ShowAllSearchForm(application.Handle,x,y);
str1:=strpas(nastr1);

如果返回值较短,可以查看nastr1的值,但长了就看不到了,
一执行str1:=strpas(nastr1);就出错了。
是不是dll内部对result也要进行申请内存的操作呀
 
用String作Dll的参数? uses Sharemem 了没有?
 
如果DLL输出的过程或函数带有长字符类型的参数,或者函数返回类型是长字符串或
带有长字符串元素的构造类型,Object Pascal规定无论是DLL还是调用它的程序必
须把ShareMem单元加到Uses部分。而ShareMem单元是从DelphiMM.DLL这个DLL中引入
的接口单元,因此这种程序分发时必须带有DelphiMM.DLL。Delphi建议为了避免使
用DelphiMM.DLL,传递字符串信息时使用PChar或ShortString类型参数。
 
我试过了,
如果不用string型参数,比较稳定,但还是无法保证不出错。
另外
getmem(nastr1,30);
nastr1:=ShowAllSearchForm(application.Handle,x,y);
str1:=strpas(nastr1);
freemem(nastr1);//这句总是出问题,invalid pointer.为什么?
 
你的理解有错!
我所说的Getmem是指在Dll的返回值本身要申请内存空间,如:
在dll中要: GetMem(Result,Size);
至于在调用的程序中,你根本不用申请什么内存空间,只要声明一个String型的变量就可以了
如:
str: String;
str:=ShowAllSearchForm(application.Handle,x,y);
 
只能用SendMessage传
有一个专门用来传字符串的Message的
忘了叫什么东西了
 
好象用shortstring来传递参数就没什么问题了,真是搞不清楚是怎么回事,
无论如何问题还是了了,谢谢诸位。
 
后退
顶部