तृतीय-पक्ष एप्लिकेशन की एक प्रतिलिपि लॉन्च करना रोकें

कॉपी बर्निंग रोबोट कई सॉफ्टवेयर प्रोग्रामर आवेदन की प्रतियां शुरू करने के निषेध के साथ सामना कर रहे हैं। यह विभिन्न उद्देश्यों के लिए किया जाता है और स्थिति पर निर्भर करता है। इस समस्या को हल करने के लिए एक अलग शब्द है - म्यूटेक्स

इसके अलावा, यह कार्य कभी-कभी सिस्टम प्रशासक के लिए भी होता है, इस अंतर के साथ कि आवेदन तृतीय-पक्ष (किसी अन्य संगठन द्वारा विकसित) है। यह आलेख किसी तृतीय-पक्ष एप्लिकेशन की प्रतियों के लॉन्च को प्रतिबंधित करने की समस्या को हल करने के लिए एक अपेक्षाकृत सरल तरीका बताता है।


कार्य


एक दिन मुझे काम पर एक समस्या थी - कुछ कर्मचारी अनुप्रयोगों की कई प्रतियां चलाने में कामयाब रहे। बेशक, कई प्रतियों को चलाने से विनाशकारी परिणाम नहीं आए, लेकिन कभी-कभी यह विभिन्न "ग्लिच" और अस्थिर प्रोग्राम ऑपरेशन उत्पन्न करता है। स्वाभाविक रूप से, इसने मुझे इन "ग्लिट्स" के बारे में कई शिकायतों में से एक सिरदर्द जोड़ दिया।

सबसे पहले, मैंने कर्मचारियों के साथ आवेदन की प्रतियां लॉन्च करने की समस्या और इससे बचने के तरीके के बारे में एक व्याख्यात्मक बातचीत की। इस उपाय ने अगले कुछ दिनों तक मदद की, और फिर सब कुछ सामान्य हो गया। कुछ कर्मचारियों की इस तरह की मिलीभगत के बारे में अधिकारियों को शिकायत करना मेरी बर्खास्तगी के कारण था, क्योंकि अधिकारियों ने इन श्रमिकों को बहुत महत्व दिया, और मेरा रवैया मौलिक रूप से विपरीत था।

जैसा कि कहा जाता है, "एक बार जब पहाड़ मोहम्मद के पास नहीं जाता है, तो मोहम्मद पहाड़ पर जाता है।" मैंने प्रोग्राम की प्रतियों के लॉन्च को प्रोग्रामेटिक रूप से प्रतिबंधित करने का निर्णय लिया। कार्य तुच्छ नहीं था।

एक साधारण विश्लेषण से मेरी स्थिति की 2 विशेषताएं सामने आईं:
सबसे पहले, मेरा आवेदन तृतीय-पक्ष है, अर्थात्। इसका डेवलपर हमारा संगठन नहीं है और स्रोत कोड तक कोई पहुंच नहीं है (मैं समझाता हूं, एप्लिकेशन Microsoft उत्पादों में से एक है)। एप्लिकेशन में कोई सेटिंग नहीं है जो लॉन्च को नियंत्रित करती है।
दूसरे, आवेदन सीधे शुरू नहीं होता है, लेकिन एक निश्चित विस्तार की फ़ाइलों को खोलने के लिए डिफ़ॉल्ट प्रोग्राम के रूप में। यही है, आवेदन पैरामीटर (डेटा फ़ाइल के पथ को खोलने के लिए) से शुरू होता है।

समाधान सिद्धांत है


इंटरनेट पर एक खोज ने मुझे स्पष्ट समाधान नहीं दिया। सिस्टम सेटिंग्स के रूप में आवेदन की दूसरी प्रति लॉन्च करने पर प्रतिबंध, जैसा कि मैं समझता हूं, यह मौजूद नहीं है (हालांकि एक एपीआई है)। मुझे विभिन्न प्रोग्रामिंग भाषाओं में म्यूटेक्स कार्यान्वयन के दर्जनों उदाहरण भी मिले, लेकिन उनमें से सभी को स्वाभाविक रूप से कोड में बदलाव की आवश्यकता थी और मेरे अनुरूप नहीं था। हमें अपने मूल समाधान की तलाश करनी थी, और अधिमानतः सरल।

एकमात्र उपाय जो मैंने देखा वह था उपयोगकर्ता और एप्लिकेशन के बीच एक "लेयर" बनाना। निम्नलिखित होने चाहिए:

जैसा कि आप जानते हैं, यह दृष्टिकोण काफी सार्वभौमिक है। यह एप्लिकेशन-लेयर न केवल प्रोग्राम की एक प्रति के लॉन्च को प्रतिबंधित करने का कार्य कर सकता है, बल्कि कई अन्य (लॉगिंग, संबंधित कार्यक्रमों का शुभारंभ, अधिसूचना, आदि) भी कर सकता है। उपयोगकर्ता के लिए, एप्लिकेशन-लेयर का संचालन अदृश्य होगा।

समाधान अभ्यास है


