2008-12-12 11 views
6

संक्षेप में: मैं वही काम करना चाहता हूं "निर्भरता वाकर" करता है।मैं किसी एप्लिकेशन द्वारा आवश्यक डीएलएल का पता कैसे लगा सकता हूं?

क्या कोई Win32 API फ़ंक्शन है जो EXE और/या DLL फ़ाइल की निर्भरताओं को समझा सकता है?

और ActiveX कक्षाओं पर निर्भरताओं का पता लगाने के लिए कोई सुरक्षित तरीका है? (मुझे शक है यह संभव है, लेकिन कौन जानता है ...)

संपादित करें: मैं उपकरण उपलब्ध है जो एक ही मुख्य कार्यक्षमता प्रदान करते हैं के बारे में पता कर रहा हूँ (डिपेंडेंसी वाकर, ProcessExplorer, AQTime, ...), लेकिन मैं चाहता हूँ अपना खुद का प्रोग्राम बनाने के लिए जो आवश्यक मॉड्यूल वाली टेक्स्ट फ़ाइल को डंप करता है।

+0

आप अपने प्रश्न का शीर्षक बदलने पर विचार कर सकते हैं। यदि आप जानना चाहते हैं कि Win32 API के माध्यम से इसे कैसे करना है, तो आपको शीर्षक में यह कहना चाहिए। यह सिर्फ बाल-विभाजन नहीं है; अन्य लोग बाद में उसी जानकारी को खोजने का प्रयास कर सकते हैं और आपका शीर्षक उन्हें बता सकता है कि आपका प्रश्न इस मुद्दे को संबोधित करता है। –

+0

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

उत्तर

3

ऐसा लगता है कि निर्भरता वॉकर स्रोत कोड स्वयं माइक्रोसॉफ्ट द्वारा एमएसजे के माध्यम से दिया गया था। कृपया Re: [DUG]: Dependency Walker पर देखें।

आपको किसी अन्य साइट को डाउनलोड करने की आवश्यकता है क्योंकि इस मेल ट्रेल में दिए गए लिंक काम नहीं कर रहे हैं।

की जांच करें MSJ Source Code Updates: जब से मैं समय नहीं है, मैं जांच न की हो, चाहे वह स्रोत कोड या केवल EXE foæes शामिल हैं।

dumpbin /imports some.exe 

यह DLLs पर भी काम करता है:

+0

आपका पहला लिंक टूटा हुआ है और आपका दूसरा एक निष्पादन योग्य बिंदु है। लिंक-केवल उत्तर स्टैक ओवरफ्लो पर निराश होते हैं। –

3

एप्लिकेशन को चलाएं, Process Explorer पहले से चल रहा है और आपके अनुप्रयोगों के लिए फ़िल्टर करने के लिए सेट है। Exe name।

निष्पादन योग्य इसे चलाने के बिना सभी COM निर्भरताओं का पता लगाने का कोई तरीका नहीं है।

6

निम्न कमांड some.exe के प्रत्यक्ष निर्भरता उदासीनता।

यह एप्लिकेशन लॉन्च (लोड लाइब्रेरी कॉल के माध्यम से लोड किए गए प्लगइन जैसे निर्भरताओं की सूची नहीं देगा)। COM निर्भरताओं के लिए वही है क्योंकि वे वैसे ही काम करते हैं (जहां तक ​​मुझे पता है)।

यदि आपको किसी चल रहे प्रोग्राम द्वारा उपयोग किए जाने वाले सभी डीएलएल को जानने की आवश्यकता है, तो ProcessExplorer का उपयोग करें।

1

उपयोगकर्ता @blue ... Dependency Walker पर पहुंचा। फ़ाइल खोलने के बाद निर्भरता वॉकर का उपयोग करते समय आप उपयोग की जाने वाली मूल आवश्यकताओं को देख सकते हैं। केवल प्रोग्राम को निष्पादित करते समय और उसके सभी कार्यों का उपयोग करते समय आप सभी गतिशील रूप से लोड डीएलएल पा सकते हैं।

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

+0

सच फिर से देरी लोड डीएलएस, वे नियमित डीएलएस की तरह exe के एक आयात खंड में हैं। लेकिन मैं सहमत हूं कि गतिशील रूप से लोड किए गए डीएलएस को खोजने के लिए आपको LoadLibrary() को हुक करना होगा और exe में आवश्यक कोड पथ का उपयोग करना होगा। –

1

आपको शायद इसे निष्पादन योग्य रूप से निष्पादन योग्य फ़ाइल संरचना को चलने की आवश्यकता है। इसलिए 'पीई डंप' कार्यक्रम की तरह कुछ यहां उल्लेख किया गया है: http://msdn.microsoft.com/en-gb/magazine/cc301808.aspx एक अच्छा प्रारंभिक बिंदु होगा। आपको आवश्यक वास्तविक कोड यहां पाया जा सकता है: http://www.wheaty.net/downloads.htm

5

findstr -i .dll exe.exe | अधिक | findstr -i।डीएलएल | अधिक

रेम :)

+0

सरल लेकिन स्वादिष्ट! – Boinst

+1

यह बहुत अच्छा है। –

+1

पूरा फर्जी जो झूठी सकारात्मक और झूठी नकारात्मकता उत्पन्न करता है, बाएं और दाएं। स्ट्रिंग्स के लिए निर्भरता की रिपोर्ट करेगा, जिसमें * "। Dll" *, एकतरफा रूप से, निर्धारित किए बिना, उस स्ट्रिंग का उपयोग किया जाता है। रनटाइम पर लोड किए गए डीएलएल के लिए खाते में विफल रहता है (उदा। 'लोड लाइब्रेरी' को कॉल करके, एक ActiveX नियंत्रण को चालू करते समय) होते हैं। – IInspectable

0

आप इस लपेट के लिए एक सांत्वना अनुप्रयोग लिख सकते हैं इसके साथ एक PowerShell स्क्रिप्ट बनाने या, जैसे मैं आम तौर पर कर रही है के बाद से मैं केवल एक नीला चाँद में एक बार यह क्या करना है अंत, त्वरित जांच के लिए अपने कोड में निम्नलिखित जोड़ें:

private static HashSet<string> ReferencedAssemblies = new HashSet<string>(); 

    ... 
    OutputDependencies(Assembly.GetAssembly(typeof(Program)), 0); 
    ... 

    static void OutputDependencies(Assembly assembly, int indent) 
    { 
     if (assembly == null) return; 

     Console.WriteLine(new String(' ', indent * 4) + assembly.FullName); 
     if (!ReferencedAssemblies.Contains(assembly.FullName)) 
     { 
      ReferencedAssemblies.Add(assembly.FullName); 

      foreach (var childAssembly in assembly.GetReferencedAssemblies()) 
      { 
       OutputDependencies(Assembly.Load(childAssembly.FullName), indent + 1); 
      } 
     } 
    } 
संबंधित मुद्दे