在Delphi写的dll中回传一个bmp图象 ( 积分: 100 )

  • 主题发起人 主题发起人 iamyourneed
  • 开始时间 开始时间
I

iamyourneed

Unregistered / Unconfirmed
GUEST, unregistred user!
function fGetBmp(var bmp: TBitmap; Side: char): boolean; stdcall;
begin
try
if Side = 'F' then
begin
bmp := TBitmap.Create;
bmp.Assign(BmpF);
result := true;
end else
begin
bmp := TBitmap.Create;
bmp.Assign(BmpR);
result := true;
end;
except
result := false;
end;
end;
这是我的dll部分
btSM := nil;
btDM := TBitmap.Create;
fGetBmp(btSM, 'F');
L := btSM.Width * 5 div 100;
T := btSM.Height * 2 div 100;
R := btSM.Width * 50 div 100;
B := btSM.Height * 30 div 100;
rcS.Left := L;
rcS.Top := T;
rcS.Right := R;
rcS.Bottom := B;
rcD.Left := 1;
rcD.Top := 1;
rcD.Right := R - L;
rcD.Bottom := B - T;
btDM.Height := rcD.Bottom + 1;
btDM.Width := rcD.Right + 1;
btDM.Canvas.CopyRect(rcD, btSM.Canvas, rcS);
btSM.Free;
rv1 := frmConfirmRepeat.ScrollBox1.Height;
rv2 := ((rv1 * btDM.Width * 100) div btDM.Height) div 100;
if rv2 <= frmConfirmRepeat.ScrollBox1.Width then
begin
frmConfirmRepeat.Image1.Width := rv2;
frmConfirmRepeat.Image1.Height := rv1;
end else
begin
rv2 := frmConfirmRepeat.ScrollBox1.Width;
rv1 := ((rv2 * btDM.Height * 100) div btDM.Width) div 100;
if rv1 <= frmConfirmRepeat.ScrollBox1.Height then
begin
frmConfirmRepeat.Image1.Width := rv2;
frmConfirmRepeat.Image1.Height := rv1;
end;
end;
frmConfirmRepeat.lbH.Caption := Inttostr(rv1);
frmConfirmRepeat.lbw.Caption := Inttostr(rv2);
frmConfirmRepeat.Image1.Picture.Bitmap.Assign(btDM);
btDM.Free;
frmConfirmRepeat.ShowModal;
result := false;
这是调用部分,但是每运行到frmConfirmRepeat.ShowModal;
就报错了,报错如下:
Access violation at adress 7C938FEA in module 'ntdll.dll'.
怀疑是溢出了。不知道是那的问题。
 
function fGetBmp(var bmp: TBitmap; Side: char): boolean; stdcall;
begin
try
if Side = 'F' then
begin
bmp := TBitmap.Create;
bmp.Assign(BmpF);
result := true;
end else
begin
bmp := TBitmap.Create;
bmp.Assign(BmpR);
result := true;
end;
except
result := false;
end;
end;
这是我的dll部分
btSM := nil;
btDM := TBitmap.Create;
fGetBmp(btSM, 'F');
L := btSM.Width * 5 div 100;
T := btSM.Height * 2 div 100;
R := btSM.Width * 50 div 100;
B := btSM.Height * 30 div 100;
rcS.Left := L;
rcS.Top := T;
rcS.Right := R;
rcS.Bottom := B;
rcD.Left := 1;
rcD.Top := 1;
rcD.Right := R - L;
rcD.Bottom := B - T;
btDM.Height := rcD.Bottom + 1;
btDM.Width := rcD.Right + 1;
btDM.Canvas.CopyRect(rcD, btSM.Canvas, rcS);
btSM.Free;
rv1 := frmConfirmRepeat.ScrollBox1.Height;
rv2 := ((rv1 * btDM.Width * 100) div btDM.Height) div 100;
if rv2 <= frmConfirmRepeat.ScrollBox1.Width then
begin
frmConfirmRepeat.Image1.Width := rv2;
frmConfirmRepeat.Image1.Height := rv1;
end else
begin
rv2 := frmConfirmRepeat.ScrollBox1.Width;
rv1 := ((rv2 * btDM.Height * 100) div btDM.Width) div 100;
if rv1 <= frmConfirmRepeat.ScrollBox1.Height then
begin
frmConfirmRepeat.Image1.Width := rv2;
frmConfirmRepeat.Image1.Height := rv1;
end;
end;
frmConfirmRepeat.lbH.Caption := Inttostr(rv1);
frmConfirmRepeat.lbw.Caption := Inttostr(rv2);
frmConfirmRepeat.Image1.Picture.Bitmap.Assign(btDM);
btDM.Free;
frmConfirmRepeat.ShowModal;
result := false;
这是调用部分,但是每运行到frmConfirmRepeat.ShowModal;
就报错了,报错如下:
Access violation at adress 7C938FEA in module 'ntdll.dll'.
怀疑是溢出了。不知道是那的问题。
 