नोटपैड एप्लिकेशन के लिए एक व्यावहारिक समाधान दिया गया है (यह स्पष्ट है कि कोई भी एप्लिकेशन इसके स्थान पर हो सकता है)।

एप्लिकेशन-लेयर लिखने के लिए एक प्रोग्रामिंग भाषा का चुनाव करने से मुझे कोई कठिनाई नहीं हुई। मुझे इसे जल्दी और परेशानियों के बिना करने की आवश्यकता थी, इसलिए मैंने ऑटो इट स्वचालन भाषा को चुना। लाइटवेट ऑटोआईटी को शुरू में तीसरे पक्ष के अनुप्रयोगों के साथ काम करने के लिए "ट्यून" किया गया था। आप इसे आधिकारिक साइट से डाउनलोड कर सकते हैं। किट में, भाषा पैकेज के अलावा, एक काफी सुविधाजनक SciTE स्क्रिप्ट एडिटर है, जिसमें AutoIt की स्क्रिप्ट लिखना सुविधाजनक है।
स्वाभाविक रूप से, आप आवश्यक विशेषताओं के साथ किसी अन्य भाषा का उपयोग कर सकते हैं।

स्क्रिप्ट के लिए प्रोग्राम कोड (एक्सटेंशन के साथ एक पाठ फ़ाइल .au3) जटिल नहीं है:

; **     ** ;  Singleton     WinAPI.     ,    Func Singleton($semaphore) Local $ERROR_ALREADY_EXISTS = 183 DllCall("kernel32.dll", "int", "CreateSemaphore", "int", 0, "long", 1, "long", 1, "str", $semaphore) Local $lastError = DllCall("kernel32.dll", "int", "GetLastError") If $lastError[0] = $ERROR_ALREADY_EXISTS Then Exit -1 EndFunc Singleton("Mutex") ;   ShellExecuteWait         ;    ,    Mutex ; $CmdLineRaw -     ShellExecuteWait("C:\WINDOWS\notepad.exe", $CmdLineRaw, @ScriptDir, "open", @SW_MAXIMIZE) 

हेब्रूसर मेयरोविप ने सही रूप से नोट किया कि सेमीफोर " म्यूटेक्स " का नाम कुछ अधिक अद्वितीय के साथ बदलने के लिए बेहतर है।

जैसा कि आप अपने लिए देख सकते हैं, सभी कोड को दो भागों में विभाजित किया जा सकता है: म्यूटेक्स और आवश्यक एप्लिकेशन लॉन्च करना। मैंने अधिक विस्तार से नहीं बताया, क्योंकि यह लेख AutoIt की खोज के बारे में नहीं है।

स्क्रिप्ट लिखकर, इसे या तो SciTE स्क्रिप्ट एडिटर में या फ़ाइल संदर्भ मेनू के माध्यम से संकलित किया जा सकता है (स्क्रिप्ट फ़ाइल पर राइट-क्लिक करें)। जिसके बाद इसका इस्तेमाल पहले ही किया जा सकता है। इसे Aut2Exe उपयोगिता का उपयोग करके अतिरिक्त सेटिंग्स (सिस्टम बिट और एप्लिकेशन आइकन) के साथ भी संकलित किया जा सकता है, जो ऑटिइट के साथ भी आता है।

इसके अलावा, सब कुछ प्राथमिक है - हम परिणामी इंटरलेयर एप्लिकेशन को कुछ निर्देशिका में डालते हैं और इस इंटरलेयर एप्लिकेशन का उपयोग करके डेटा फ़ाइलों (.txt एक्सटेंशन वाली फ़ाइलों के लिए उदाहरण में) के लिए डिफ़ॉल्ट उद्घाटन को कॉन्फ़िगर करते हैं।

वह सब है। हम हल किए गए कार्य की जांच और आनंद लेते हैं - अब कोई भी नोटपैड की दो प्रतियां लॉन्च नहीं कर सकता है।

अंतभाषण


इस पद्धति ने मुझे दोहरे लॉन्चिंग अनुप्रयोगों की समस्या को हल करने की अनुमति दी। हालांकि, आवेदन की स्थापना के अगले दिन, परत ने मुझे लापरवाह कर्मचारियों को "यह शुरू नहीं होता है" शब्दों के साथ दौड़ाया। मुझे इस विषय पर कर्मचारियों के साथ एक व्याख्यात्मक बातचीत करनी थी "आवेदन शुरू नहीं होता है क्योंकि यह पहले ही लॉन्च हो चुका है।" यह वार्तालाप अधिक प्रभावी निकला, क्योंकि कर्मचारियों के पास कोई विशेष विकल्प नहीं था। लगभग एक महीने से, ये समस्याएं पैदा नहीं हुई हैं।

यदि पाठकों में से एक को इस कार्य के लिए एक .bat फ़ाइल के रूप में म्यूटेक्स लिखने का तरीका पता है, तो अपना अनुभव साझा करें। मुझे संदेह है कि ऐसा कोई रास्ता है।

Source: https://habr.com/ru/post/In212413/


All Articles