如何在静态库中嵌入图标(.ico)(Visual Studio)

时间:2017-03-30 12:40:54

标签: c++ c visual-studio-2012 visual-studio-2013 resources

有没有办法在c ++(Win32 API)静态库中嵌入资源(如图标,对话框)? 我的目的是在静态库中嵌入一个图标,使用LoadIcon的函数就像普通的.exe一样工作,因此主应用程序只能链接到静态库并包含头文件,不需要添加其他文件,如.rc文件或.ico文件等。 显然,使用静态库的主要应用程序没有此资源,因此LoadIcon将失败,但我想知道是否有解决方法使其工作。只要标准API调用(例如LoadIcon)可以工作,带有图标数据的静态数组就可以工作。

为了进一步解释,将使用静态库的人只有2个文件:.lib和.h,并且没有任何.rc文件。

1 个答案:

答案 0 :(得分:1)

我发布了一个答案,因为经过一些研究我发现了一种方法。使用我的方法,图标可以用作静态库的组成部分,这样的库可以被任何类型的应用程序使用)。 另见:https://www.codeproject.com/Articles/1275122/How-to-embed-resources-in-a-Static-Library

  1. 图标转换为BYTE的静态数组。 bin2c可以用于此。
  2. 数据转换为HICON句柄。我是这样做的:

    HICON GetIcon()
    { 
       DWORD dwTmp;
       int offset;
       HANDLE hFile;
       HICON hIcon = NULL;
       offset = LookupIconIdFromDirectoryEx(s_byIconData, TRUE, 0, 0, LR_DEFAULTCOLOR);
       if (offset != 0)
       {
          hIcon = CreateIconFromResourceEx(s_byIconData + offset, 0, TRUE, 0x00030000, 0, 0, LR_DEFAULTCOLOR | LR_DEFAULTSIZE);
       }
       return hIcon;  
    }
    
  3. 使用GetIcon代替LoadIcon。 而不是打电话:

  4. m_hIcon = ::LoadIcon(hInstanceIcon, MAKEINTRESOURCE(pXMB->nIcon));

    我打电话

    m_hIcon = GetIcon()