PDA

View Full Version : مشکل در کار با Recourse ها



farshad_shams
شنبه 06 اردیبهشت 1393, 22:15 عصر
سلام
من به یک مشکل توی کار با Recourse ها برخورد کردم:
میخوام یک فایل از داخل EXE فایل Extract کنم یک تغییراتی در اون ایجاد کنم و دوباره داخل همون EXE یا EXE جدید اضافه اش کنم.
این کارو به شکل زیر انجام دادم :




{$R RecDB.RES}
{$R *.dfm}


// با باز شدن فرم فایل دیتابیس رو اکسترکت میکنم
procedure TForm1.FormShow(Sender: TObject);
var RS : TResourceStream;
FS : TFileStream;
begin
RS := TResourceStream.Create(hInstance, 'MyDB', RT_RCDATA);
try
FS := TFileStream.Create(ExtractFilePath(Application.Exe Name)+'DataB.mdb', fmCreate) ;
try
FS.CopyFrom(RS, 0) ;
finally
FS.Free;
end;
finally
RS.Free;
end;
end;

procedure TForm1.BtnLoadClick(Sender: TObject);
var str : TStringList;
begin
// از خود برنامه یک فایل جدید میسازم
CopyFile(PChar(Application.ExeName),Pchar( ExtractFilePath(Application.ExeName)+'New'+Extract FileName(Application.ExeName) ),True);
// فایل ریسورس رو ذخیره میکنم
str := TStringList.Create;
str.Add('MyDB RCDATA DataB.mdb');
str.SaveToFile(ExtractFilePath(Application.ExeName )+'RecDB.rc');
str.Free;
// ریسورس رو کامپایل میکنم
ShellExecute(0,'','brcc32.exe','RecDB.rc',PChar(Ex tractFilePath(Application.ExeName)),SW_Hide);
// اینجا هم به فایل اجرایی الحاق میکنم
ShellExecute(0,'','brc32.exe',PChar('RecDB.RES '+'New'+ExtractFileName(Application.ExeName)),PCha r(ExtractFilePath(Application.ExeName)),SW_Hide);
end;




به این شکل استفاده کردم تا فایل ریسورس داخل EXE شاید Replace بشه که انگار نمیشه.
حتی از فایل ریسورس با اسم و متغییر جدید هم استفاده کردم ولی اصلا نشد.
حالا از دوستان عزیز ممنون میشم اگه کسی ایده ای داره بگه تا من امتحان کنم.
میخوام یک فایل مثلاً دیتابیس از داخل EXE فایل، Extract کنم یک تغییراتی در اون ایجاد کنم و دوباره داخل همون EXE یا EXE جدید اضافه اش کنم.

مرد مباح
یک شنبه 07 اردیبهشت 1393, 00:49 صبح
دوست عزیز.
تا جایی که من فهمیدم brc32 فقط کار کامپیال ریسورس رو انجام میده ولی نمیتونی اون رو اتچ کنی.
از کجا پیدا کردی این که فایل رو به exe متصل میکنه؟ چون من چیزی پیدا نکردم.
فرمتش میگه بعد از سوئیچها، یک نام فایل جلوش قرار میگیره.

برای این کاری که میخواین بکنین هیچ عیده ای ندارم و اگه چیزی پیدا شد خیلی خوشحال میشم یاد بگیرم.
ولی میتونی چیزی که میخوای ببری توی برنامه، توی رجیستری و یا یک فایل تغییر شکل یافته ذخیره کنی. دیگه نیازی به کامپایل نیست.

farshad_shams
یک شنبه 07 اردیبهشت 1393, 01:12 صبح
از کجا پیدا کردی این که فایل رو به exe متصل میکنه؟ چون من چیزی پیدا نکردم
از مطالب تاپیک زیر استفاده کردم :
http://barnamenevis.org/showthread.php?287832-Attach-%DA%A9%D8%B1%D8%AF%D9%86-%DB%8C%DA%A9-%D9%81%D8%A7%DB%8C%D9%84-%D8%B1%DB%8C%D8%B3%D9%88%D8%B1%D8%B3-%D8%A8%D9%87-%DB%8C%DA%A9-%D9%81%D8%A7%DB%8C%D9%84-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C%DB%8C


ولی میتونی چیزی که میخوای ببری توی برنامه، توی رجیستری و یا یک فایل تغییر شکل یافته ذخیره کنی. دیگه نیازی به کامپایل نیست.
ممنون از هم فکریت اما باید حتماً به همین شکلی که توضیح دادم باشه

یوسف زالی
یک شنبه 07 اردیبهشت 1393, 13:06 عصر
چرا با دستورات دستکاری ریسورس کار نمی کنی؟
BeginUpdateResource
UpdateResource
EndUpdateResource

در ضمن شما کجا الحاق رو انجام دادی؟ Make نذاشتی..

