2008-10-06 10 views
27

मैंने WinXP के तहत एक .dll बनाया है जो दावा करता है कि इसे लोड होने पर DWMAPI.DLL नहीं मिल सकता है। समस्या यह है कि यह डीएलएल एक विस्टा डीएलएल है, और यह आईपी 7 स्थापित करने वाले XP उपयोगकर्ताओं के लिए एक ज्ञात मुद्दा है। आईई 7 अनइंस्टॉल करने या प्रोग्राम्स जोड़ें/निकालें के माध्यम से .NET Framework की मरम्मत करने की सिफारिश है। मैंने मरम्मत की, और कुछ भी नहीं बदला। मैं आईई 7 को अनइंस्टॉल करने वाला नहीं हूं क्योंकि एक बेहतर समाधान होना चाहिए जो "विंडोज़ को पुनर्स्थापित करें" के बराबर नहीं है।WinXP के तहत DWMAPI.DLL देरी-लोड निर्भरता को कैसे ठीक करें?

मैंने आईई 7 की स्थापना रद्द करने का प्रयास करने वाले लोगों के बारे में बुरी चीजें पढ़ी हैं, इसलिए मैं उस मार्ग पर जाने के लिए अनिच्छुक हूं।

मैं विजुअल स्टूडियो 2003 (7.1) के तहत सी ++ का उपयोग कर रहा हूं। मुझे एक विकल्प नहीं दिख रहा है जहां मुझे एप्लिकेशन लॉन्च पर देरी हो रही है। जब मैंने डीएलएल प्रोजेक्ट बनाया था तो मैंने अभी डिफ़ॉल्ट सेटिंग्स का उपयोग किया था। मुझे अभी एक दिलचस्प विकल्प मिला है, लिंकर-> इनपुट-> देरी लोड डीएलएल, इसलिए मैंने डीडब्ल्यूएमएपीआई.डीएलएल को देरी से लोड करने के लिए मजबूर किया। हालांकि, मुझे यह लिंक मिलता है:

LINK : warning LNK4199: /DELAYLOAD:dwmapi.dll ignored; no imports found from dwmapi.dll 

.. और यह निश्चित रूप से मेरी DLL लोड करने का प्रयास करते समय कोई चीज़ नहीं बदली। इसके बिल्ली के लिए, मैंने डीएलएल के पूरे पेड़ को जोड़ा जो डीडब्ल्यूएमएपीआई.डीएलएल की ओर जाता है, और मुझे वही संदेश मिलता है। (रिकॉर्ड के लिए, यह foundation.dll-> shell32.dll-> shdocvw.dll-> mshtml.dll-> ieframe.dll-> dwmapi.dll है।)

के बारे में मैं क्या कर रहा हूँ और अधिक विशिष्ट होना करने के लिए , मैं एक माया प्लगइन लिख रहा हूँ और स्क्रिप्ट संपादक में हमेशा-उपयोगी पाठ मिलता है:

// Error: Unable to dynamically load : D:/blahblahblah/mydll.mll 
The specified module could not be found. 
// 
// Error: The operation completed successfully. 
// 
// Error: The operation completed successfully. 
(mydll) // 

मैं निर्भरता वाकर इस्तेमाल किया शुरू में समस्या पर नज़र रखने के लिए, और कहा कि क्या मुझे नेतृत्व DWMAPI.DLL है। ये संदेश निर्भर करता है मुझे देता हैं, और DWMAPI.DLL केवल एक चीज एक पीले रंग की प्रश्न चिह्न इसके बगल में है कि:

Warning: At least one delay-load dependency module was not found. 
Warning: At least one module has an unresolved import due to a missing export function in a delay-load dependent module. 

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

देखने के रूप में इस समस्या को सब के बाद DWMAPI.DLL से संबंधित नहीं था, लेकिन DWMAPI एक आम समस्या है, मैं सबसे अच्छा लिंक मैं नोवेल वेबसाइट here पर DWMAPI मुद्दे के बारे में पाया पोस्ट करेंगे। असल में, अधिकांश कार्यक्रमों में depend.exe में यह चेतावनी होगी, लेकिन यदि इसके बगल में देरी-लोड आइकन है, और आप सुनिश्चित हैं कि प्रोग्राम सीधे या अप्रत्यक्ष रूप से DWMAPI को कॉल नहीं करेगा, तो यह ठीक है। समस्या कहीं और है। यदि देरी-लोड आइकन मौजूद नहीं है, तो आपको विजुअल स्टूडियो में/DELAY और/DELAYLOAD विकल्प देखना होगा। तथ्य यह है कि मुझे एक "चेतावनी" दिया गया है और एक "त्रुटि" इस तथ्य का संकेत नहीं था कि DWMAPI स्वचालित रूप से लोड नहीं हो रहा है।

+1

मैंने इस समस्या को हमारे विंडोज 2003 सर्वरों में से एक पर मारा। यह सिर्फ एक खूनी कंसोल ऐप है और फिर भी यह (या कुछ अन्य निर्भरता) dwmapi.dll को भी दावा करने का दावा करता है। मुझे इसका एक निश्चित जवाब देखना अच्छा लगेगा। +1। – Kev

+0

मुझे लगता है कि Google ड्राइव-बाय से बहुत सारे विचार हैं। बस "dwmapi.dll" पर खोज करना यह दूसरा परिणाम है। –

उत्तर

7

आपकी अद्यतन समस्या के आधार पर, DWMAPI.dll शायद आपकी समस्या नहीं है। जब भी आप mshtml से लिंक कर रहे हों तो निर्भरता वॉकर हमेशा आपको वह त्रुटि देगा क्योंकि यह हमेशा देरी लोड डीएलएल की जांच करता है।

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

