inno setup - इनो सेटअप(कोई भी नुकसान) के अनसी से यूनिकोड संस्करण में अपग्रेड करना




inno-setup (2)

कोई वास्तविक नुकसान नहीं हैं। इसके ज्यादातर फायदे हैं। स्पष्ट रूप से यह तथ्य कि यूनिकोड संस्करण केवल विरासत अनसी चरित्र सेट तक सीमित नहीं है। विवरण के लिए नीचे देखें।

यदि आप नई इनो सेटअप परियोजना शुरू कर रहे हैं, तो हमेशा यूनिकोड संस्करण का उपयोग करें। नई परियोजनाओं के लिए एएनआई संस्करण का उपयोग करने का कोई कारण नहीं है। वास्तव में अब नवीनतम इनो सेटअप 6 के लिए कोई एएनएसआई संस्करण नहीं है।

क्यों, इनो सेटअप का एएनएसआई संस्करण अभी भी लंबे समय के लिए उपलब्ध था, यह था कि एसीसी और यूनिकोड संस्करणों के पास्कल स्क्रिप्ट कोड 100% संगत नहीं हैं। अधिकतर वे हैं, लेकिन मतभेद हैं।

इसलिए यदि आपकी मौजूदा इंस्टॉलर स्क्रिप्ट में कोई भी पास्कल स्क्रिप्ट कोड नहीं है (आपके .iss में कोई [Code] अनुभाग नहीं है), तो आप सीधे यूनिकोड संस्करण पर जा सकते हैं (और चाहिए)।

यदि आपके पास कुछ पास्कल स्क्रिप्ट कोड हैं, तो आपको अधिक सावधान रहना चाहिए। विवरण के लिए नीचे देखें।

आप यूनिकोड संस्करण का उपयोग क्यों करना चाहते हैं

एएनएसआई संस्करण के साथ समस्याओं के उदाहरण के लिए, यदि आप अंग्रेजी प्रणाली पर इनो सेटअप के एएनएसआई संस्करण के साथ निर्मित जापानी-केवल इंस्टॉलर चलाते हैं, तो आपको मिलेगा:

यह भी देखें कि इनो सेटअप इंस्टॉलर में गलत टेक्स्ट एन्कोडिंग है ।

उसी कारण से, एएनएसआई संस्करण पात्रों वाले नामों के साथ फाइल बनाने में सक्षम नहीं होगा, जो कि लक्ष्य मशीन की विरासत एएनएसआई चरित्र सेट में मौजूद नहीं हैं।

यूनिकोड संस्करण में ये समस्याएँ नहीं हैं, जैसा कि jrsoftware.org/ishelp/index.php?topic=unicode में दर्ज़ किया गया है:

यूनिकोड इनो सेटअप की मुख्य विशेषताएं सिस्टम कोड पृष्ठ की परवाह किए बिना किसी भी सिस्टम पर किसी भी भाषा को प्रदर्शित करने की इसकी क्षमता है, और यूनिकोड फाइलनाम के साथ काम करने की इसकी क्षमता है। एक यूनिकोड इनो सेटअप को नए मानक इनो सेटअप और नॉन यूनिकोड इनो सेटअप के रूप में विचार कर सकते हैं, जो कि बहुत छोटे आकार के संभावित लोगों के लिए एक पुराने विशेष इनो सेटअप के रूप में है।

इनो सेटअप 6 के लिए भी, कोई एएनएसआई संस्करण नहीं है, इसलिए यदि आप इनो सेटअप के नवीनतम संस्करण को अपनी सभी नई सुविधाओं के साथ उपयोग करना चाहते हैं, तो आपको यूनिकोड संस्करण के साथ स्विच करना होगा।

