استخراج فایل از منابع فایل اجرایی در زمان اجرا


امروز یه نفر از من خواست یه قطعه کد توی vc++  براش بنویسم که به کمک اون یه فایل اجرایی رو که توی resource های برنامه اضافه کرده در زمان اجرا استخراج کنه و روی هارد ذخیره کنه. دیدم در این مورد روی اینترنت یه قطعه کد قابل اجرا به راحتی پیدا نمیشه و برای همین اون رو اینجا قرار میدم.

روش کار هم ساده است. 
1- در Resource View راست کلیک کنید و گزینه Add و سپس Resource رو انتخاب کنید.
2- دکمه Import رو بزنید و فایل مورد نظر خودتون رو انتخاب کنید.
3- در پنجره Custome Resource Type ، باید برای Resource type مقدار EXE رو وارد کنید.
4- حالا قطعه کد زیر این فایل موجود در resource رو براتون استخراج میکنه.
HMODULE exe = GetModuleHandleA(NULL);
HRSRC hResInfo = FindResourceA(exe, MAKEINTRESOURCEA(IDR_EXE1), "EXE" );
HGLOBAL hRes = LoadResource(exe, hResInfo);
LPVOID memRes = LockResource(hRes);
DWORD sizeRes = SizeofResource(exe, hResInfo);

FILE* fexe = fopen("C:\\e.exe", "wb" );
for(int i=0; i<sizeRes; i++ )
   fwrite( (LPVOID)(((char*)memRes+i)), sizeof(char), 1, fexe);
fclose(fexe);

نکته ها:
1- "EXE" (پارامتر سوم FindResourceA ) همان چیزی است که به عنوان Resource type وارد کردید.
2- اگر پارامتر GetModuleHandleA را NULL قرار دهید، دستگیره ماژول جاری رو برمیگردنه
3- داخل حلقه for به کمک عملگر جمع روی اشاره گرها، بایت های resource رو پیمایش می کنیم.
4- IDR_EXE1 شناسه همان فایلی است که به Resource ها اضافه کردیم.
لینک دانلود کد: