调用DLL出错 ( 积分: 200 )

  • 主题发起人 主题发起人 changku
  • 开始时间 开始时间
C

changku

Unregistered / Unconfirmed
GUEST, unregistred user!
我写了一个DLL,一个函数返回指针变量,在调用时可以正常使用,但退出窗体时总提示错误"InValid pointer operation".
此函数在DLL中声明了一个Pointer变用它来返回值.
外部也有一个用来接收.
 
你查一下WIN操作系统返回指针类型和DELPHI的DLL返回指针类型声明是否一致。
 
释放的指针是否是合法的?
 
返回值的类型可以转换为字符类型
 
我在DLL中返回值后释放了一次,在程序退出时也释放了程序中的那个Pointer变量
 
dll 指针只能在DLL里面分配和释放。
 
>>我在DLL中返回值后释放了一次,在程序退出时也释放了程序中的那个Pointer变量
第二次释放时当然出错了,建议函数返回值不要用指针
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=3530241
看看这里你会得到答案的.
 
我试了试在DLL中FREEMEM指针后函数返回的数据是错误的,不能正确返回。
下面是DLL中的函数
-----------------------------------------------------------
function EditionTo_55(var idhao:integer):Pointer;export;far;
var
c_shuju:array of byte;
begin
try
GetMem(c_shuju,4);

c_shuju[0]:=188;
c_shuju[1]:=250;
c_shuju[2]:=idhao;
c_shuju[3]:=55;
result := @c_shuju[0];
//Freemem(c_shuju,4);
except
result := nil;
end;
end;
EXE中的调用。
-------------------------------------------------
procedure TForm1.Button1Click(Sender: TObject);
var
H_TOP:HWND;
EditionTo_55:TEditionTo_55;
hh:Pointer;
idhao:integer;
Bshuju:array of byte;
begin
Bshuju:=nil;
idhao:=2;
H_TOP:=LoadLibrary(pchar('publicdll.dll'));
EditionTo_55:=GetProcaddress(H_TOP,'EditionTo_55');
hh:=EditionTo_55(idhao);
setlength(Bshuju,sizeof(hh));
Move(hh^,PChar(@Bshuju[0])^,sizeof(hh));
hh:=nil;
Freemem(hh);
Freelibrary(H_TOP);
end;
-------------------------
我是用动态方法调用的。请高手指点指点。
 
function EditionTo_55(var idhao:integer):Pointer;export;far;
var
c_shuju:array of byte;//这里有问题
 
建议不要用这种方法,因为DLL不知道什么时候EXE才不用那些申请的内存,所以DLL这种情况下不能主动释放内存。先释放了,后面再访问当然报内存错误。
可以改成在EXE中GetMEM,然后把指针传给DLL,DLL只要写数据即可,EXE用完后再FreeMem.
 
后退
顶部