1. 程式人生 > 實用技巧 >如何在靜態庫中嵌入資源

如何在靜態庫中嵌入資源

參見我的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