इसके अतिरिक्त यूनिकोड संस्करण पास्कल स्क्रिप्ट में कुछ छोटे सुधार हैं। उन्हें jrsoftware.org/ishelp/index.php?topic=unicode में प्रलेखित किया गया है। उसके शीर्ष पर, कुछ अनियोजित सुधार हैं:

  • Inc / Dec फ़ंक्शन / कथन। देखें समारोह इनो सेटअप ।
  • बेहतर Variant समर्थन। उदाहरण के लिए, इनो सेटअप देखें : प्रकार के सरणी के माध्यम से Iterate (OleObject से) या इनो सेटअप में सिस्टम की जानकारी को पढ़ने का एक तरीका है ।
  • बेहतर उच्च-डीपीआई (और सामान्य रूप से गैर-मानक स्क्रीन) समर्थन। उदाहरण के लिए, देखें इनो सेटअप टास्कबार आइकन धुंधला हो गया है या इनो सेटअप इंस्टॉलर ने XP पर विंडो को स्क्विट किया है?
  • case स्टेटमेंट में रंग: "कोलन (':') अपेक्षित" इनो सेटअप पास्कल स्क्रिप्ट में केस स्टेटमेंट में वर्ण सीमा पर संकलक त्रुटि ।
  • एक स्थिर सेट के साथ ऑपरेटर in : ऐसा लगता है कि एएनएसआई संस्करण में, आपको हमेशा "टाइप बेमेल" त्रुटि मिलती है, जब तक कि आप set को पहले चर के set में संग्रहीत नहीं करते हैं।
    ध्यान दें, जबकि यूनिकोड संस्करण ऑपरेटर के साथ एक स्थिर सेट का समर्थन करता है, यह सेट अभिव्यक्ति में पर्वतमाला का समर्थन नहीं करता है, इसलिए X in [1, 2, 3] संभव है, लेकिन X in [1..3] है संभव नहीं है, आपको "क्लोजिंग स्क्वायर ब्रैकेट (']') अपेक्षित होगा।"
  • TLabel में यूनिकोड संस्करण में पारदर्शी पृष्ठभूमि है। इनो सेटअप देखें - पृष्ठ नाम और विवरण लेबल में पाठ के तहत पारदर्शिता
  • कुछ कस्टम विज़ार्ड पृष्ठों के मानक ईवेंट हैंडलर को एनी संस्करण में संभव नहीं है, जबकि यूनिकोड संस्करण में काम ठीक है। जब TInputDirWizardPage पर फ़ोल्डर को ब्राउज किया जाता है, तो उत्पन्न की गई इनो सेटअप घटना जैसी चीजों के लिए क्या उपयोगी हो सकता है ?

पास्कल स्क्रिप्ट कोड में संभावित समस्याएं

