PDA

View Full Version : نصب نسخه حدید برنامه روی ماشین کاربران



khoshblagh
دوشنبه 27 دی 1395, 13:05 عصر
با سلام
من نسخه جدید برنامه را در دیتا بیس برنامه ثبت میکنم. سپس برنامه با مقایسه تاریخ ورزن قبلی برنامه با ورژن جدید درخواست نصب برنامه جدید را از کاربر مینماید. کاربر هم با فشردن دکمه نصب کد پیوست اجرا شده و از برنامه خارج میشود. و دوباره ویرایش نصب شده جدید را اجرا مینماید. تا اینجا مشکلی نیست. ولی بعضا کاربران نسخه قدیم برنامه که حالا با کد زیر نامش به OLD.exe را اجرا مینمایند. تصمیم گرفتم به جای تغییر نام کلا فایل اجرایی را حذف و نسخه جدید را نصب نمایم. اما با توجه در حال اجرا بودن برنامه قادر به حذف نمیباشم. پیشنهاد شما برای این معضل چیست؟ متشکرم

Dir:=ExtractFilePath(Application.ExeName);
if FileExists(Dir+'.\old.exe') then DeleteFile(Dir+'.\old.exe') ;
MoveFile(PChar(Dir+'.\Refah.exe'), PChar(Dir+'.\old.exe'));
qryVerson.Open;
qryVersonNewVersion.SaveToFile(Dir+'.\Refah.exe');

hamid-nic
دوشنبه 27 دی 1395, 15:41 عصر
یکی از روش ها استفاده از Batch File است .

khoshblagh
دوشنبه 27 دی 1395, 17:12 عصر
یکی از روش ها استفاده از Batch File است .
با تشکر از پاسختان
خودم هم به این فکر کرده بودم. ولی آیا راه دیگری برای این مسئله نیست؟

Felony
دوشنبه 27 دی 1395, 18:29 عصر
میشه با تریک هایی مثل استفاده MoveFile فایل رو منتقل کرد تا بعد از ریست شدن تغییرات اعمال بشه ولی خوب داستان های خاص خودش رو داره و برای برنامه های معمول کاربرد خاصی نداره. راهکار معمول این هست که یه برنامه updater میسازن که تو Temp استخراج میشه و کارش این هست که نسخه اصلی برنامه رو میبنده ، برنامه رو آپدیت میکنه و دوباره اجراش میکنه و برنامه هم بعد از اجرا چک میکنه اگر فایل updater تو temp بود حذفش میکنه .

khoshblagh
دوشنبه 27 دی 1395, 20:13 عصر
با تشکر از پاسختان
میشه یک نمونه ارائه بدید. متشکرم

hp1361
سه شنبه 28 دی 1395, 22:49 عصر
با سلام
من نسخه جدید برنامه را در دیتا بیس برنامه ثبت میکنم. سپس برنامه با مقایسه تاریخ ورزن قبلی برنامه با ورژن جدید درخواست نصب برنامه جدید را از کاربر مینماید. کاربر هم با فشردن دکمه نصب کد پیوست اجرا شده و از برنامه خارج میشود. و دوباره ویرایش نصب شده جدید را اجرا مینماید. تا اینجا مشکلی نیست. ولی بعضا کاربران نسخه قدیم برنامه که حالا با کد زیر نامش به OLD.exe را اجرا مینمایند. تصمیم گرفتم به جای تغییر نام کلا فایل اجرایی را حذف و نسخه جدید را نصب نمایم. اما با توجه در حال اجرا بودن برنامه قادر به حذف نمیباشم. پیشنهاد شما برای این معضل چیست؟ متشکرم

Dir:=ExtractFilePath(Application.ExeName);
if FileExists(Dir+'.\old.exe') then DeleteFile(Dir+'.\old.exe') ;
MoveFile(PChar(Dir+'.\Refah.exe'), PChar(Dir+'.\old.exe'));
qryVerson.Open;
qryVersonNewVersion.SaveToFile(Dir+'.\Refah.exe');


