如何从 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;