【问题标题】:C++ Builder XE2 - linking resource with componentC++ Builder XE2 - 将资源与组件链接
【发布时间】:2012-09-24 06:54:55
【问题描述】:

我已经基于类 TCustomControl 派生了我自己的组件。我需要嵌入到以 .png 格式存储的组件位图资源中。我将以下内容添加到项目文件 resources.rc 中:

AP_LOGO RCDATA .\AP_logo_RGB_transparent.png

编译成功。组件静态链接到项目。当我运行应用程序时,它会在尝试访问嵌入式资源时引发以下错误:

Project raised exception class EResNotFound with message 'Resource AP_LOGO not found'.

源代码访问位图资源中的以下几行:

  Graphics::TBitmap *bmp = new Graphics::TBitmap();
  HINST handle = FindClassHInstance(__classid(TVctDiag2));
  bmp->LoadFromResourceName(handle, L"AP_LOGO"); // <----- exception apppers there

当我使用资源编辑器打开可执行文件时,没有任何名为“AP_LOGO”的资源。为什么?

【问题讨论】:

    标签: embedded-resource custom-component c++builder-xe2


    【解决方案1】:

    它不起作用,因为 TBitmap::LoadFromResource...() 方法仅查找 BITMAP 资源,但您已经定义了 RCDATA 资源。如果您不更改资源类型,则必须改用TResourceStream,例如:

    HINST handle = FindClassHInstance(__classid(TVctDiag2));
    TResourceStream *strm = new TResourceStream(handle, L"AP_LOGO", RT_RCDATA);
    Graphics::TBitmap *bmp = new Graphics::TBitmap();
    bmp->LoadFromStream(strm);
    delete strm;
    

    使用该 saif,您一开始就无法将 PNG 资源加载到 TBitmap 中。如果必须使用 PNG 资源,则必须使用 PNG 类,例如 TPngImage

    【讨论】:

    • 找不到资源“AP_LOGO”。
    • 那么你的资源实际上并没有被编译到你的组件包中。您确定将 .rc 文件添加到项目中吗?您是否尝试过使用 IDE 自己的内置资源管理器而不是使用 .rc 文件?
    • 当我将组件编译为动态链接库 .bpl 时,我可以在其中看到 AP_LOGO 资源。当我静态链接组件时,AP_LOGO 资源未链接到可执行文件。至于内置的资源管理器——不,我没有。
    • 那么您的资源没有正确地与您的包关联。如果操作正确,静态链接的包与动态链接的包具有相同的资源。这就是为什么FindClassHInstace() 对查找组件资源很有用。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-06-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多