如何从 DLL 内部访问 DLL 中的图像?
How to access an image inside a DLL from inside the DLL?
在Delphi10.4中,在一个COM Server DLL ShellExtension项目中,我在项目中添加了一个DataModule
,并在DataModule上放置了一个TImageList
。 ImageList 包含几个在设计时添加的图像。现在,从 DLL
项目的主要单元,我尝试访问 ImageList 中的图像:
procedure TMyShellExtension2.MyGetBitmap(ABitmap: Vcl.Graphics.TBitmap);
begin
ABitmap.PixelFormat := pf24bit;
ABitmap.Width := 128;
ABitmap.Height := 128;
DataModule.DataModule3.ilUrlPics.GetBitmap(0, ABitmap);
CodeSite.Send('test');
end;
GetBitmap
行似乎导致了错误,因为下面的 CodeSite.Send
行没有被执行,图像也没有分配。
显然,我从 DLL
内的 DataModule
上的 TImageList
访问图像的方式不正确。
另一方面,在分配“自制”BitMap 时,确实有效:
ABitmap.PixelFormat := pf24bit;
ABitmap.Width := 128;
ABitmap.Height := 128;
ABitmap.Canvas.Brush.Color := clBlue;
ABitmap.Canvas.FillRect(Rect(0, 0, 127, 127));
是否有另一种访问 DLL
中的图像的工作方式?我做错了什么?
正如这个问题中的几位评论员所指出的以及我自己的经验,在 DLL 中将资源用作 image-source 是一种比“在 [=12= 上使用 TImageList
”更好的方法]" 必须在 DLL 的入口点中显式实例化(正如@RemyLebeau 指出的那样)。
所以在这个具体案例中我:
• 将所需图像存储为位图 Project → Resources and Images
。
• 确保加载创建的资源,例如{$R MyShellExtensionDLL.res}
.
• 在 run-time 加载位图,例如:
procedure MyGetBitmap(ABitmap: Vcl.Graphics.TBitmap);
begin
ABitmap.PixelFormat := pf24bit;
ABitmap.Width := 128;
ABitmap.Height := 128;
ABitmap.LoadFromResourceName(HInstance,'BITMAP1');
end;
在Delphi10.4中,在一个COM Server DLL ShellExtension项目中,我在项目中添加了一个DataModule
,并在DataModule上放置了一个TImageList
。 ImageList 包含几个在设计时添加的图像。现在,从 DLL
项目的主要单元,我尝试访问 ImageList 中的图像:
procedure TMyShellExtension2.MyGetBitmap(ABitmap: Vcl.Graphics.TBitmap);
begin
ABitmap.PixelFormat := pf24bit;
ABitmap.Width := 128;
ABitmap.Height := 128;
DataModule.DataModule3.ilUrlPics.GetBitmap(0, ABitmap);
CodeSite.Send('test');
end;
GetBitmap
行似乎导致了错误,因为下面的 CodeSite.Send
行没有被执行,图像也没有分配。
显然,我从 DLL
内的 DataModule
上的 TImageList
访问图像的方式不正确。
另一方面,在分配“自制”BitMap 时,确实有效:
ABitmap.PixelFormat := pf24bit;
ABitmap.Width := 128;
ABitmap.Height := 128;
ABitmap.Canvas.Brush.Color := clBlue;
ABitmap.Canvas.FillRect(Rect(0, 0, 127, 127));
是否有另一种访问 DLL
中的图像的工作方式?我做错了什么?
正如这个问题中的几位评论员所指出的以及我自己的经验,在 DLL 中将资源用作 image-source 是一种比“在 [=12= 上使用 TImageList
”更好的方法]" 必须在 DLL 的入口点中显式实例化(正如@RemyLebeau 指出的那样)。
所以在这个具体案例中我:
• 将所需图像存储为位图 Project → Resources and Images
。
• 确保加载创建的资源,例如{$R MyShellExtensionDLL.res}
.
• 在 run-time 加载位图,例如:
procedure MyGetBitmap(ABitmap: Vcl.Graphics.TBitmap);
begin
ABitmap.PixelFormat := pf24bit;
ABitmap.Width := 128;
ABitmap.Height := 128;
ABitmap.LoadFromResourceName(HInstance,'BITMAP1');
end;