कुछ क्षेत्र हैं, जहां पास्कल स्क्रिप्ट कोड में समस्याएं उभर सकती हैं:

  • DLL फ़ंक्शन के लिए कोई भी कॉल जो स्ट्रिंग पैरामीटर लेती है - string और PChar प्रकार। AnsiString ठीक होना चाहिए, क्योंकि यह यूनिकोड संस्करण में समान है।

    यूनिकोड संस्करण में, PChar का नाम बदलकर PChar कर दिया गया।

    यदि आप किसी भी विंडोज एपीआई फ़ंक्शन का उपयोग करते हैं, जो स्ट्रिंग्स का उपयोग करता है, तो आपको इसके वाइड संस्करण पर स्विच करना चाहिए। उदाहरण के लिए GetFileAttributesW के बजाय GetFileAttributesW उपयोग करें। कोई PWideChar प्रकार नहीं है। इसलिए यदि आपके घोषणा में PChar संस्करण में PChar प्रकार का उपयोग किया गया है, और आप फ़ंक्शन के वाइड संस्करण पर स्विच करते हैं, तो आपको इसके बजाय string प्रकार का उपयोग करना होगा। इनो सेटअप स्वचालित रूप से LPCTSTR (या समान), उर्फ LPCTSTR इसे मार्शल करेगा।

    नीचे दी गई घोषणा एएनएसआई संस्करण में सही है, लेकिन यूनिकोड संस्करण में गलत है, क्योंकि PAnsiChar , लेकिन यूनिकोड संस्करण में PWideChar को string मार्शल।

    function GetFileAttributes(lpFileName: string): DWORD;
      external '[email protected] stdcall';

    पूर्ण उदाहरण और समाधान के लिए, मौजूदा फ़ाइल खोजने में असमर्थ Inno Setup FileExists देखें।

    दुर्लभ मामलों में, आप एक फ़ंक्शन को कॉल कर रहे हैं जिसमें एक आउट PWideChar पैरामीटर ( var S: PWideChar ) है, यह वास्तविक PWideChar प्रकार के बिना, इसका उपयोग करने के लिए बहुत मुश्किल है, क्योंकि इस मामले में आप string PWideChar उपयोग नहीं कर सकते हैं। लेकिन यह उल्लेखनीय है, AppData \ LocalLow के लिए लगातार देखें

    विंडोज एपीआई के समान, कुछ तृतीय पक्ष पुस्तकालय भी अपने एपीआई में यूनिकोड तार के साथ एक अलग यूनिकोड संस्करण प्रदान करते हैं। उदाहरण के लिए ISSkin में ISSkinU.dll । नवीनतम इनो सेटअप 5.5.9 यूनिकोड के साथ काम करने के लिए ISSkin प्राप्त करना देखें।

  • कोई भी कोड जो string प्रकार को बाइट सरणी के रूप में उपयोग करता है (जैसा कि यूनिकोड संस्करण में, string चौड़ी है (2-बाइट) सरणी)। यह ज्यादातर चिंता की बात है, केवल अगर आपका कोड TStream वर्ग विधियों का उपयोग करता है जैसे:

    function Read(Buffer: String; Count: Longint): Longint;
    function Write(Buffer: String; Count: Longint): Longint;
    procedure ReadBuffer(Buffer: String; Count: Longint);
    procedure WriteBuffer(Buffer: String; Count: Longint);

    इन विधियों को वास्तव में AnsiString साथ फिर से घोषित किया जाना चाहिए था। मेरे लिए एक बग की तरह लग रहा है।

    यूनिकोड संस्करण में इन विधियों को प्रयोग करने योग्य बनाने के लिए, BufferToAnsi द्वारा बफ़रटोआन्सी फ़ंक्शन का उपयोग करें जो कई मौजूदा उत्तरों में उपयोग किया जाता है, जैसे:

    • जब कोई अन्य प्रक्रिया में फ़ाइल खुली होती है तो Inno सेटअप LoadStringFromFile विफल हो जाता है
    • इनो सेटअप के साथ वांछित स्थिति में फ़ाइल से बाइट्स पढ़ें
    • अन्य दृष्टिकोण के लिए, इनो सेटअप में राइटिंग बाइनरी फ़ाइल देखें
  • यूनिकोड संस्करण set of char चर के set of char अनुमति नहीं देता है (जैसा कि बहु-बाइट प्रकारों के लिए set की अनुमति नहीं है)। हालांकि दिलचस्प रूप से यह अभिव्यक्ति में set of char स्थिरांक के set of char समर्थन करता है। इनो सेटअप यूनिकोड संस्करण के पास्कल स्क्रिप्ट में "char के सेट" पर "टाइप बेमेल" त्रुटि देखें।

  • FloatToStr , Ansi संस्करण में स्थानीय विशिष्ट दशमलव विभाजक का उपयोग करता है, जबकि यूनिकोड संस्करण में हमेशा एक डॉट।

  • यूनिकोड संस्करण अर्धविराम के उपयोग के बारे में अधिक सख्त है। एएनएसआई संस्करण कुछ लापता अर्धविरामों को सहन करता है, इसलिए यह उस कोड को भी संकलित कर सकता है जो इस संबंध में 100% वाक्यात्मक रूप से सही नहीं है।

