如何在静态库中嵌入资源
参见我的GitHub回购。 介绍 它始于一个需要发布一个静态库作为一个产品,包括一些资源。这通常是不可能因为一个程序,使用这样的静态库将使用自己的资源。我发布一个问题(我回答后发现这个解决方案)。我意识到这个解决方案值得与源代码的一篇文章。我也发布了一个关于这种可能性在堆栈溢出的问题。 在另一个场合我希望我任何类型的静态库嵌入另一个文件(可以是一个可执行文件,DLL,照片,文件,等等)和提取它在运行时。 一些代码示例 源由一个静态库项目(“MH_EmbedDataLib”)和一个测试控制台应用程序(“ConsoleApp”)。当然,如果它与GUIless控制台应用程序,它将与其他类型,即。Win32 MFC,等等。 MH_EmbedDataLib图书馆 MH_EmbedDataLib图书馆有两个主要功能: 让图标 隐藏,复制Code
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; }
提供你一个图标您希望使用转换为静态数组的字节,并命名为s_byIconData, GetIcon加载图标从这个静态数据(s_byIconData)。 LookupIconIdFromDirectoryEx函数用于搜索图标的图标或光标或指针数据最适合当前的显示设备。 然后CreateIconFromResourceEx用来创建图标的资源位描述,由Bin2C生成的。 DisplayMessageWithIcon 隐藏,复制Code
void DisplayMessageWithIcon(LPWSTR message) { XMSGBOXPARAMS xmb; //xmb.hInstanceIcon = (HINSTANCE)GetIcon(); xmb.dwOptions |= XMSGBOXPARAMS::RightJustifyButtons; xmb.crBackground = RGB(255, 255, 255); xmb.crText = RGB(10, 135, 180); xmb.nIdIcon = 101; xmb.nTimeoutSeconds = 5; XMessageBox(NULL, message, L"Code Project article by Michael Haephrati", MB_YESNO, &xmb); }
这个函数封装在s_byIconData显示一个消息框显示图标。 这个过程 选择您希望使用照片,或一个图像。一个网站叫ICO大多数图像类型的转换提供了服务转化为ICO文件。ico文件之后,打开它看到转换顺利。然后使用Bin2C转换成字节数组。确保您使用正确的静态数组的名称。(在本例中,我们使用s_byIconData)。然后弹出窗口将显示它。对于本文的目的,我使用Nigara瀑布的照片(加拿大当然…)所示。 结果并不伟大但演示此概念。 XMessageBox 的消息框中使用本文的代码是由汉斯迪特里希。 从一个数组创建临时文件 另一个例子,本文的目的是使用相同的数组由Bin2C特别代文件在运行时。 隐藏,复制Code
bool Array2TempFile(char *arr, size_t len,WCHAR *file) { HANDLE hFile = CreateFile(file, GENERIC_WRITE, // open for writing FILE_SHARE_WRITE, // share for writing NULL, // default security CREATE_ALWAYS, // create new file only FILE_ATTRIBUTE_NORMAL | FILE_ATTRIBUTE_ARCHIVE | SECURITY_IMPERSONATION, // normal file archive and impersonate client NULL); // no attr. template DWORD bytes; if (hFile != INVALID_HANDLE_VALUE) { WriteFile(hFile, &arr[0], len, &bytes, NULL); CloseHandle(hFile); return true; } return false; }
我用这个函数从一个静态库中提取并安装内核驱动程序。这是一个例子的使用。 隐藏,复制Code
INF_PATH
和隐藏,复制Code
SYS_PATH
是预定义的。 隐藏,复制Code
int len; // Extract .inf file for x86 Win 10 len = (int)sizeof(sgdrv86_10_inf); Array2TempFile((char *)&sgdrv64_10_inf[0], len, INF_PATH); // Extract .sys file for x86 Win 10 len = (int)sizeof(sgdrv86_10_sys); Array2TempFile((char *)&sgdrv86_10_sys[0], len, SYS_PATH);
本文转载于:http://www.diyabc.com/frontweb/news5076.html