farshad_shams
یک شنبه 07 اردیبهشت 1393, 13:29 عصر
چرا با دستورات دستکاری ریسورس کار نمی کنی؟
BeginUpdateResource
UpdateResource
EndUpdateResource


با این دستورات آشنایی نداشتم. با اینا میشه به چیزی که منظورم بود برسم؟



در ضمن شما کجا الحاق رو انجام دادی؟ Make نذاشتی..

فکر میکردم که عمل الحاق با brc32 انجام بشه !! مگه اینطور نیست؟
از Make به چه شکل میتونم استفاده کنم؟

یوسف زالی
یک شنبه 07 اردیبهشت 1393, 13:52 عصر
در همون لینکی که گذاشتید توضیحات کاملی گذاشته شده.
با دستورات بالا هم می تونید ریسورس ها رو تغییر بدید. در حقیقت برنامه ای مثل ResHacker شبیه همین کار رو می کنه.

farshad_shams
یک شنبه 07 اردیبهشت 1393, 16:05 عصر
با دستورات بالا هم می تونید ریسورس ها رو تغییر بدید

با UpdateResource فایل ریسورس به فایل اجرایی الحاق شد از حجم فایل مشخصه اما قابل دسترسی نیست. در انتهای این کد وقتی فراخوانی میکنم پیغام میده : Resource MyBD2 not found


CopyFile(PChar(Application.ExeName),Pchar( ExtractFilePath(Application.ExeName)+'New'+Extract FileName(Application.ExeName) ),True);
str := TStringList.Create;
str.Add('MyDB2 RCDATA DataB.mdb');
str.SaveToFile(ExtractFilePath(Application.ExeName )+'Rec.rc');
str.Free;
ShellExecute(0,'','brcc32.exe','Rec.rc',PChar(Extr actFilePath(Application.ExeName)),SW_Hide);

FS := TFileStream.Create(ExtractFilePath(Application.Exe Name)+'Rec.RES', fmOpenRead);
FS.Seek(0, soFromBeginning);
DataLength := FS.Size;
GetMem(Data, DataLength);
FS.Read(Data^, DataLength);
FS.Free;

