LoadBitmap与ResDLL问题(50分)

  • 主题发起人 主题发起人 autumn
  • 开始时间 开始时间
A

autumn

Unregistered / Unconfirmed
GUEST, unregistred user!
1.我建立了一个DLL,{$R MyBMP.RES}包含了一个图片M.BMP
2.然后我在这个DLL中Exports了一个函数:
function GetMyBMP:HBITMAP;stdcall;
begin
result:=LoadBitmap(HInstance,'MyBMP');
end;
3.然后我在调用程序用静态调用
function GetMyBMP:HBITMAP:stdcall;external 'MyDLL.DLL';

Button1.OnClick
begin
Image1.Picture.Bitmap.Handle:=GetMyBMP;
end;

我参看了Win32 Developer's References HELP 关于LoadBitmap的有关章节,其中
有这么一句:
The application must call the DeleteObject function to delete each bitmap handle returned by the LoadBitmap function.
我参看了论坛了有关LoadBitmap的主题,使用完LoadBitmap后,
好像都没有使用DeleteObject方法.

问题:上面我的代码会造成内存泄漏吗?如果泄漏的话,如何改正?
 
应该不会有内存泄漏,保险起见,可以在程序结束时,调用DeleteObject(Image1.Picture.Bitmap.Handle)
 
肯定泄露啦。句柄也是种资源,你不释放肯定完蛋。
 
我现在的相关解决方法:
library HrRES;
uses
ShareMem,
SysUtils,
windows,
Classes,
...
type
TBMPRes = (brMainBackground, brHrReportFilterLogo, brExportSuccedLogo);


var
hBMPS: array[TBMPRes] of HBITMAP;


function GetBMP(BmpTag: Integer): HBITMAP; stdcall; //获取指定的图片资源
var
br: TBMPRes;
s: string;
begin
br := TBMPRes(BmpTag);
if hBMPS[br] = 0 then
begin
s := GetEnumName(TypeInfo(TBMPRes), BmpTag);
Delete(s, 1, 2);
hBMPS[br] := LoadBitmap(HInstance, PChar(s));
end;
Result := hBMPS[br];
end;
...
procedure DLLMain(Reason: Integer);
var
i: TBMPRes;
begin
case Reason of
DLL_PROCESS_ATTACH:
for i := Low(hBMPS) to High(hBMPS) do
hBMPS := 0;
DLL_PROCESS_DETACH:
for i := Low(hBMPS) to High(hBMPS) do
if hBMPS <> 0 then DeleteObject(hBMPS);
end;
end;


begin
DllProc := @DLLMain;
DLLMain(DLL_PROCESS_ATTACH);
end.
 
多人接受答案了。
 
后退
顶部