【问题标题】:How to access an image inside a DLL from inside the DLL?如何从 DLL 内部访问 DLL 中的图像?
【发布时间】:2020-08-08 16:42:43
【问题描述】:

在 Delphi 10.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 行没有被执行并且图像没有被分配。

显然,我从DataModule 上的TImageList 访问图像的方式是不正确的。

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

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

还有另一种访问DLL 内图像的工作方式吗?我做错了什么?

【问题讨论】:

  • @user1580348 因为 DLL 项目在其入口点中没有启动代码来在运行时创建设计时对象,就像 Form GUI 项目那样。因此,您必须自己显式创建 TDataModule 对象。
  • 这实际上可能是一个更好的方法;否则,可能雷米的话是正确的。
  • @user1580348 不,我的意思是在 DLL 的 入口点(项目主源文件的 begin..end. 块,或在 DllProc 回调中)。此外,units 没有事件,classes 有。但是,在 DLL 中,使用资源是比在 TDataModule 上使用 TImageList 更好的解决方案。
  • 我给了你一个 +1 作为“补偿”。 :)
  • @AndreasRejbrand 感谢您对我的回答的编辑和对 Alt 文本的解释。我将来会使用它。也感谢您的帮助!我从你身上学到了很多。而且你是一个非常友好和建设性的人!

标签: delphi dll datamodule timagelist delphi-10.4-sydney


【解决方案1】:

正如这个问题中的几位评论员所指出的那样,正如我自己所经历的那样,在 DLL 中使用资源作为图像源比“在 TDataModule 上使用 TImageList”更好,后者必须明确在 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;  

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-28
    相关资源
    最近更新 更多