ResourceHandle := BeginUpdateResource(pChar(ExtractFilePath(Applicat ion.ExeName)+'NewProject1.exe'), False);
IF (ResourceHandle <> 0) Then
Begin
Ok := True;
IF (not UpdateResource(ResourceHandle, RT_RCDATA, pChar('MyDB2'), 0, 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 <span class="s402d501ebt2" id="s402d501ebt2_6">failed</span>!');
FreeMem(Data);
end;

RS := TResourceStream.Create(hInstance, 'MyDB2', RT_RCDATA);
try
FS := TFileStream.Create(ExtractFilePath(Application.Exe Name)+'DBF\DataB.mdb', fmCreate) ;
try
FS.CopyFrom(RS, 0) ;
finally
FS.Free;
end;
finally
RS.Free;
end;

farshad_shams
سه شنبه 16 اردیبهشت 1393, 02:01 صبح
توی بعضی موارد کار با
BeginUpdateResource
UpdateResource
EndUpdateResource
با این خطا مواجه میشم:

118685

یوسف زالی
سه شنبه 16 اردیبهشت 1393, 10:20 صبح
بعضی موارد

باید مواردش رو پیدا کنید. شاید برنامتون در حال استفاده هست، جای دیگه بازه، هندلش آزاد نشده، وسط کار باهاش ارتباط با فایل قطع شده...

Mask
سه شنبه 16 اردیبهشت 1393, 10:35 صبح
نیاز به ارسال پست خصوصی نیست. من یا هر کدام از دوستان اگه توانایی و وقت لازم برای جواب دادن داشته باشیم، حتما رسیدگی میکنیم.
من به شخصه برای این امور از ریسورس ها استفاده نمیکنم.
بلکه از روش Binder استفاده میکنم.
در این روش فایل مادری دارید، که فایلهاتون رو به راحتی به انتهای اون چسبونده و یا اینکه از آخرش حذف میکنیم. و یا بر اکستراکت میکنید.
محاسن این روش :
1- محدودیت در نوع فایل ندارید.
2- با آشنایی با روشهای کار با استریم به راحتی قابل پیاده سازیست.
3-میتونید فایلهاتون رو قبل از Bind کردن کمپرس یا درهم کنید.
و...
برای شروع هم کار با استریمها رو جستجو کنید.
این سایت (http://www.vbforums.com/showthread.php?732791-File-Binder&p=4498755&viewfull=1#post4498755) هم نمونه ساده ای داره.

majidbestgame
سه شنبه 16 اردیبهشت 1393, 15:54 عصر
امروز پیام خصوصیتونو دیدم
خیلی وقت بود نتونسته بودم تاپیک ها رو ببینم
ولی این کاری که شما میخوایید انجام بدین رو من حدودا یکی دوسال پیش تو یه پروژه ستاپ ساز انجام دادم
اینکه بگم برین دنبال کد بگردین و پیدا کنید رو خیلی قبول ندارم
به همین خاطر کدی را که خودم تو ستاپ سازم استفاده کردم رو میزارم به امید اینکه تو ایران هم فرهنگ انتشار مطالب بیشتر جا بی افته
و همه از هم باد بگیریم



// کد استفاده شده در پروژه ستاپ ساز MBG Installer 6.0
procedure updateExe(Exepath,resPath,resname:String);var ResourceHandle :Thandle;
FS:TfileStream;
length:longint;
ok:boolean;
Data : PBuffer;
begin
try
if not fileexists(Exepath) then
BEGIN
showmessage('adding resource failed..'+#10#13+'Executable file not found.') ;
abort;
END;


ResourceHandle :=BeginUpdateResource(pchar(ExePath),False);
Fs:=TFilestream.Create(respath,fmOpenRead or fmShareDenyWrite or fmShareDenyRead);
FS.Seek(0, soFromBeginning);
length:=fs.Size;
GetMem(Data, Length);
FS.Read(Data^, Length);


UpdateResource(resourcehandle,RT_RCDATA, pChar(resname),LANG_SYSTEM_DEFAULT,pointer(data),l ength);
ok:=true;
IF (not EndUpdateResource(ResourceHandle, false)) Then Ok := False;


if ok=false then begin
showmessage('adding resource failed..'+#10#13+'Colse all other applications and try again') ;
end;
freemem(Data);
FS.Free;
except;
fs.Free;
Freemem(data);
end;


end;
امیدوارم کارتون راه بی افته
اگه سوال داشتین بپرسین در حد توانم جواب میدم

farshad_shams
سه شنبه 16 اردیبهشت 1393, 22:43 عصر
شاید برنامتون در حال استفاده هست، جای دیگه بازه، هندلش آزاد نشده، وسط کار باهاش ارتباط با فایل قطع شده...
من فایلی که در حال اجرا نبود انتخاب کردم نمیدونم چرا اینجور Erorr میده



نیاز به ارسال پست خصوصی نیست. من یا هر کدام از دوستان اگه توانایی و وقت لازم برای جواب دادن داشته باشیم، حتما رسیدگی میکنیم.
من به شخصه برای این امور از ریسورس ها استفاده نمیکنم.
بلکه از روش Binder استفاده میکنم.
از اینکه با پست خصوصی درخواست کردم عذر میخوام چون خیلی برام مهم بود و عجله داشتم زحمت دادم
اما من فعلاً مجبورم از ریسورس ها استفاده کنم.



ولی این کاری که شما میخوایید انجام بدین رو من حدودا یکی دوسال پیش تو یه پروژه ستاپ ساز انجام دادم
من از این روش هم استفاده کردم، برای اضافه کردن ریسورس به فایل مشکل ندارم. ولی موقع اکسترکت کردن یا پیغام خطای بالا رو میده یا از نام ریسورسم خطا میگیره که پیدا نشد.
شما برای اکسترکت کردن از چه روشی استفاده میکنید.

majidbestgame
چهارشنبه 17 اردیبهشت 1393, 13:13 عصر
من از این روش هم استفاده کردم، برای اضافه کردن ریسورس به فایل مشکل ندارم. ولی موقع اکسترکت کردن یا پیغام خطای بالا رو میده یا از نام ریسورسم خطا میگیره که پیدا نشد.
شما برای اکسترکت کردن از چه روشی استفاده میکنید.
اگه شما ریسورس را به درستی به فایل اجرایی افزوده باشین نباید خطایی دریافت کنید
شما بعد از اینکه ریسورس را به فایل اجرایی اضافه کردین با برنامه ریسورس هکر فایل اجرایی رو باز کنید و توی زیر شاخه RCDATA به دنبال ریسورسی که افزودین بگردین و اگه اونجا ریسورستون موجود بود که باس تو مرحله اکستراکت مشگل باشه اگه نبود که تو مرحله افزودن مشگل دارین/ حالا به هر دلیلی

farshad_shams
جمعه 19 اردیبهشت 1393, 12:34 عصر
از همه ی دوستانی که توی این تاپیک کمک کردن و یا با پیام خصوصی باعث زحمتشون شدم خیلی خیلی ممنونم.
من فعلاً مجبور شدم از Binder استفاده کنم. یه توضیح مختصر هم بدم شاید برای کسی مفید بود :
فایل Stub و DB رو با ریسورس داخل فایل EXE قرار دادم، در موقع لزوم اول DB را اکسترکت میکنم تغییرات را انجام میدم بعد Stub را اکسترکت میکنم فایل جدیدم رو میسازم و فایل DB رو در فایل جدید قرار میدم.