可執行檔案(如:*.exe、*.dll)本身就可附加許多Resource,加上Resource檔案沒限定型態,因此,使用者也可以將可執行檔附加到可執行檔中,使用Visual Studio附加Resource是相當方便的做法,但是如何Drop該附加的檔案呢?其實也是相當容易,只要搜尋Resource並載入記憶體,接著寫到指定的地方就可以,司徒已經將這些步驟寫成一段副程式,使用者直接拿去使用即可,程式如下所示。
好用的Drop File副程式
void DropFile(DWORD dwID, TCHAR* pResType, TCHAR* pFileName) { HMODULE hModule = GetModuleHandle(NULL); HRSRC resource = FindResource(hModule, MAKEINTRESOURCE(dwID), pResType); HGLOBAL hRSC = LoadResource(hModule, resource); LPVOID lpResBuffer = (unsigned char*)::LockResource(hRSC); DWORD dwFileSize = SizeofResource(hModule, resource); HGLOBAL hGlobal = GlobalAlloc(GMEM_MOVEABLE, dwFileSize); LPVOID pvData = GlobalLock(hGlobal); memcpy(pvData, lpResBuffer, dwFileSize); HANDLE hFile = CreateFile(pFileName, GENERIC_READ | GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL); if(hFile != INVALID_HANDLE_VALUE){ DWORD dwRet; WriteFile(hFile, pvData, dwFileSize, &dwRet, NULL); CloseHandle(hFile); } GlobalUnlock(hGlobal); GlobalFree(hGlobal); }
司徒使用一個例子說明一下,首先附加一個可執行檔到Resource,Type請使用APP(名稱可自定),ID請使用IDR_APP1,結果如下所示:
使用方式如下所示
DropFile(IDR_APP1, _T("APP"), _T("C:\\demo.exe"));
執行上面DropFile副程式後,就可以將附加的Resource IDA_APP1 drop到c:\demo.exe