【问题标题】:loading image resources from dedicated dll in winapi c project从winapi c项目中的专用dll加载图像资源
【发布时间】:2015-03-25 17:50:11
【问题描述】:

我正在开发一个在 vs2012 中的 win32 c++ 项目。 我的项目使用了大量的资源,如图像、图标等。 我已将这些资源嵌入到 exe 中,这些资源已编译。 我使用普通的 Visual Studio 资源文件完成了它。 编译项目需要很多时间。 而且exe文件很大。

所以我决定将所有这些资源编译到另一个 dll 文件中。 并在需要资源时加载它,然后卸载它。 我对该负载资源函数的算法就像......

HBITMAP LoadMyImage (INT nResId)
{
    HINSTANCE hDll = LoadLibrary (DLL_RESOURCE);
    if (hDll==NULL)
        return NULL;

    HBITMAP hBitmap = LoadImage (
        hDll, MAKEINTRESOURCE (nResId), IMAGE_BITMAP,
        LR_DEFAULTSIZE, LR_DEFAULTSIZE,
        LR_DEFAULTCOLOR);
    if (hBitmap==NULL)
        return NULL;

    FreeLibrary (hLib);
    return hBitmap;
}

考虑到性能、约定和复杂性,这是一个好方法吗? 请指教。

【问题讨论】:

    标签: c++ c winapi visual-studio-2012 dll


    【解决方案1】:

    本质上,这是一种合理的方法。我觉得有几个细节需要改进:

    1. 不要使用LoadLibrary,它适用于带有代码的库。使用LoadLibraryEx 传递LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE | LOAD_LIBRARY_AS_IMAGE_RESOURCE
    2. 不要重复加载和卸载 DLL。当您第一次需要图像时加载一次。加载模块确实有性能成本,您最好只支付一次。

    【讨论】:

    • 事实上,使用LoadLibrary 加载纯资源DLL 甚至是不可能的。必须拨打LoadLibraryEx
    • @IInspectable 出于兴趣,您如何着手构建这种仅资源的 DLL?
    • MSDN 中有一个指南:Creating a Resource-Only DLL。我自己没有创建一个,也不知道以这种方式创建的 DLL 是否真的是纯资源 DLL(即不包含入口点存根)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-11-14
    • 2013-08-26
    • 2019-09-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-29
    相关资源
    最近更新 更多