2009-06-17 13 views
6

कैसे बना सकता हूं मैं विंडोज़ विजुअल स्टूडियो 2008 का उपयोग विंडोज लक्ष्य परिनियोजन के साथ कर रहा हूं। मैं एक फाइल "खुद को अपडेट" कैसे करूं? मुझे पहले से ही "नेटवर्क पर ट्रांसमिट करना" मिल गया है, लेकिन मैं अपने आप पर एक निष्पादन योग्य लेखन कैसे कर सकता हूं?मैं एक फ़ाइल स्व-अद्यतन (मूल सी ++)

असल में, मैं एक निर्देशिका के लिए एक ऑटो-अपडेटर लिखना चाहता हूं जिसमें ऑटो-अपडेटर भी शामिल है, और अद्यतनकर्ता को निर्देशिका में सब कुछ अपडेट करने की आवश्यकता है।

फ़ाइल लॉक जारी होने तक फ़ाइल में बदलावों को पेंड करने का एक तरीका शायद काम करेगा। अगर मैं ऐसा करना चाहता था, तो शायद मैं इसे हॉट-पैच के साथ अनुपालन करता।

+0

संभावित शिकार: http://stackoverflow.com/questions/250175/writing-my-own-auto-updater – crashmstr

+1

नहीं एक शिकार, इस विशेष रूप से मूल निवासी सी ++ है। –

उत्तर

5

एक नया निष्पादन योग्य लिखें और पुराने की एक प्रति को हटाएं या सहेजें - आप नेटवर्क पर एक अंतर भेज सकते हैं और एक तीसरा प्रोग्राम, अपडेट मॉनीटर या जो कुछ भी इसे लागू कर सकते हैं। यह एक छोटी सी स्क्रिप्ट होगी जिसे रिमोट ऐप से शुरू किया जा सकता है जब यह पता चलता है कि एक अद्यतन उपलब्ध है। अपडेटर खुद को $ UPDATER_OLD_VERSION या जो भी हो, उसका नाम बदलकर उचित नाम से अपडेट कर सकता है, और फिर जब नया अपडेटर चलाया जाता है तो आप जांचते हैं कि ऐप निर्देशिका में $ UPDATER_OLD_VERSION नाम की एक फ़ाइल है और इसे हटाएं। अन्य सभी फाइलों को अभी अपडेट/ओवरराइट किया जा सकता है।

+0

नहीं।वह समाधान मेरे लिए बहुत गन्दा है। मैं इसके बजाय "अस्थायी डेटा" तैरना नहीं होगा। क्या होगा अगर कंप्यूटर बीच में दुर्घटनाग्रस्त हो जाए! –

+3

@ वाह - इतना बेहतर है कि यह वास्तविक exe को ओवरराइट करने से अस्थायी डेटा लिख ​​रहा है। इसके अलावा, फिक्स आसान है: एक टेम्पफाइल पर लिखें, फिर इसे अपने अंतिम स्थान पर रखने के लिए MoveFile को कॉल करें। उसी मात्रा में, MoveFile परमाणु है इसलिए एक क्रैश इसे असंगत स्थिति में नहीं छोड़ेगा। – Michael

+0

सोलोबॉल्ड का सुझाव यह है कि इस तरह की चीज आम तौर पर कैसे की जाती है। आप जिस एप्लिकेशंस को अपडेट कर रहे हैं वह खुद को अपडेट नहीं कर सकता है। जैसा कि आप कहते हैं, क्या होगा यदि कंप्यूटर बीच में दुर्घटनाग्रस्त हो जाए? –

2

मैं इसे एक InnoSetup setup.exe का उपयोग करके करता हूं जो चुपचाप लॉन्च किया जाता है और नई फ़ाइलों को इंस्टॉल करना शुरू करने से पहले मेरे ऐप को बंद कर देता है। मुझे यह सुनिश्चित करने के लिए कस्टम पास्कल [कोड] अनुभाग जोड़ना था कि यह सबकुछ बंद हो जाए लेकिन यह काम करता है।

+0

एक डिवाइस ड्राइवर लिखने या ओएस को हैक करने का संक्षिप्त, मुझे लगता है कि इस तरह की कुछ योजना इसे करने का एकमात्र तरीका है। जब आप विंडोज के तहत निष्पादन योग्य चलाते हैं, तो ओएस इसे खुले लिखने के लिए बंद रखता है। –

3

आप चल रहे समय आमतौर पर एक ऐप को संशोधित नहीं कर सकते हैं। आप को मूल प्रोग्राम को बंद करने और उसे किसी अन्य स्थान से संशोधित करने की आवश्यकता होगी।

2

आप इसे निष्पादित करते समय फ़ाइल को ओवरराइट नहीं कर सकते हैं, लेकिन आप इसका नाम बदल सकते हैं। मेरे अद्यतनकर्ता में, मैं मौजूदा exe को सार्थक (oldname_dateandtime) का नाम बदलता हूं, फिर नई प्रतिलिपि लिखें। फिर हमारे सिस्टम को स्वतः बंद करें और इसे किसी सेवा से पुनरारंभ करें। जब ऐप शुरू होता है, तो यह नया संस्करण चल रहा है।

+0

मैं वही करता हूं, और स्टार्टअप पर पुराने संस्करण साफ़ करता हूं। –

+0

हम पुराने लोगों को चारों तरफ छोड़ देते हैं ताकि हमारे क्षेत्र सेवा इंजीनियरों को किसी समस्या के मामले में वापस लाया जा सके। बेशक, हमारे पास फील्ड सर्विस इंजीनियरों की लक्जरी है :-)। पुराने संस्करणों को अगले अपग्रेड टिक पर साफ़ कर दिया जाएगा। –

0

जब मैंने एक अद्यतनकर्ता बनाया, तो मुझे कार्यक्रम को अलग करना चाहिए। मुख्य कारण वही था जो आप करना चाहते हैं। बस कहें, बी अपडेट लक्ष्य प्लस ए और ए अपडेट बी मैंने एक और तरीका खोजने की कोशिश की लेकिन मैंने जो किया वह अतिरिक्त छोटे और सरल अद्यतनकर्ता को बनाया गया। :(

0

मुझे लगता है कि आप फ़ाइल संस्करणों और updaters के बारे में बात कर रहे हैं। क्या आप autoupdater.So की जरूरत ने कहा के रूप में आप एक सेवा है जो अपने को स्थापित निर्देशिका निगरानी करता है और सर्वर के साथ अपनी डिस्क पर फ़ाइल संस्करण तुलना बनाना होगा।

एक बार बेमेल होता है आप सर्वर से नवीनतम डेटा पूछ सकते हैं। प्रतिस्थापित किया जा करने के लिए जा फ़ाइलें उपयोग में हैं, तो आप अगले रिबूट दौरान विलोपन/अ-पंजीकरण के लिए उन्हें चिह्नित करने के लिए है और आप इन रजिस्ट्री का उपयोग कर का उल्लेख कर सकते हैं।

आप कॉपी कर सकते हैं कैश में सभी फ़ाइलें और बाद में रीबूट के दौरान उन्हें निर्देशिका स्थापित करने के लिए कॉपी करें।

4

इस तरह मैंने हाल ही में किया था। पुराना प्रोग्राम चल रहा है और नया प्रोग्रामिंग चल रहा है का एक संक्षिप्त ओवरलैप है। यह उस चाल का उपयोग करता है जिसे आप वर्तमान निष्पादन योग्य का नाम बदल सकते हैं और पुरानी को बंद करने से पहले नई फ़ाइल को स्थानांतरित कर सकते हैं। यह 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. 
} 
संबंधित मुद्दे