PDA

View Full Version : Attach کردن یک فایل ریسورس به یک فایل اجرایی



مهران رسا
پنج شنبه 29 اردیبهشت 1390, 09:16 صبح
سلام

فرض کنید یک فایل ریسورس با پسوند .RES داریم و میخوایم اون رو به یک فایل اجرایی اضافه کنیم. ضمناً این روهم در نظر بگیرید که قبلاً در فایل اجرایی تننظیماتی قرار دادیم تا بتونه ریسورس مربوطه رو شناسایی کنه اما امکان Compile مجدد فایل اجرایی وجود نداره. حالا چطوری باید این فایل ریسورس رو به فایل اجرایی Attach کنیم؟

Felony
پنج شنبه 29 اردیبهشت 1390, 10:34 صبح
تو همون سورس Install Maker من به کتابخانه Build توجه کنید ، ابتدا فایل ریسورس رو به صورت Dynamic تو اون کتاخانه ساختم ، مثلا :

// Add Font,s
for i:= 0 to FRM_SilentFiles.VLE_Font.Strings.Count - 1 do
begin
TempString:= 'Font_'+ IntToStr(i)+ ' RCDATA "'+ FRM_SilentFiles.VLE_Font.Strings.ValueFromIndex[i]+'"';
Str.Add(TempString);
end;

بعد اون رو به فرمت rc ذخیره و برای ساخت ریسورس اصلی آماده کردم :

Str.SaveToFile(FRM_PageControl.APPDir+'Compiler\Da ta.rc');

بعد فایل ریسورس رو توسط کامپایلر ریسورس خود دلفی کامپایل کردم :

ShellExecute(0,'','Intro.exe','Data.rc',PChar(FRM_ PageControl.APPDir+'Compiler'),SW_Hide);

اون Intro.exe همون کامپایلر ریسورس دلفی هست که تغییر نامش دادم .

در آخر هم توسط کد زیر فایل ریسورس رو به فایل exe مورد نظر الحاق کردم :

ShellExecute(0,'','Make.exe','Data.res Setup.exe',PChar(FRM_PageControl.APPDir+'Compiler' ),SW_Hide);

اگر مشکلی داشتید بگید تا راهنماییتون کنم .

مهران رسا
پنج شنبه 29 اردیبهشت 1390, 16:15 عصر
در آخر هم توسط کد زیر فایل ریسورس رو به فایل exe مورد نظر الحاق کردم :مجتبی جان دقیقاً همین قسمت آخر رو میخواستم دیگه . اون Maker.exe چطوری عملیات الحاق رو انجام میده؟

توسط تابع UpdateResource ، بدون نیاز به ایجاد فایل ریسورس میتونید مستقیماً یک Stream رو به عنوان یک ریسورس به فایل اجرایی اضافه کنید (فکر کنم کاراییش بیشتر باشه) :

Uses Classes, Windows, SysUtils, Dialogs;

Type
TBuffer = Array[0..0] of Byte;
PBuffer = ^TBuffer;

Var
FS : TFileStream;
ResourceHandle : THandle;
DataLength : DWord;
Data : PBuffer;
Ok : Boolean;

Begin
ResourceHandle := BeginUpdateResource(pChar('d:\someexefile.exe'), False);
IF (ResourceHandle <> 0) Then
Begin
FS := TFileStream.Create('d:\somebitmap.bmp', fmOpenRead);
FS.Seek(0, soFromBeginning);
DataLength := FS.Size;
GetMem(Data, DataLength);
FS.Read(Data^, DataLength);
FS.Free;

Ok := True;
IF (not UpdateResource(ResourceHandle, RT_RCDATA, pChar('MyNewResource'), LANG_SYSTEM_DEFAULT{MakeLangID(LANG_NEUTRAL, SUBLANG_NEUTRAL)}, Data, DataLength)) Then Ok := False;

IF (not EndUpdateResource(ResourceHandle, False)) Then Ok := False;

IF (Ok) Then ShowMessage('Update of resources successful!')
Else ShowMessage('Update of resources failed!');

FreeMem(Data);
End;
End.

Felony
پنج شنبه 29 اردیبهشت 1390, 18:13 عصر
مجتبی جان دقیقاً همین قسمت آخر رو میخواستم دیگه . اون Maker.exe چطوری عملیات الحاق رو انجام میده؟
داخل پوشه Bin در شاخه ای که دلفی رو نصب کردید به دنبال BRC32.exe بگردید ، این همون Make.exe هست که به عنوان Resource Binder عمل میکنه و من به صورت Command Line باهاش ارتباط برقرار کردم .

nelital
دوشنبه 15 خرداد 1391, 00:16 صبح
سلام دوستان بنده میخوام به یک فایل جاوا که به صورت exe هستش یه فایل dll اضافه کنم اما وقتی با برنامه winrar میخوام این کار رو بکنم موقع اضافه کردن ارور میده
چکار باید بکنم؟ خواهش میکنم راهنمایی کنید