2008-12-12 6 views
6

En un mot: je veux faire la même chose que "Dependency Walker".Comment détecter les DLL requises par une application?

Y at-il une fonction API Win32 qui peut énumérer les dépendances d'un fichier EXE et/ou DLL?

Et existe-t-il un moyen sûr de détecter les dépendances sur les classes ActiveX? (Je doute que ce soit possible, mais qui sait ...)

EDIT: Je suis conscient des outils disponibles qui fournissent la même fonctionnalité de base (Dependency Walker, ProcessExplorer, AQTime, ...) mais je veux pour créer mon propre programme qui télécharge un fichier texte contenant les modules requis.

+0

Vous pourriez envisager de changer le titre de votre question. Si vous voulez savoir comment faire cela via l'API Win32, vous devez l'indiquer dans le titre. Ce n'est pas seulement la séparation des cheveux; d'autres peuvent essayer de trouver la même information plus tard et votre titre peut leur dire que votre question répond à ce problème. –

+0

Même avec cela, vous voulez toujours noter que si vous devez vous assurer que tous les fichiers utilisés sont notés, l'exécution de toutes les fonctionnalités de l'application peut être nécessaire. –

Répondre

3

Il semble que le code source Dependency Walker lui-même ait été fourni par Microsoft via MSJ. S'il vous plaît regardez Re: [DUG]: Dependency Walker.

Vous devez renvoyer un autre site à télécharger car le lien indiqué dans ce courrier ne fonctionne pas.

Veuillez cocher MSJ Source Code Updates: Comme je n'ai pas le temps, je n'ai pas vérifié s'il contient du code source ou seulement des foæes EXE.

+0

Votre premier lien est cassé et votre second point à un exécutable. Les réponses à lien uniquement sont déconseillées sur stackoverflow. –

3

Exécutez l'application, avec Process Explorer déjà en cours d'exécution et définissez de filtrer pour votre nom d'applications .exe.

Il n'existe aucun moyen de détecter toutes les dépendances COM dont dispose un exécutable sans l'exécuter.

6

Les commandes suivantes dumps les dépendances directes de some.exe:

dumpbin /imports some.exe 

Il fonctionne sur DLLs aussi.

Ceci ne listera pas les dépendances telles que les plugins chargés au lancement de l'application (via les appels LoadLibrary). Idem pour les dépendances COM car elles fonctionnent de la même façon (pour autant que je sache).

Si vous avez besoin de connaître toutes les DLL utilisées par un programme en cours d'exécution, utilisez ProcessExplorer.

1

L'utilisateur @blue ... a échappé à Dependency Walker. Lorsque vous utilisez Dependency Walker, après avoir ouvert le fichier, vous pouvez voir les exigences de base qui sont utilisées. Ce n'est qu'en exécutant le programme et en exerçant toutes ses fonctions que vous pouvez trouver toutes les DLL chargées dynamiquement. Parfois, la meilleure chose à faire est de demander au développeur quelles sont les DLL requises. Une application peut charger seulement quelques DLL quand absolument nécessaire. par exemple. Chargement de faultrep.dll, pour le rapport d'erreurs Windows personnalisé, quand il est sur le point de se bloquer.

+0

Pas vrai pour les dll de chargement différé, ils sont dans une section d'importation de l'exe tout comme les DLL normales. Mais je suis d'accord, pour trouver les DLLs chargées dynamiquement, vous devez accrocher LoadLibrary() et exercer les chemins de code requis dans l'exe. –

5

findstr -i .dll exe.exe | plus | findstr -i.dll | plus

rem :)

+0

simple mais délicieux! – Boinst

+1

C'est très cool. –

+1

Un faux complet qui produit des faux positifs et des faux négatifs, à gauche et à droite. Signale les dépendances pour les chaînes, qui contiennent * ". Dll" *, unilatéralement, sans déterminer où cette chaîne est utilisée. Ne permet pas de prendre en compte les DLL chargées lors de l'exécution (par exemple, en appelant 'LoadLibrary', lors de l'instanciation d'un contrôle ActiveX). – IInspectable

0

Vous pouvez écrire une application console pour envelopper cette place, créez un script PowerShell avec ou, comme je finis habituellement faire puisque je ne le faire une fois dans une lune bleue, ajoutez ce qui suit à votre code pour un contrôle rapide:

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); 
      } 
     } 
    } 
Questions connexes