यदि आपका कोड उपरोक्त में से किसी का उपयोग नहीं करता है, और आपके पास अपने अर्धविराम अधिकार हैं, तो आपको यूनीकोड ​​संस्करण के साथ कोई समस्या नहीं होनी चाहिए।

क्या एएनएसआई संस्करण की तुलना में इनो सेटअप यूनिकोड संस्करण का कोई नुकसान है?

या क्या कारण है कि अभी भी दोनों संस्करणों को समानांतर में पेश किया गया है और न केवल यूनिकोड एक बचा है?

क्या एनी संस्करण के साथ विकसित मेरी मौजूदा इनो सेटअप परियोजना के लिए यूनिकोड संस्करण का उपयोग करते समय कोई संभावित समस्याएं हैं?


यहां स्पष्ट जवाब के बाद कि एएनएसआई इनो सेटअप संस्करण के साथ रहने का कोई वास्तविक कारण नहीं है, हमने कल अपने उत्पाद के बीटा सेटअप को यूनिकोड संस्करण में बदल दिया और हमारे स्वयं के परीक्षणों में कोई समस्या नहीं देखी।

लेकिन हमारे बीटा टेस्टर में से एक ने आज बताया कि निम्नलिखित संस्करण के साथ फ़ायरवॉल अपवाद बनाते समय यह संस्करण क्रैश हो जाता है:

try
  FirewallObject := CreateOleObject('HNetCfg.FwAuthorizedApplication');
  FirewallObject.ProcessImageFileName := 'C:\Program Files (x86)\FS-FlightControl\FS-FlightControl.exe';
  FirewallObject.Name := 'FS-FlightControl';
  FirewallObject.Scope := NET_FW_SCOPE_ALL;
  FirewallObject.IpVersion := NET_FW_IP_VERSION_ANY;
  FirewallObject.Enabled := True;
  FirewallManager := CreateOleObject('HNetCfg.FwMgr');
  FirewallProfile := FirewallManager.LocalPolicy.CurrentProfile;
  FirewallProfile.AuthorizedApplications.Add(FirewallObject);
except
  Log('Error setting firewall exception: ' + GetExceptionMessage);
end;

यदि इस कोड को सेटअप क्रैश के साथ निष्पादित किया जाता है

Exception code: 0xc0000005
Error offset: 0x0005584c

Windows ईवेंट लॉग में। मैंने बीटा टेस्टर को "/ लॉग" पैरामीटर के साथ सेटअप चलाने के लिए कहा और वहां कोई त्रुटि नहीं दिखाई गई। बस पूरा सेटअप क्रैश हो जाता है।

यह सुनिश्चित करने के लिए कि यह समस्या के कारण एनीसी से यूनिकोड में परिवर्तन था, हम बीटा परीक्षक को एक और समान निर्माण भेजते हैं, बस एएनएसआई संस्करण के साथ संकलित किया गया है और वहां कोई दुर्घटना नहीं हुई है।

तो यूनिकोड संस्करण के कुछ और (नकारात्मक) दुष्प्रभाव प्रतीत होते हैं।

हम स्वयं इस समस्या का पुनरुत्पादन नहीं कर सकते, इस सेटअप का उपयोग करने वाले हमारे बीटा परीक्षकों में से केवल एक: https://www.fs-flightcontrol.com/download/FS-FlightControl-Beta-InnoUnicode.exe बस फ़ायरवॉल अपवाद की जाँच करें और इसे रखना चाहिए सेटअप प्रक्रिया के अंत के पास कहीं दुर्घटना।

सेटअप लॉग फ़ाइल के आधार पर परीक्षक ने भेजा कि उसके पास विंडोज़ संस्करण 10.0.14393 है। जैसा कि मैंने लिखा था कि लॉग में इस समस्या का कोई निशान नहीं पाया जा सकता है, यह बस दुर्घटनाग्रस्त हो जाता है।