سلام

میتونید در زمان اجرای برنامه چک کنید اگر فایلی با نام Old.EXE در کنار برنامه وجود داره، پاکش کنه.

برای فرآیند آپدیت هم بدین صورت عمل کنید که:
1- فایل اجرایی برنامه رو تغییر نام بدید مثلا از App.exe به Old.Exe
2-نسخه جدید رو دانلود کرده و در کنار فایل اجرایی تغییر نام داده شده بزارید.(با نام App.exe)
3- دستور Application.Terminate رو صادر کنید
4-بعد از دستور بالا، دستور اجرای برنامه رو بدید

WinExec(PAnsiChar(AnsiString(ParamStr(0))), SW_SHOW);


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

موفق باشیم

khoshblagh
چهارشنبه 29 دی 1395, 00:10 صبح
سلام

میتونید در زمان اجرای برنامه چک کنید اگر فایلی با نام Old.EXE در کنار برنامه وجود داره، پاکش کنه.

برای فرآیند آپدیت هم بدین صورت عمل کنید که:
1- فایل اجرایی برنامه رو تغییر نام بدید مثلا از App.exe به Old.Exe
2-نسخه جدید رو دانلود کرده و در کنار فایل اجرایی تغییر نام داده شده بزارید.(با نام App.exe)
3- دستور Application.Terminate رو صادر کنید
4-بعد از دستور بالا، دستور اجرای برنامه رو بدید

WinExec(PAnsiChar(AnsiString(ParamStr(0))), SW_SHOW);


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

موفق باشیم

باسلام و تشکر از پاسختان
من فرمایش شما را به شکل زیر اجرا کردم ولی متاسفانه برنامه مجدد اجرا نشد. البته من از XE4 و ویندوز سون استفاده میکنم و به نظرم خط آخر مشکل دارد. در حقیقت فایل old.exe حذف میشود و همچنین فایل جدید هم در فولدر برنامه قرار میگیرد ولی خود برنامه مجددا احرا نمیشود.
لطفا راهنمایی بفرمائید. متشکرم



MoveFile(PChar(Dir+'.\SandoghWam.exe'), PChar(Dir+'.\old.exe'));
qryVerson.Open;
qryVersonNewVersion.SaveToFile(Dir+'.\SandoghWam.e xe');
EnableWindow(FindWindowEx(FindWindow('Shell_TrayWn d',nil),0,'Button',nil),true);
application.Terminate ;
WinExec(PAnsiChar(AnsiString(ParamStr(0))), SW_SHOW);

hp1361
چهارشنبه 29 دی 1395, 08:30 صبح
سلام

شما همچین چیزی باید بنویسید

حذف فایل های پیشین در زمان اجرای برنامه:


procedure TForm1.FormCreate(Sender: TObject);
begin
// ParamStr(0) : returns the path and file name of the executing program (for example, C:\TEST\MYPROG.EXE).
// ExtractFilePath(ParamStr(0)) : Returns the drive and directory portions of a file name.

DeleteFile(ParamStr(0) + '.old');
end;


آپدیت برنامه با کلیک بر روی دکمه آپدیت


procedure TForm1.btn_UpdateClick(Sender: TObject);
begin
RenameFile(ParamStr(0), ParamStr(0) + '.old');
qryVersonNewVersion.SaveToFile(ExtractFilePath(Par amStr(0)) + 'SandoghWam.exe');
Application.ProcessMessages;
WinExec(PAnsiChar(AnsiString(ParamStr(0))), SW_SHOW);
end;


به انتهای فایل اگزه قبلی عنوان Old اضافه شده و سپس اگزه جدید اجرا میشود

البته موارد کنترلی چون انجام صحیح ذخیره ورژن جدید بر روی سیستم هم فراموش نشود

