如何在静态库中嵌入资源

参见我的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

posted @ 2020-08-09 12:25  Dincat  阅读(391)  评论(0编辑  收藏  举报