function fGetBmp(var bmp: TBitmap; Side: char): boolean; stdcall;
begin
try
if Side = 'F' then
begin
bmp := TBitmap.Create;
bmp.Assign(BmpF); //BmpF好象没有定义
result := true;
end else
begin
bmp := TBitmap.Create;
bmp.Assign(BmpR);//BmpR好象没有定义
result := true;
end;
except
result := false;
end;
end;

btSM := nil;
btDM := TBitmap.Create;
fGetBmp(btSM, 'F'); //这里万一调用出错怎么办?没有进行判断!
 
var bmp: TBitmap;
应该是你这个参数定义的问题吧
怎么又创建了一下??
 
BmpF和BmpR是全局变量fGetBmp(btSM, 'F'); 的出错处理在函数里写了啊var bmp: TBitmap;应该是要创建的,然后回传再由宿主程序释放的啊
 
function fGetBmp(var bmp: TBitmap; Side: char): boolean; stdcall;

begin
try
if Side = 'F' then
begin
bmp.Assign(BmpF); //BmpF好象没有定义
result := true;
end else
begin
bmp.Assign(BmpR);
result := true;
end;
except
result := false;
end;
看看中不
 
to:mystudy试过了,我甚至在宿主程序里面create了传出来的还是nil,真是郁闷
 
呵呵,那就先看看嫩的bmpf/bmpr中是不是空的吧
 
Delphi编译的时候,dll和exe中如果声明了同样的类型,比如,都声明了TBitmap,但是做类型比较的时候是不一样的!这是Delphi类型机制的问题.你最好传入和传输Handle,不能将类作为参数传出.如果确实需要,建议写bpl,但同时,你的bpl和exe必须dynamic调用rtl.bpl和vcl.bpl,否则也无法完成类型匹配.
 
BmpF和BmpR是全局变量,那有没有赋值?

function fGetBmp(var bmp: TBitmap; Side: char): boolean; stdcall;

begin
try
if Side = 'F' then
begin
bmp.Assign(BmpF);
result := true;
end else
begin
bmp.Assign(BmpR);
result := true;
end;
except
try
bmp.Assign(BmpR); //如果出错,就在这里处理吧,最好是在函数调用时,判断函数返回值来处理。
except
Application.messagebox('BMP出错!','提示');
end;
result := false;
end;
 
可能是zqw0117说的问题,以前那段程序,我只要在宿主程序里写btsm.freeimage就可以了,但是后来我修改了一下函数,现在的函数是这样的
function fGetBmp(bmp: TBitmap; Side: char): boolean; stdcall;
var
mStrm: TMemoryStream;
begin
result := false;
if not assigned(bmp) then exit;
mStrm := TMemoryStream.Create;
try
if Side = 'F' then
begin
BmpF.SaveToStream(mStrm);
mStrm.Seek(0, 0);
bmp.LoadFromStream(mStrm);
mStrm.Destroy;
result := true;
end else
begin
BmpR.SaveToStream(mStrm);
mStrm.Seek(0, 0);
bmp.LoadFromStream(mStrm);
mStrm.Destroy;
bmp.Assign(BmpR);
result := true;
end;
except
result := false;
end;
end;
在宿主程序里创建和释放就不会有问题了。
问题算解决了,也许还有跟深入的讨论,下班前结贴了。
 
多人接受答案了。
 
后退
顶部