موفق باشیم

khoshblagh
چهارشنبه 29 دی 1395, 23:58 عصر
با سلام خدمت
من طبق فرمایش شما عمل کردم.
با کنترل مراحل موارد روبرو بدرستی انجام میشود: 1 - حدف فایل قدیم 2- تغییر نام برنامه به همان نام و با پسوند old و 3- واکشی نسخه جدید از بانک اطلاعاتی به فولدر برنامه
ولی با این وجود قسمت اصلی یعنی باز شدن برنامه انجام نمیگیرد. پس ناچار با زدن دکمه انصراف همان نسخه قدیمی نمایش داده میشود.

در موقع ورود به برنامه:


ParamStr(0);
ExtractFilePath(ParamStr(0));
DeleteFile(ParamStr(0) + '.old');


و در دکمه بروزآوری:


RenameFile(ParamStr(0), ParamStr(0) + '.old');
qryVersonNewVersion.SaveToFile(ExtractFilePath(Par amStr(0)) + 'SandoghWam.exe');
Application.ProcessMessages;
WinExec(PAnsiChar(AnsiString(ParamStr(0))), SW_SHOW);

hamid-nic
پنج شنبه 30 دی 1395, 09:15 صبح
برنامه ای که به عنوان برنامه آپدیت شده هست باید با اسم new.exe در کنار exe قبلی قرار بگیره و به جای NameOfProgram.exe هم نام درست برنامه خودتون را وارد کنید . تست کنید و نتیجه را بگید .

var
sl: TStringList;
begin
sl := TStringList.Create;
try
sl.Append(':Repeat');
sl.Append('del "' + Application.ExeName + '"');
sl.Append('if exist "' + ExtractFileName(Application.ExeName) +
'" goto Repeat');
sl.Append('Ren "'+ExtractFilePath(Application.ExeName)+'new.exe"'+' "NameOfProgram.exe"');
sl.Append('start "" "' + Application.ExeName +'"');
sl.Append('del "' + ExtractBackDir(Application.ExeName) + '\Del.bat"');
sl.SaveToFile(ExtractBackDir(Application.ExeName) + '\Del.bat');

ShellExecute(Handle, 'open', pchar(ExtractBackDir(Application.ExeName) + '\Del.bat'), '', '', 7);
Application.Terminate;
finally
sl.Free;
end;


تابع ExtractBackDir :

