View Full Version : attach كردن يك فايل(مثلا bmp) به فايل exe
meisam.jafarian
دوشنبه 27 مهر 1388, 08:15 صبح
با سلام خدمت دوستان .
ميخواستم بدونم چطور ميشه فايل exe پروژه يك فايل از هر نوع(bmp,txt,exe,....) رو در خودش به صورت ذخيره شده داشته باشه و در صورت لزوم از اون استفاده كنه.
مثلا مانند setup.exe كه فايل هاي dll و ... رو در خودش ذخيره ميكنه و وقت اجرا اونها رو در هارد كپي ميكنه.
ممنون از توجهتون.
Nima_NF
دوشنبه 27 مهر 1388, 17:59 عصر
شما می توانید منابع مورد نظر را به شکل فایل معمولی یا باینری در resource برنامه قرار دهید (فایل rc.h) تا در فایل exe قرار گیرد.
سپس با توابعی مثل FindResource یا FindResourceEx و LockResourc و غیره منابع را دریافت کنید.
فایل های مرسوم resource خیلی ساده با LoadBitmap و LoadImage و امثال آن خوانده می شوند.
meisam.jafarian
سه شنبه 28 مهر 1388, 09:43 صبح
با تشكر فراوان از مديريت محترم بخش كه دلسوزانه از راهنمايي دريغ نميكنند :
دستورات زير را نوشتم :
()void CAsdDlg::OnButton1
}
; HRSRC Res
; HMODULE Mod
; HINSTANCE Inst
;( Res=FindResource(Mod,"IDR_QWE1",RT_RCDATA
;( LoadResource(Mod,Res
حال احتمالا فايل exe مورد نظرم كه به نام IDR_QWE1 (نوع آنرا qwe معرفي كرده) و آنرا به resource اضافه كردهام لود شده است حال براي ايجاد يك كپي از اين فايل exe در هارد ديسك چه بايد كرد؟
خواستم با دستورات زير اين كار را انجام دهم كه ظاهرا اين روش اشتباه است:
; CFile file
;( file.Open("c:\\myprog.exe",CFile::modeCreate|CFile::modeWrite
;( CArchive ar(&file,CArchive::store
;ar<<Res
; ()ar.Close
;() file.Close
Nima_NF
سه شنبه 28 مهر 1388, 15:26 عصر
همه کدهای شما اشتباه هست.
- وقتی متغیر تعریف می کنید باید به آن ها مقدار بدهید و سپس در تابع استفاده کنید!
- شما lockresource می کنید تا داده را دریافت کنید.
- مقدار hinst را دریافت کنید یا NULL قرار دهید.
مثال، برای خواندن یک فایل txt معمولی تحت عنوان یک فایل با ID به نام IDR_FILE1 :
static TCHAR * pText ;
static HGLOBAL hResource ;
HINSTANCE hInst= AfxFindResourceHandle(MAKEINTRESOURCE(IDR_FILE1),R T_RCDATA);
hResource = ::LoadResource (hInst, ::FindResource(NULL,MAKEINTRESOURCE(IDR_FILE1),RT_ RCDATA) ) ;
pText = (char *) ::LockResource (hResource) ;
حال pText را بخوانید و استفاده کنید.
meisam.jafarian
چهارشنبه 29 مهر 1388, 08:37 صبح
بسيار متشكرم.
حال اگر يك فايل exe مثلا calculator ويندوز را بخواهيم به برنامه Attach كنيم و با زدن يك دگمه آنرا در Hard دوباره بسازيم چه بايد كرد؟ چون براي ذخيره كردن در سمت راست دستور >>ar بايد يك متغير باشد .چطور بايد (در مثال شما pText) را اگر IDR_EXE1 يك فايل exe باشد ذخيره كرد؟
Nima_NF
چهارشنبه 29 مهر 1388, 16:29 عصر
شما باشد از ذخیره سازی باینری استفاده کنید. جستجو کنید بارها مثال زده شده است. بحث فایل ها وسیع هست و فقط همین مورد فوق تنها روش ذخریه سازی نیست.
ضمنا دقت کنید که شما فایل exe را به شکل باینری می خوانید (به عنوان یکسری داده 1 بایتی تحت عنوان char) و به همان شکل هم ذخیره می کنید.
یعنی یک فایل با پسوند exe بسازید و سپس داده را به شکل یک سری داده char از resource بخوانید و سپس در همان فایل که نام exe گذاشته بودید کپی کنید.
meisam.jafarian
یک شنبه 03 آبان 1388, 15:01 عصر
متاسفانه مشكل من همچنان پابرجاست به دليل مبتدي بودن تنها روشي كه براي ذخيره سازي بلدم استفاده از دستورات زير است
CFile file
;( file.Open("c:\\myprog.exe",CFile::modeCreate|CFile ::modeWrite
;( CArchive ar(&file,CArchive::store
;?????>>ar
; ()ar.Close
;() file.Close
كه حال نميدانم pText در مثال شما را چگونه بايد در فايل باز شده myprog.exe توسط >>ar ذخيره كنم
البته در تاپيك ها دنبال ذخيره سازي به روش باينري گشتم ولي مطلب مفيدي نصيبم نشد.
اگر روشي بود كه ميشد بوسيله آن تمام فايل ها (bmp,exe,avi,.....) را كه در resource قرار داده ام ذخيره كنم خيلي خوب بود.:افسرده:
Nima_NF
یک شنبه 03 آبان 1388, 16:19 عصر
همیشه برای اینکه به متدها دیگر یک کلاس دست پیدا کنید، در MSDN به بخش member همان کلاس بروید.
مثلا ابتدا به صفحه CArchive بروید و سپس در پایین CArchive Members را انتخاب کنید. حال می توانید سایر متد ها را مشاهده کنید.
برای نوشتن باینری می توانید از متد write در این کلاس استفاده کنید.
در ادامه مثال قبل و داده های بدست آمده از آن :
CFile file
file.Open("c:\\myprog.exe",CFile::modeCreate|CFile ::modeWrite);
CArchive ar(&file,CArchive::store);
ar.Write(pText, SizeofResource(hInst, hResource) );
نکات:
- برای خواندن از read استفاده کنید
- تابع SizeofResource تعداد بایت برگردانده شدهمی دهد، یا هر روش دیگر محاسبه تعداد بایت. (پس این مورد را حتما چک کنید که دقیق تمامی بایت ها کپی شود، پارامتر دوم تابع Write مهم هست)
- نوع pText را همان char در نظر بگیرید و تعریف کنید تا یک بایت باشد، که من اشتباها در مثال قبلی TCHAR انتخاب کردم.
- و آخرین موضوع: حتما از تگ کد استفاده کنید تا کدهای شما خوانا باشد و بتوانیم راحت مشاهده کنیم.
meisam.jafarian
سه شنبه 05 آبان 1388, 10:49 صبح
پس از اجراي برنامه پيشنهادي يك Error ايجاد شد كه به شرح زير ميباشد:
'SizeofResource' : cannot convert parameter 2 from 'void *' to 'struct HRSRC__ *'
براي رفع آن متغيري از نوع HRSRC تعريف كرده و آنرا با تابع FindResourceمقدار دهي كردم و در تابع SizeOfResourceاز آن بعنوان آرگمان دوم استفاده كردم :
void CAsdDlg::OnButton1()
{
static CHAR * pText ;
static HGLOBAL hResource ;
HRSRC hRes;
CFile file;
HINSTANCE hInst= AfxFindResourceHandle(MAKEINTRESOURCE(IDR_CLC1),RT _RCDATA);
hResource = ::LoadResource (hInst, ::FindResource(NULL,MAKEINTRESOURCE(IDR_CLC1),RT_R CDATA) ) ;
hRes=FindResource(NULL,MAKEINTRESOURCE(IDR_CLC1),R T_RCDATA);
pText = (char *) ::LockResource (hResource) ;
file.Open("c:\\myprog.exe",CFile::modeCreate|CFile ::modeWrite);
CArchive ar(&file,CArchive::store);
ar.Write(pText,SizeofResource(hInst,hRes));
//ar.Close();
}
حال مشكل اينجاست كه برنامه اجرا ميشود ولي يك فايل اجرايي با حجم 0KB ساخته ميشود كه پس از اجرا پيغام :
MyProg.exe is not a valid win32 application در يك message box داده ميشود.در ضمن بود و نبود ar.Close هم تاثيري ندارد.
لازم به ذكر است از VC++6 استفاده ميكنم.
meisam.jafarian
جمعه 08 آبان 1388, 11:46 صبح
قابل توجه همه دوستان عزيز و مدير محترم بخش آقاي نيما ...
برنامه اي كه جواب داد به شرح زير است :
به جاي RT_RCDATA بايد بنويسيم :
"QWE"
يعني نامي كه براي Resource type در هنگام لود كردن آن در برنامه انتخاب كرده بوديم.
والسلام
با تشكر فراوان از آقاي نيما ... كه از راهنمايي تازه كارها دريغ نميكنند
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.