2017-06-13 9 views
6

मैं एक विंडोज 32 बिट प्रोग्राम लिख रहा हूं जो कई संभावित डीएलएस में से एक का उपयोग कर सकता है। तो यह SysUtils.SafeLoadLibrary का उपयोग करके प्रत्येक डीएल को बदले में लोड करने का प्रयास करता है और यदि लोडिंग सफल हो जाती है, तो वह उस डीएल का उपयोग करती है।क्या कोई डीएल लोड करने पर त्रुटि को पकड़ने का कोई तरीका निर्भरता नहीं ढूंढ सकता है?

दुर्भाग्य से इनमें से कुछ डीएलएस अन्य डीएलएस से स्थिर रूप से जुड़े हुए हैं। ये डीएलएस कंप्यूटर से गायब हो सकते हैं। उस मामले में मैं संवाद मुझे बता पाने

[MyProgram]: [myprogram.exe] सिस्टम त्रुटि

कार्यक्रम शुरू नहीं कर सकते, क्योंकि [कुछ dll नाम] अपने कंप्यूटर से गायब है। कार्यक्रम फिर से स्थापित करने से इस समस्या को ठीक करने के लिए प्रयास करें। "

कि संवाद में ठीक बटन दबाने के बाद, कार्यक्रम दिखा बजाय त्रुटि कोड हो जाता है और अन्य DLLs जो तब ठीक काम करता है में से एक कोशिश करता है।

।? उपयोगकर्ता मैं अपने कार्यक्रम चुपचाप इसे अनदेखा करना चाहते हैं कि संवाद

मैं ऐसा कैसे पूरा कर सकते हैं

मामले में महत्वपूर्ण है: यह मेरे कार्यक्रम डेल्फी में लिखा है 2007 Windows संस्करण Windows 8.1 है, लेकिन कार्यक्रम को अन्य विंडोज संस्करणों> = के साथ भी काम करना चाहिए विंडोज एक्स पी।

मैंने SetErrorMode(SEM_FAILCRITICALERRORS) की कोशिश की है लेकिन इससे कोई फर्क नहीं पड़ता।

+0

देखें [यह सवाल] (https://stackoverflow.com/q/44430822/1889329)। – IInspectable

+0

@ अप्रत्याशित धन्यवाद, लेकिन कोई जवाब केवल एक टिप्पणी नहीं है। और अगर मैं सही ढंग से टिप्पणी समझता हूं तो मुझे इसे पूरा करने के लिए डीएलएल को संशोधित करना होगा, जो मैं नहीं कर सकता। – dummzeuch

+0

यह आपके प्रश्न से स्पष्ट नहीं था, चाहे आप लोड करने का प्रयास करने वाले डीएलएल को नियंत्रित करते हैं या नहीं। – IInspectable

उत्तर

2

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

हर बार जब आप SafeLoadLibrary पर कॉल करते हैं तो आप SEM_FAILCRITICALERRORS पास करके समस्या का समाधान कर सकते हैं। या, शायद मौजूदा त्रुटि मोड को पारित करना बेहतर होगा। हालांकि यह प्राप्त करना मुश्किल है। Vista में और बाद में आप GetErrorMode पर कॉल कर सकते हैं। लेकिन पुराने संस्करणों में आप यह करते हैं करने के लिए है:

ErrorMode := SetErrorMode(0); 
SetErrorMode(ErrorMode); 

क्योंकि यह एक ऐसी प्रक्रिया है विस्तृत सेटिंग है, तो आप, SetErrorMode करने के लिए दो कॉल के बीच अवसर की एक खिड़की है मल्टी-थ्रेडेड अनुप्रयोगों बाहर पकड़ा जा करने के लिए।

सचमुच, मेरा मानना ​​है कि आपको स्टार्टअप पर प्रक्रिया के जीवनकाल में SetErrorMode पर कॉल करना चाहिए। इसे ध्यान में रखते हुए, मैं SafeLoadLibrary छोड़ दूंगा।

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

+3

ध्यान दें कि विंडोज 7+ में '(Get | Set) ThreadErrorMode()' है। –

संबंधित मुद्दे