Windows Vista:No se puede cargar la DLL 'x.dll':Acceso no válido a la ubicación de la memoria.(DllNotFoundException)

StackOverflow https://stackoverflow.com/questions/29284

Pregunta

Esta tarde estuve probando en la caja de un cliente que tiene Windows Vista (él tenía casa, pero estoy probando en una Business Edition con los mismos resultados).

Hacemos uso de un .DLL que obtiene el ID de hardware de la computadora.Su uso es muy simple y el programa de muestra que he creado funciona.El DLL es Esto de AzSdk.De hecho, esto funciona perfectamente en Windows XP.Sin embargo, por alguna extraña razón, dentro de nuestro proyecto (mucho más grande), obtenemos esta excepción:

Exception Type:        System.DllNotFoundException
Exception Message:     Unable to load DLL 'HardwareID.dll': Invalid access to memory location. (Exception from HRESULT: 0x800703E6)
Exception Target Site: GetHardwareID

No sé qué puede estar causando el problema, ya que tengo control total sobre la carpeta.El proyecto es una aplicación c#.net Windows Forms y todo funciona bien, excepto la llamada a la biblioteca externa.

Lo declaro así:(nota:es no una biblioteca COM y no es necesario registrarla).

[DllImport("HardwareID.dll")]
public static extern String GetHardwareID(bool HDD,
   bool NIC, bool CPU, bool BIOS, string sRegistrationCode);

Y luego el código de llamada es bastante simple:

private void button1_Click(object sender, EventArgs e)
{
    textBox1.Text = GetHardwareID(cb_HDD.Checked, 
                                  cb_NIC.Checked, 
                                  cb_CPU.Checked, 
                                  cb_BIOS.Checked, 
                                 "*Registration Code*");
}

Cuando creas una aplicación de muestra, funciona, pero dentro de mi proyecto no.Bajo XP funciona bien.¿Alguna idea sobre qué debo hacer en Vista para que esto funcione?Como dije, la carpeta y sus subcarpetas tienen Control total para "Todos".

ACTUALIZAR: No tengo instalado Vista SP 1.

ACTUALIZACIÓN 2: He instalado Vista SP1 y ahora, con UAC deshabilitado, ¡ni siquiera la muestra simple funciona!:( Maldita Vista.

¿Fue útil?

Solución

@Martín

La razón por la que no recibió el aviso de UAC es porque UAC solo puede cambiar la forma en que se realiza un proceso. comenzó, una vez que el proceso esté en ejecución debe permanecer en el mismo nivel de elevación.La UAC le indicará que sucederá si:

  • Vista cree que es un instalador (muchas reglas aquí, la más sencilla es si se llama "setup.exe"),
  • Si está marcado como "Ejecutar como administrador" (puede editarlo cambiando las propiedades del acceso directo o del archivo ejecutable), o
  • Si el exe contiene un manifiesto que solicita privilegios de administrador.

Las dos primeras opciones son soluciones alternativas para aplicaciones "heredadas" que existían antes de UAC; la forma correcta de hacerlo para aplicaciones nuevas es incrustar un recurso manifiesto pidiendo los privilegios que necesita.

Algún programa, como Explorador de procesos parecen elevar un proceso en ejecución (cuando eliges "Mostrar detalles para todos los procesos" en el menú Archivo en este caso), pero lo que realmente hacen es iniciar una nueva instancia, y es esa nueva instancia la que se eleva, no la que estaba originalmente funcionando.Esta es la forma recomendada de hacerlo si solo algunas partes de su aplicación necesitan elevación (p. ej.un cuadro de diálogo especial de 'opciones de administrador').

Otros consejos

No se puede cargar la DLL 'HardwareID.dll':Acceso no válido a la ubicación de la memoria.(Excepción de HRESULT:0x800703E6)

El nombre de DllNotFoundException lo confunde: esto no es un problema para encontrar o cargar el archivo DLL, el problema es que cuando se carga el DLL, realiza un acceso ilegal a la memoria, lo que hace que falle el proceso de carga.

Como otro cartel aquí, creo que esto es un problema de DEP, y que los cambios de su UAC, etc. finalmente le han permitido desactivar DEP para esta aplicación.

¿La máquina en la que tiene el código implementado es una máquina de 64 bits?También podrías estar topándote con un DEP asunto.

Editar

Esta es una Macbook Pro de primera generación con un procesador Intel Core Duo 2 de primera generación.Lejos de los 64 bits.

Mencioné 64 bits, porque en niveles bajos las estructuras de 32 a 64 bits no se manejan adecuadamente.Dado que las máquinas no son de 64 bits, lo más probable es que deshabilitar DEP sea un buen siguiente paso lógico.Vista se volvió más seguro que XP SP2.

Bueno, acabo de desactivar DEP globalmente sin éxito.Mismo error.

Bueno, también leí que la gente recibía este error después de actualizar una máquina a Vista SP1.¿Estas instalaciones de Vista tienen SP1?

Resulta ser algo completamente diferente.Solo para realizar pruebas, deshabilité el UAC (nota:No recibí ningún mensaje).

Genial, en realidad iba a sugerir eso, pero pensé que probablemente ya lo habías probado.

¿Ha realizado una solicitud de soporte al proveedor?Quizás haya algo en el hardware del MacBook Pro que impida que el producto funcione.

Dado que la excepción es DllNotFoundException, es posible que desee intentar verificar HardwareID.dll con Caminante de dependencia ANTES de instalar cualquier herramienta de desarrollo en la instalación de Vista para ver si realmente falta alguna dependencia.

Además de permitir el control total a "Todos", ¿la ubicación también permite escribir procesos con un nivel de integridad medio?

¿Cómo puedo comprobar eso?Soy nuevo en Vista, no me gusta mucho, es demasiado lento dentro de una VM para el trabajo diario y para el uso de VStudio dentro de una Máquina Virtual, no aporta nada nuevo.

Desde un símbolo del sistema puede ejecutar:

icacls C:\Folder

Si ve una línea como "Etiqueta obligatoria ivel obligatorio alto", solo podrá acceder a la carpeta un proceso de alta integridad.Si no existe dicha línea, los procesos de integridad media pueden acceder a ella siempre que no haya otras ACL que nieguen el acceso (según el usuario, por ejemplo).

EDITAR:Olvidé mencionar que puede usar el modificador /setintegritylevel para cambiar el nivel de integridad requerido para acceder al objeto.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top