在Delphi10.4中,在COM服务器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中使用资源作为图像源是一种比"在CCD_ 11〃上使用CCD_;它必须在DLL的入口点中显式实例化(正如@RemyLebeau所指出的(。
因此,在这个特定的情况下,I:
•将所需图像作为位图存储在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;