كيف يمكنني جعل ملف التحديث الذاتي (الأم C++)

StackOverflow https://stackoverflow.com/questions/1009356

  •  06-07-2019
  •  | 
  •  

سؤال

أنا باستخدام Microsoft Visual Studio 2008 على ويندوز الهدف النشر.كيف يمكنني جعل ملف "تحديث نفسها"?لقد حصلت بالفعل "يحيل على شبكة" جزء أسفل ، ولكن كيف يمكنني جعل ملف قابل للتنفيذ كتابة أكثر من نفسها ؟

في الأساس, أريد أن أكتب التحديث التلقائي الدليل الذي يشمل أيضا التحديث التلقائي ، محدث يحتاج إلى تحديث كل شيء في الدليل.

ربما طرق يعتمدون التغييرات إلى ملف حتى ملفات قفل صدر العمل.إذا كان لي أن تفعل ذلك على الرغم ربما كنت متابعة هذا الأمر مع الساخنة التصحيح.

هل كانت مفيدة؟

المحلول

وكتابة تنفيذ جديدة وحذف أو حفظ نسخة من العمر واحد - هل يمكن أن ترسل فرق عبر الشبكة والحصول على البرنامج الثالث، ورصد التحديث أو أيا كان، لتطبيقها. وسيكون مجرد سيناريو الصغيرة التي يمكن أن تبدأ من التطبيق عن بعد عندما يدرك يتوفر تحديث. المحدث يمكن إعادة تسمية نفسها لUPDATER_OLD_VERSION $ أو أيا كان، كتابة نسخة محدثة من نفسها مع الاسم المناسب، وبعد ذلك عندما يتم تشغيل التحديث الجديد معرفة ما اذا كان هناك ملف باسم $ UPDATER_OLD_VERSION في دليل التطبيق وحذفه. يمكن أن يكون مجرد تحديث كافة الملفات الأخرى / الكتابة.

نصائح أخرى

وهذه هي الطريقة التي فعلت ذلك مؤخرا. هناك تداخل وجيزة من تشغيل البرنامج القديم والجديد للبرمجة على التوالي. فإنه يجعل من استخدام الحيلة التي يمكنك إعادة تسمية الملف القابل للتنفيذ الحالي وتقديم ملف جديد في مكان قبل إيقاف القديم. هذه ليست 100٪ آمنة تفشل، ولكن الطريقة الوحيدة هذا يمكن أن "الطوب" التطبيق الخاص بك إذا فشل CopyFile.

#include <windows.h>
#include <iostream>
#include <fstream>

void UpgradeService::UpgradeSelf() {

  std::string temp = root         + "\\myprogram_tmp.exe";
  remove(temp.c_str()); // ignore return code

  std::string src = upgradeFolder + "\\myprogram.exe";
  std::string dst = root          + "\\myprogram.exe";


  rename(dst.c_str(),temp.c_str());
  CopyFile(src.c_str(),dst.c_str(),false);
  static char buffer[512];
  strcpy(buffer,dst.c_str());

  /* CreateProcess API initialization */
  STARTUPINFO siStartupInfo;
  PROCESS_INFORMATION piProcessInfo;
  memset(&siStartupInfo, 0, sizeof(siStartupInfo));
  memset(&piProcessInfo, 0, sizeof(piProcessInfo));
  siStartupInfo.cb = sizeof(siStartupInfo);

  ::CreateProcess(buffer, // application name/path
    NULL, // command line (optional)
    NULL, // no process attributes (default)
    NULL, // default security attributes
    false,
    CREATE_DEFAULT_ERROR_MODE | CREATE_NEW_CONSOLE,
    NULL, // default env
    NULL, // default working dir
    &siStartupInfo,
    &piProcessInfo);


  ::TerminateProcess( GetCurrentProcess(),0);
  ::ExitProcess(0); // exit this process

  // this does not return.
}

ولا يمكنك تعديل عموما التطبيق أثناء تشغيله. أنت <م> سوف بحاجة إلى إغلاق البرنامج الأصلي وتعديله من موقع آخر.

وأفعل ذلك باستخدام SETUP.EXE InnoSetup أنه لن يتم إطلاق بصمت ويغلق التطبيق إلى أسفل قبل أن تبدأ تركيب الملفات الجديدة. كان لي أن أضيف مخصصة باسكال [رمز] أقسام لضمان كل شيء إيقاف ولكن لا وظيفة.

وأنت لا يمكن الكتابة فوق الملف في حين انها المنفذة، ولكن يمكنك تسميته. في بلدي التحديث، وإعادة تسمية إكس الحالية إلى شيء مفيد (oldname_dateandtime)، ثم كتابة نسخة جديدة. ثم لصناعة السيارات في اغلاق نظامنا أسفل وإعادة تشغيله من خدمة. عندما يبدأ التطبيق، انها النسخة الجديدة على التوالي.

عندما قمت محدث ، يجب أن منفصل البرنامج عدة.السبب الرئيسي كان مجرد نفس ما تريد القيام به.أقول ببساطة ، ب تحديثات التطبيق الهدف بالإضافة إلى A و B. التحديثاتحاولت أن أجد طريقة أخرى ولكن ما فعلته كان على بذل المزيد صغيرة وبسيطة محدث.:(

وأعتقد أنك تتحدث عن إصدارات الملفات وللتحديث. كما قلتم تحتاج autoupdater.So تحتاج إلى إنشاء خدمة التي تراقب دليل التثبيت ويقارن إصدار الملف على القرص الخاص بك مع الخادم.

وعندما يحدث عدم تطابق يمكنك أن تطلب أحدث البيانات من الخادم. إذا كانت الملفات الذهاب إلى استبداله قيد الاستخدام لديك لوضع علامة عليها للحذف / إلغاء التسجيل خلال التمهيد التالي ويمكنك أذكر هذه التسجيل باستخدام.

ويمكنك نسخ جميع الملفات في ذاكرة التخزين المؤقت وفي وقت لاحق أثناء إعادة التمهيد نسخها إلى دليل التثبيت.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top