这样的调用为什么会出现存取错误 ( 积分: 100 )

  • 主题发起人 主题发起人 zhangyuntian
  • 开始时间 开始时间
Z

zhangyuntian

Unregistered / Unconfirmed
GUEST, unregistred user!
一个VC写的DLL,用Delphi调用时,可以调用成功,但是就在此过程结束时会出现一具内存存取错误!就是找不出问题!急!请帮我看看呀!
TSySCan_HaveScan=function (ModelName:pchar):boolean;stdcall;
调用代码是:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
Mname:pchar;
iflag:boolean;
begin
try
GetMem(Mname,30);
if LHandle=0 then
begin
exit;
end;

Mname:=Pchar('IO_HasScanner');
@P1:=GetProcAddress(LHandle,pchar(Mname));
if NOT Assigned(P1) then
begin
exit;
end;

Mname:=Pchar('TrvlScan 464');
if P1(Mname) then //这里本来应该是if NOT P1(Mname) then 我改了一下好测试问
//题就出在一退出此过程就报错
begin
try
if Assigned(Mname) then
Mname:=nil;
except
;
end;
exit;//这里一退出就出错
end;

finally
if LHandle<>0 then
FreeLibrary(LHandle);
showmessage('ddddd');
end

//
end;
 
一个VC写的DLL,用Delphi调用时,可以调用成功,但是就在此过程结束时会出现一具内存存取错误!就是找不出问题!急!请帮我看看呀!
TSySCan_HaveScan=function (ModelName:pchar):boolean;stdcall;
调用代码是:
procedure TForm1.BitBtn1Click(Sender: TObject);
var
Mname:pchar;
iflag:boolean;
begin
try
GetMem(Mname,30);
if LHandle=0 then
begin
exit;
end;

Mname:=Pchar('IO_HasScanner');
@P1:=GetProcAddress(LHandle,pchar(Mname));
if NOT Assigned(P1) then
begin
exit;
end;

Mname:=Pchar('TrvlScan 464');
if P1(Mname) then //这里本来应该是if NOT P1(Mname) then 我改了一下好测试问
//题就出在一退出此过程就报错
begin
try
if Assigned(Mname) then
Mname:=nil;
except
;
end;
exit;//这里一退出就出错
end;

finally
if LHandle<>0 then
FreeLibrary(LHandle);
showmessage('ddddd');
end

//
end;
 
还有一个变量声明:
P1:TSySCan_HaveScan;
 
你把Dll发给我,我来帮你调试

一定要确保Dll是Release的,我这里没有VC环境[:D][:D][:D][:D]
 
注意.如果在DELPHI中通过DELPHI内存管理器得到的内存必须由DELPHI的内存管理器释放.因为我不是很清楚GetMem的内存分配方式,以及VC/DLL中使用的内存释放方式.除非这两个都使用WIn32的标准API,或者另有交流,否则错你没商量

WIn32标准分配方式很多.比如CoTaskMemAlloc/..和API中的直接申请内存的API均可
 
procedure TForm1.Button1Click(Sender: TObject);
var
Mname: PChar;
P1: TSySCan_HaveScan;
FHandle: THandle;
begin
FHandle := LoadLibrary(PChar('ddd.dll'));
try
if FHandle > 32 then begin
Mname := PChar('IO_HasScanner');
@P1 := GetProcAddress(FHandle, PChar(Mname));
if Assigned(P1) then begin
if P1(PChar('TrvlScan 464')) then begin
end;
end;
end;
finally
if FHandle <> 0 then
FreeLibrary(FHandle);
end;
end;

应该没问题,所以要确认这个VC的Dll里面的函数名是否已经正确,也就是IO_HasScanner,其他的好像没有什么了
 
问题还是没解决呀。
To:zjan521
我也认为是资源释放问题,我用GetMem申请后,我FreeMem也报错呀。
To:chenybin
VC的Dll里面的函数名是正确的,也能正确调用(就是返回值为True),但是在Exit后就会报错!
 
首先查一下GetMem(Mname,30);这里分配的内存是否足够?

// Mname:=Pchar('IO_HasScanner');
// @P1:=GetProcAddress(LHandle,pchar(Mname));
这两句合成一句: @P1:=GetProcAddress(LHandle,Pchar('IO_HasScanner');

// Mname:=Pchar('TrvlScan 464')
这句改成 strcopy(mname,Pchar('TrvlScan 464'));
 
TSySCan_HaveScan=function (ModelName:pchar):boolean;stdcall;

VC的DLL并不一定都是stdcall方式调用,改用cdecl试试
 
谢谢大家的建议!问题依旧呀!!
 
哪个DLL你没有代码还是什么原因,不是公司机密,否则可以发给我,我帮你调
 
一般内存越界,请贴VC里相关函数代码
 
这是图文通的扫描仪开发包里的DLL,我也没有源码。
如有,我一定会贴的。
请大家见谅呀!
 
谢谢大家的参与!
是调用惯例的问题,如wbtvc所说!
 
后退
顶部