windows - puede - se cargo el modulo pero no se encontro el punto de entrada dllregisterserver
¿Cómo puedo probar un archivo DLL de Windows para determinar si es de 32 o 64 bits? (5)
Detalles sangrientos
Una DLL utiliza el formato de archivo ejecutable de PE, y no es demasiado difícil leer esa información del archivo.
Consulte este artículo de MSDN en el Formato de archivo PE para obtener una descripción general. IMAGE_NT_HEADERS leer el encabezado de MS-DOS y luego leer la estructura IMAGE_NT_HEADERS . Este contiene la estructura IMAGE_FILE_HEADER que contiene la información que necesita en el miembro de la Máquina que contiene uno de los siguientes valores
- IMAGE_FILE_MACHINE_I386 (0x014c)
- IMAGE_FILE_MACHINE_IA64 (0x0200)
- IMAGE_FILE_MACHINE_AMD64 (0x8664)
Esta información debe estar en un desplazamiento fijo en el archivo, pero aún así recomiendo atravesar el archivo y verificar la firma del encabezado de MS-DOS y los IMAGE_NT_HEADERS para asegurarse de hacer frente a cualquier cambio futuro.
Use ImageHelp para leer los encabezados ...
También puede utilizar la API de ImageHelp para hacer esto: cargue la DLL con LoadImage y obtendrá una estructura LOADED_IMAGE que contendrá un puntero a una estructura IMAGE_NT_HEADERS. Desasigne LOADED_IMAGE con ImageUnload.
... o adaptar este guión de Perl en bruto
Aquí está el guión de Perl que hace el trabajo. Comprueba que el archivo tiene un encabezado de DOS, luego lee el offset PE de los 60 bytes de IMAGE_DOS_HEADER en el archivo.
A continuación, busca el inicio de la parte de PE, lee la firma y la verifica, y luego extrae el valor que nos interesa.
#!/usr/bin/perl
#
# usage: petype <exefile>
#
$exe = $ARGV[0];
open(EXE, $exe) or die "can''t open $exe: $!";
binmode(EXE);
if (read(EXE, $doshdr, 64)) {
($magic,$skip,$offset)=unpack(''a2a58l'', $doshdr);
die("Not an executable") if ($magic ne ''MZ'');
seek(EXE,$offset,SEEK_SET);
if (read(EXE, $pehdr, 6)){
($sig,$skip,$machine)=unpack(''a2a2v'', $pehdr);
die("No a PE Executable") if ($sig ne ''PE'');
if ($machine == 0x014c){
print "i386/n";
}
elsif ($machine == 0x0200){
print "IA64/n";
}
elsif ($machine == 0x8664){
print "AMD64/n";
}
else{
printf("Unknown machine type 0x%lx/n", $machine);
}
}
}
close(EXE);
Esta pregunta ya tiene una respuesta aquí:
Me gustaría escribir un script o programa de prueba que afirme que todos los archivos DLL en un directorio dado son de un tipo de compilación particular.
Usaría esto como una comprobación de validez al final de un proceso de compilación en un SDK para asegurarme de que la versión de 64 bits no tenga de alguna manera algunos archivos DLL de 32 bits y viceversa.
¿Hay una manera fácil de mirar un archivo DLL y determinar su tipo?
La solución debería funcionar tanto en xp32 como en xp64.
Dependencia Walker lo dice todo (bueno casi). http://www.dependencywalker.com/
No se "instala"; simplemente consígalo, extráigalo y ejecute el exec. Funciona para cualquier aplicación de módulos de Windows x32 o x64.
Como recuerdo, es bastante sencillo ver todas las dependencias, es decir, los módulos dll, y desde la aplicación. es una suma de las dependencias que uno puede determinar si está llena x64, x32 (x86) o un poco de cada una.
El tipo de CPU para la que se construyó el módulo se encuentra en la columna "CPU". La mayoría de los aps de 64 bits son todavía un poco de cada uno, pero de 32 bits ap w / b todo x86.
Hermoso programa para geeks / programadores y es gratis ...
He escrito una herramienta muy simple que hace exactamente eso: se llama Deconstructor PE.
Simplemente enciéndalo y cargue su archivo DLL:
En el ejemplo anterior, la DLL cargada es de 32 bits.
Puede descargarlo aquí (solo tengo el cajero automático compilado de la versión de 64 bits):
http://files.quickmediasolutions.com/exe/pedeconstructor_0.1_amd64.exe
Una versión anterior de 32 bits está disponible aquí:
http://dl.dropbox.com/u/31080052/pedeconstructor.zip
Si tiene instalado Cygwin (que recomiendo encarecidamente por varios motivos), puede usar la utilidad ''archivo'' en la DLL
file <filename>
Lo que daría una salida como esta:
icuuc36.dll: MS-DOS executable PE for MS Windows (DLL) (GUI) Intel 80386 32-bit
Una forma burda sería llamar a dumpbin con la opción de encabezados de las herramientas de Visual Studio en cada DLL y buscar el resultado apropiado:
dumpbin /headers my32bit.dll PE signature found File Type: DLL FILE HEADER VALUES 14C machine (x86) 1 number of sections 45499E0A time date stamp Thu Nov 02 03:28:10 2006 0 file pointer to symbol table 0 number of symbols E0 size of optional header 2102 characteristics Executable 32 bit word machine DLL OPTIONAL HEADER VALUES 10B magic # (PE32)
Puede ver un par de pistas en esa salida de que es una DLL de 32 bits, incluido el valor de 14C que menciona Paul. Debe ser fácil de buscar en un script.