0

在 Delphi 10.4 中,在 COM Server DLL ShellExtension 项目中,我向项目中添加了一个并在 DataModule 上DataModule放置了一个。TImageListImageList 包含在设计时添加的几个图像。现在,从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未执行以下行并且未分配图像。

显然,我从TImageListaDataModule内部 a访问图像的方式DLL是不正确的。

另一方面,在分配“自制”位图时,它确实有效

ABitmap.PixelFormat := pf24bit;
ABitmap.Width := 128;
ABitmap.Height := 128;
ABitmap.Canvas.Brush.Color := clBlue;
ABitmap.Canvas.FillRect(Rect(0, 0, 127, 127));

是否有另一种访问内部图像的工作方式DLL?我究竟做错了什么?

4

1 回答 1

0

正如这个问题中的几位评论员所指出的那样,并且正如我自己所经历的那样,在 DLL 中使用资源作为图像源是一种比“在 aTImageList上使用 a TDataModule”更好的方法,后者必须在 DLL 的入口点显式实例化(如 @ RemyLebeau 指出)。

因此,在这种特定情况下,我:

• 将所需图像作为位图存储在Project → Resources and Images.

• 确保加载创建的资源,例如使用{$R MyShellExtensionDLL.res}.

• 在运行时加载位图,例如:

procedure MyGetBitmap(ABitmap: Vcl.Graphics.TBitmap);  
begin  
  ABitmap.PixelFormat := pf24bit;  
  ABitmap.Width := 128;  
  ABitmap.Height := 128;  
  ABitmap.LoadFromResourceName(HInstance,'BITMAP1');  
end;  
于 2020-08-09T10:19:48.323 回答