2009-08-27 15 views
7

Estoy hablando de win32 dlls, esos archivos pe simple. Estoy confundido después de hacer una prueba en comparación con lo que vi en el proceso explorer.exe.Podríamos tener 2 archivos DLL con el mismo nombre que se está cargando en un proceso

  1. me escribió una prueba con los siguientes módulos: (C++)
    enlaces DLLLoader.exe a A.dll en la misma carpeta.
    B.dll enlaces a A.dll (2) en otra carpeta. (A.dll (2) es una DLL totalmente diferente de A.dll, pero con el mismo nombre)
    DLLLoader.exe cargará B.dll explícitamente a través de :: LoadLibrary.
    Ahora empiezo DllLoader.exe, en primer lugar, se cargará A.dll, pero cuando intenta cargar B.dll, simplemente falló: sospecho que es porque B.dll piensa que A.dll ya está cargado en proceso pero, de hecho, el que se carga no es el que B.dll quería, la tabla de importación/exportación no puede coincidir, por lo que no se pudo cargar B.dll.
    Esto parece decirnos que no podemos cargar 2 dlls del mismo nombre en el mismo proceso, incluso si tienen una ruta diferente.

  2. Pero cuando utilicé explorador de proceso para supervisar los módulos cargados en el proceso explorer.exe de Ventanas, pude ver después de 2 DLL que se carga, con el mismo nombre:
    comctl32.dll experiencia del usuario Controles Biblioteca C: \ WINDOWS \ WinSxS ... \ comctl32.dll
    comctl32.dll Common Controls Biblioteca C: \ WINDOWS \ system32 \ comctl32.dll

Podría alguno de ustedes arrojar algunas luces sobre esto?

Respuesta

6

Básicamente deja de funcionar si carga el dll con su ruta completa o solo por nombre de archivo. Los LoadLibraryEx documentos cubren esta bastante bien:

Si lpFileName no incluye un camino y hay más de una carga módulo con el mismo nombre base y extensión, la función devuelve un identificador al módulo que fue cargado primero.

+0

Para implicar la carga (en función de la dependencia de DLL), solo podríamos tener 1 dll cargado con el mismo nombre. –

Cuestiones relacionadas