2008-12-12 9 views
6

En pocas palabras: quiero hacer lo mismo "Dependency Walker".¿Cómo puedo detectar las DLL requeridas por una aplicación?

¿Hay alguna función de la API de Win32 que pueda enumerar las dependencias de un archivo EXE y/o DLL?

¿Y existe alguna manera segura de detectar dependencias en clases ActiveX? (Dudo que es posible, pero quién sabe ...)

EDIT: Soy consciente de las herramientas disponibles que proporcionan la misma funcionalidad básica (Dependency Walker, ProcessExplorer, AQTime, ...) pero quiero para crear mi propio programa que vierte un archivo de texto que contiene los módulos requeridos.

+0

Puede considerar cambiar el título de su pregunta. Si desea saber cómo hacerlo a través de la API de Win32, debe indicarlo en el título. Esto no es solo una división de cabello; otros pueden tratar de encontrar la misma información más adelante y su título puede indicarles que su pregunta aborda este tema. –

+0

Incluso con eso, aún desea tener en cuenta que si necesita asegurarse de que se anoten todos los archivos utilizados, es posible que se requiera la ejecución de todas las funciones de la aplicación. –

Respuesta

3

Parece que el código fuente de Dependency Walker fue proporcionado por Microsoft a través de MSJ. Por favor mira Re: [DUG]: Dependency Walker.

Debe consultar otro sitio para descargar dado que el enlace proporcionado en este seguimiento de correo no funciona.

favor verifique MSJ Source Code Updates: Ya que no tengo tiempo, no he comprobado si contiene el código fuente o sólo foæes EXE.

+0

Tu primer enlace está roto y tu segundo apunta solo a un ejecutable. Las respuestas de solo enlace se desaconsejan en stackoverflow. –

3

Ejecuta la aplicación, con Process Explorer ya en ejecución y configurado para filtrar el nombre .exe de las aplicaciones.

No hay forma de detectar todas las dependencias COM que tiene un ejecutable sin ejecutarlo.

6

Los siguientes comandos vuelca las dependencias directas de some.exe:

dumpbin /imports some.exe 

Funciona en DLL también.

Esto no mostrará las dependencias como los complementos cargados en el inicio de la aplicación (a través de las llamadas LoadLibrary). Lo mismo para las dependencias COM ya que funcionan de la misma manera (hasta donde yo sé).

Si necesita conocer todas las DLL utilizadas por un programa en ejecución, use ProcessExplorer.

1

Usuario @blue ... eluido a Dependency Walker. Al usar Dependency Walker, después de abrir el archivo puede ver los requisitos básicos que se utilizan. Solo cuando ejecuta el programa y ejerce todas sus funciones puede encontrar todos los archivos DLL cargados dinámicamente.

A veces, lo mejor que puede hacer si puede es preguntarle al desarrollador qué archivos DLL son necesarios. Una aplicación solo puede cargar algunos archivos DLL cuando sea absolutamente necesario. p.ej. Cargando faultrep.dll, para informes de errores de Windows personalizados, cuando esté a punto de bloquearse.

+0

No es cierto Re retrasa carga dlls, están en una sección de importación del exe al igual que dlls regulares. Pero estoy de acuerdo, para encontrar los dlls cargados dinámicamente, tendrías que enlazar LoadLibrary() y ejercitar las rutas de código requeridas en el exe. –

5

findstr -i .dll exe.exe | más | findstr -i.dll | más

rem :)

+0

¡simple pero delicioso! – Boinst

+1

Eso es genial. –

+1

Completo falso que produce falsos positivos y falsos negativos, izquierda y derecha. Informará las dependencias de cadenas, que por casualidad contienen * ". Dll" *, unilateralmente, sin determinar, dónde se utiliza esa cadena. No cuenta las DLL que se cargan en el tiempo de ejecución (por ejemplo, al invocar 'LoadLibrary' al momento de crear una instancia de un control ActiveX). – IInspectable

0

Usted puede escribir una aplicación de consola para terminar con esto, crear un script de PowerShell con ella o, al igual que por lo general terminan haciendo ya que sólo tengo que hacerlo una vez en una luna azul, agregue lo siguiente a su código para una verificación rápida:

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); 
      } 
     } 
    } 
Cuestiones relacionadas