function ExtractBackDir(Path: string): string;
begin
Result := ExcludeTrailingPathDelimiter
(Copy(Path, 1, LastDelimiter('\', ExtractFileDir(Application.ExeName))));
end;

khoshblagh
پنج شنبه 30 دی 1395, 18:28 عصر
با سلام و تشکر از پیگیری جهت رفع مشکل
احتراما با اجرای این کد فایل برنامه حذف میشود . و در ادامه پیام عدم پیدا نمودن همان فایل در مسیر فولدر برنامه نمایش داده میشود. ضمنا من در این کد استخراج فایل برنامه از دیتا بیس را نمی بینم.


procedure TfrmUpdateVersion.btn2Click(Sender: TObject);
var
sl: TStringList;
begin
sl := TStringList.Create;
try
sl.Append(':Repeat');
sl.Append('del "' + Application.ExeName + '"');
sl.Append('if exist "' + ExtractFileName(Application.ExeName)+'" goto Repeat');
sl.Append('Ren "'+ExtractFilePath(Application.ExeName)+'new.exe"'+'"SandoghWam.exe"');
sl.Append('start "" "' + Application.ExeName +'"');
sl.Append('del "' + ExtractBackDir(Application.ExeName)+ '\Del.bat"');
sl.SaveToFile(ExtractBackDir(Application.ExeName)+ '\Del.bat');
ShellExecute(Handle, 'open', pchar(ExtractBackDir(Application.ExeName) + '\Del.bat'), '', '', 7);
Application.Terminate;
finally
sl.Free;
end;
end;



ضمنا این کد هم ظاهرا مورد نیاز نمی باشد.
در موقع ورود به برنامه:


ParamStr(0);
ExtractFilePath(ParamStr(0));
DeleteFile(ParamStr(0) + '.old');

hp1361
پنج شنبه 30 دی 1395, 19:39 عصر
با سلام و تشکر از پیگیری جهت رفع مشکل
احتراما با اجرای این کد فایل برنامه حذف میشود . و در ادامه پیام عدم پیدا نمودن همان فایل در مسیر فولدر برنامه نمایش داده میشود. ضمنا من در این کد استخراج فایل برنامه از دیتا بیس را نمی بینم.

ضمنا این کد هم ظاهرا مورد نیاز نمی باشد.
در موقع ورود به برنامه:

سلام

من جسارتا دستورات زیر رو بصورت کامنت برای شما گذاشتم که بدونید چه کاری داره انجام میده(راهنمای خود دلفیه)


// ParamStr(0) : returns the path and file name of the executing program (for example, C:\TEST\MYPROG.EXE).

// ExtractFilePath(ParamStr(0)) : Returns the drive and directory portions of a file name.


روی سیستم چک کردم. دستور WinExec نسخه جدید رو اجرا میکنه اما فایل قبلی رو پاک نمیکنه!(البته در صورت اجرای مجدد برنامه کدحذف اجرا میشه، اما چرا دفعه اول اجرا نمیشه رو نمیدونم(احتمال بر میگرده به تابع WinExec)

دستور ShellExecute رو تست کردم و بدرستی کار کرد.


ShellExecute(Handle, 'open', PWideChar(ParamStr(0)), '', '', SW_SHOW);


یه نمونه برنامه رو براتون آپلود میکنم که خودتونم روی سیستم چک کنید

khoshblagh
جمعه 01 بهمن 1395, 01:45 صبح
با سلام
جسارتا در نمونه ارائه شده فقط یک خط جهت حذف نسخه قدیم برنامه موجود است که من در برنامه خودم طبق پست شماره 11 استفاده نمودم. در صورت امکان نمونه را بررسی بفرمائید. متشکرم

hamid-nic
جمعه 01 بهمن 1395, 18:03 عصر
هم راه حل آقای پاکدل و هم راه حلی که بالا گذاشتم جواب میده
نیاز به مطالعه و بررسی داره
در ضمن قرار نیست از دیتابیس فایل بروز رسانی را بگیره !

khoshblagh
جمعه 01 بهمن 1395, 18:39 عصر
هم راه حل آقای پاکدل و هم راه حلی که بالا گذاشتم جواب میده
نیاز به مطالعه و بررسی داره
در ضمن قرار نیست از دیتابیس فایل بروز رسانی را بگیره !
باسلام
روش برنامه های من جهت بروزآوری اینطوره(قطعا راههای دیگری هست که من نمیدانم) که نسخه جدید برنامه را در یک فیلد از یک جدول قرار میدهم و در فیلد دیگری تاریخ این نسخه که در حقیقت همان شماره ویرایش جدید برنامه هست هم ثبت میکنم. حالا هر کاربر به محض اجرای برنامه، بخشی از کدهای برنامه به آن جدول مراچعه (طبق پست شماره یک) و تاریخ نسخه فعلی برنامه را با آن تاریخ مقایسه و اگر مغایر بود با باز شدن فرم دیگر از کاربر میخواهد نسبت به بروزآوری برنامه اقدام نماید. در صورت فشردن دکمه بروزآوری نسخه جدید از برنامه از آن جدول در کنار برنامه قرار میگیرد. البته قبل از آن نسبت به تغییر نام برنامه فعلی به Old.exe اقدام میشود. سپس در ادامه کار برنامه خاتمه میبابد. حال کاربر میبایست نسبت به اجرای مجدد برنامه اقدام نماید.مشکل وقتی پیش می آید که اشتباها کاربر همان نسخه Old.exe را اجرا نموده و پروسه تکرار میشود. البته به کاربران گوشزد میشود که به محض بروزآوری و قبل از اجرای مجدد برنامه نسبت به حذف Old.exe اقدام نمایند. ولی در عمل بعضی از کاربران فراموش کرده و وارد فرایند دوباره کاری میشوند. پس با این روش نیاز به مراجعه دیتابیس جهت اخذ نسخه جدید برنامه میباشد.
در همین جا از زحمات جنابعالی و به خصوص جناب آقای پاکدل که مصرانه پیگر حل این مسئله می باشند کمال تشکر را دارم.

hp1361
شنبه 02 بهمن 1395, 07:56 صبح
باسلام
روش برنامه های من جهت بروزآوری اینطوره(قطعا راههای دیگری هست که من نمیدانم) که نسخه جدید برنامه را در یک فیلد از یک جدول قرار میدهم و در فیلد دیگری تاریخ این نسخه که در حقیقت همان شماره ویرایش جدید برنامه هست هم ثبت میکنم. حالا هر کاربر به محض اجرای برنامه، بخشی از کدهای برنامه به آن جدول مراچعه (طبق پست شماره یک) و تاریخ نسخه فعلی برنامه را با آن تاریخ مقایسه و اگر مغایر بود با باز شدن فرم دیگر از کاربر میخواهد نسبت به بروزآوری برنامه اقدام نماید. در صورت فشردن دکمه بروزآوری نسخه جدید از برنامه از آن جدول در کنار برنامه قرار میگیرد. البته قبل از آن نسبت به تغییر نام برنامه فعلی به Old.exe اقدام میشود. سپس در ادامه کار برنامه خاتمه میبابد. حال کاربر میبایست نسبت به اجرای مجدد برنامه اقدام نماید.مشکل وقتی پیش می آید که اشتباها کاربر همان نسخه Old.exe را اجرا نموده و پروسه تکرار میشود. البته به کاربران گوشزد میشود که به محض بروزآوری و قبل از اجرای مجدد برنامه نسبت به حذف Old.exe اقدام نمایند. ولی در عمل بعضی از کاربران فراموش کرده و وارد فرایند دوباره کاری میشوند. پس با این روش نیاز به مراجعه دیتابیس جهت اخذ نسخه جدید برنامه میباشد.
در همین جا از زحمات جنابعالی و به خصوص جناب آقای پاکدل که مصرانه پیگر حل این مسئله می باشند کمال تشکر را دارم.

سلام مجدد

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

بطور کلی قاعدتا فرآیند به این شکل خواهد بود

1- بررسی وجود نسخه جدید(حالا میتونه خودش خودکار چک بشه و یا کاربر بر روی دکمه یا منویی چیزی کلیک کنه)
2-دریافت نسخه جدیدو ذخیره آن در سیستم کاربر
3-حذف نسخه قدیم
4-اجرای نسخه جدید

مورد اول و دوم که کاملا دست شما بازه و هرجور مایلید میتونید پیاده سازی کنید.
برای مورد سوم، چون بعد از دریافت نسخه جدید و اجرای آن، حتما رویداد OnCreate اجرا خواهد شد، لذا عملیات حذف رو در این رویداد اجرا می کنیم تا مطمئن بشیم فایل قبلی حذف شده. دلیل اینکه اینکار رو در بعد از مورد دوم انجام ندادیم(یعنی در ادامه کدهای دریافت نسخه جدید) این است که هنوز پروسه مربوط به فایل اگزه در حال اجراست و سیستم اجازه حذفش رو نخواهد داد.

برای مورد چهارم هم که دو تابع ShellExecute و CreateProccess پیشنهاد میشه که در کدها من ShellExecute روقرار دادم.

موفق باشیم