सी/सी ++ में अपनी सेटिंग बदलने की कोशिश करें -> कोड जनरेशन-> रनटाइम लाइब्रेरी बहु-थ्रेडेड डीएलएल के बजाय बहु-थ्रेडेड में।

इसके अलावा आप माया के समान खोज पथ का उपयोग करने के लिए निर्भरता वॉकर के साथ झुकाव करने का प्रयास कर सकते हैं और देख सकते हैं कि आप किसी अन्य निर्भरता समस्या के साथ आ सकते हैं या नहीं।

अंतिम उपाय के रूप में आप माया को डीबगर में लॉन्च कर सकते हैं और लोड लाइब्रेरी पर ब्रेकपॉइंट सेट कर सकते हैं और पता लगा सकते हैं कि कौन सी लाइब्रेरी लोड नहीं की जा रही है।

+0

धागे पर एक necromancer नहीं होने के कारण, इस समस्या को सिर्फ डीबग किया है, मैं बस कुछ जोड़ना चाहता था। यदि आपको लगता है कि आपका डीएल स्थिर रूप से जुड़ा हुआ है, (जैसा कि गेराल्ड सुझाव देता है) और आपको अभी भी यह समस्या विजुअल स्टूडियो के साथ अपना डीएल लोड कर रही है और इसके मैनिफेस्ट को जांचें। अगर परियोजना किसी और द्वारा बनाई गई थी, तो उनमें एक .manifest फ़ाइल शामिल हो सकती है जो बाइनरी में एम्बेड करता है इसकी निर्भरता क्या होती है, और ओएस दावा करेगा कि यह कोई समस्या नहीं है जब यह इन्हें नहीं मिल पाती है, भले ही डीएलएल स्थिर रूप से जुड़ा हुआ हो । यदि आपको .manifest मिलता है, तो इन्हें टिप्पणी करें और पुनः संकलित करें, यह समस्या को ठीक कर सकता है। – Decker

3

यह एक मुश्किल है। वास्तव में 2 मुख्य तरीकों से आपको यह त्रुटि मिल जाएगी।

1) आपके पास प्रोजेक्ट लॉन्च पर लोड होने के लिए देरी से लोड डीएलएल को मजबूर करने के लिए आपके प्रोजेक्ट सेट हैं। DWMAPI.dll एक देरी से लोड डीएलएल है और इस प्रकार सामान्य रूप से तब तक लोड नहीं किया जाएगा जब तक कि इसके किसी भी कार्य को नहीं कहा जाता है। यह तब तक नहीं होगा जब तक आप इसे अपने डीएलएल में करने की कोशिश नहीं कर रहे हों। लेकिन किसी भी तरह से देरी लोड डीएलएल लोड करने के लिए अपने ऐप को मजबूर करने के लिए एक कंपाइलर विकल्प सेट करना संभव है। यदि आप ऐसा कर रहे हैं, तो मत करो।

2) यह अक्सर एक झूठी त्रुटि होती है जब आप एक और समस्या होने पर depend.exe से प्राप्त करेंगे। निर्भरता वॉकर के माध्यम से अपना डीएलएल चलाएं और देखें कि क्या कोई अन्य निर्भरता समस्याएं हैं। यदि सब कुछ विफल हो जाता है, तो IE7 को अनइंस्टॉल करने का प्रयास करें और देखें कि समस्या बनी रहती है या नहीं। यदि यह एक गलत त्रुटि है, तो आप IE7 स्थापित करने के बाद आपको वास्तविक त्रुटि दिखाई देगी। आप फिर से आईई 7 स्थापित कर सकते हैं।

3

मैं बिल्कुल इस समस्या थी।

ख़ुशामदी समस्या यह है कि हल करने के लिए घंटे लगे।

वैसे भी। मैंने रिलीज मशीन पर अपने प्रबंधित सी ++ एप्लिकेशन को संकलित किया। उन ग्राहकों से शिकायतें मिलीं जो इसे नहीं चला सका, हमारी सभी मशीनों पर एक आकर्षण की तरह काम किया।

यह पता चला कि रिहाई मशीन स्वचालित रूप से ATL भेद्यता ठीक साथ एक रात समझौता किया गया था एक महीने पहले, और इसलिए अन्य सभी मशीनों को भी थी, एक XP मशीन को छोड़कर।

particulare XP मशीन या तो आवेदन नहीं चला सकते हैं। एटीएल फिक्स स्थापित करें (नीचे लिंक देखें), और voilá, हर चीज पहले की तरह काम किया।

http://www.microsoft.com/downloads/details.aspx?familyid=766A6AF7-EC73-40FF-B072-9112BAB119C2&displaylang=en

तो सबक सीखा है, हमेशा (डिबग में पाया या जारी निर्देशिका) अपने मध्यवर्ती प्रकट होता है की जाँच करें, जो आपको बताएगा DLL कि इस कार्यक्रम के खिलाफ जोड़ा गया है का कौन सा संस्करण।

आशा है कि यह किसी को भी मदद करता है।

2

सी में आपकी सेटिंग में बदलाव की कोशिश करो/C++ -> कोड पीढ़ी> मल्टी-थ्रेडेड बजाय मल्टी-थ्रेडेड DLL को रनटाइम लाइब्रेरी।

+0

यह मेरे लिए काम किया - धन्यवाद –

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

  • कोई संबंधित समस्या नहीं^_^