Windows Vista:Impossibile caricare la DLL 'x.dll':Accesso non valido alla posizione di memoria.(DllNotFoundException)

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

Domanda

Questo pomeriggio stavo testando il computer di un cliente che dispone di Windows Vista (aveva casa, ma sto testando su una Business Edition con gli stessi risultati).

Utilizziamo un file .DLL che ottiene l'ID hardware del computer.Il suo utilizzo è molto semplice e il programma di esempio che ho creato funziona.La Dll lo è Questo da AzSdk.In effetti, funziona perfettamente con Windows XP.Tuttavia, per qualche strana ragione, all'interno del nostro progetto (molto più grande), otteniamo questa eccezione:

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

Non so quale possa essere la causa del problema, poiché ho il pieno controllo della cartella.Il progetto è un'applicazione Windows Forms c#.net e tutto funziona bene, tranne la chiamata alla libreria esterna.

Lo dichiaro in questo modo:(Nota:suo non una libreria COM e non è necessario registrarla).

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

E poi il codice chiamante è abbastanza semplice:

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*");
}

Quando crei un'applicazione di esempio, funziona, ma all'interno del mio progetto no.Sotto XP funziona bene.Qualche idea su cosa dovrei fare in Vista per farlo funzionare?Come ho detto, la cartella e le sue sottocartelle hanno il controllo completo per "Tutti".

AGGIORNAMENTO: Non ho Vista SP 1 installato.

AGGIORNAMENTO 2: Ho installato Vista SP1 e ora, con l'UAC disabilitato, non funziona nemmeno il semplice sample!!!:( Maledizione Vista.

È stato utile?

Soluzione

@Martin

Il motivo per cui non ricevevi il prompt dell'UAC è perché l'UAC può solo modificare la modalità di funzionamento di un processo iniziato, una volta che il processo è in esecuzione deve rimanere allo stesso livello di elevazione.La richiesta di UAC avverrà se:

  • Vista pensa che sia un programma di installazione (molte regole qui, il più semplice è se si chiama "setup.exe"),
  • Se è contrassegnato come "Esegui come amministratore" (puoi modificarlo modificando le proprietà del collegamento o dell'exe), oppure
  • Se l'exe contiene un manifest che richiede privilegi di amministratore.

Le prime due opzioni sono soluzioni alternative per le applicazioni "legacy" esistenti prima dell'UAC, il modo corretto per farlo per le nuove applicazioni è quello di incorporare una risorsa manifest chiedendo i privilegi di cui hai bisogno.

Alcuni programmi, come Esplora processi sembrano elevare un processo in esecuzione (quando scegli "Mostra dettagli per tutti i processi" nel menu File in questo caso) ma ciò che realmente fanno è avviare una nuova istanza, ed è quella nuova istanza che viene elevata, non quella che era originariamente in esecuzione.Questo è il modo consigliato per farlo se solo alcune parti della tua applicazione necessitano di elevazione (ad es.una speciale finestra di dialogo "Opzioni di amministrazione").

Altri suggerimenti

Impossibile caricare la DLL 'HardwareID.dll':Accesso non valido alla posizione di memoria.(Eccezione da HRESULT:0x800703E6)

Il nome di DllNotFoundException ti confonde: questo non è un problema con la ricerca o il caricamento del file DLL, il problema è che quando la DLL viene caricata, esegue un accesso illegale alla memoria che causa il fallimento del processo di caricamento.

Come un altro utente qui, penso che questo sia un problema DEP e che le modifiche all'UAC, ecc., ti abbiano finalmente permesso di disabilitare DEP per questa applicazione.

La macchina su cui è stato distribuito il codice è una macchina a 64 bit?Potresti anche imbatterti in a DEP problema.

Modificare

Questo è un Macbook Pro di prima generazione con un processore Intel Core Duo 2 di prima generazione.Lontano dai 64 bit.

Ho menzionato 64 bit, perché a livelli bassi le strutture da 32 bit a 64 bit non vengono gestite correttamente.Poiché le macchine non sono a 64 bit, molto probabilmente disabilitare DEP sarebbe un buon passo logico successivo.Vista è diventato più sicuro di XP SP2.

Bene, ho appena disattivato DEP a livello globale senza alcun risultato.Stesso errore.

Bene, ho anche letto che le persone ricevevano questo errore dopo aver aggiornato una macchina a Vista SP1.Queste installazioni di Vista hanno SP1?

Risulta essere qualcosa di completamente diverso.Solo per motivi di test, ho disabilitato l'UAC (nota:Non ricevevo alcun messaggio).

Fantastico, in realtà stavo per suggerirlo, ma ho pensato che probabilmente l'avevi già provato.

Hai fatto una richiesta di supporto al venditore?Forse c'è qualcosa nell'hardware del MacBook Pro che impedisce al prodotto di funzionare.

Dato che l'eccezione è una DllNotFoundException, potresti provare a controllare HardwareID.dll con Camminatore della dipendenza PRIMA di installare qualsiasi strumento di sviluppo sull'installazione di Vista per vedere se manca effettivamente una dipendenza.

Oltre a consentire il pieno controllo a "Tutti", la posizione consente anche la scrittura di processi con un livello di integrità medio?

Come posso verificarlo?Sono nuovo di Vista, non mi piace molto, è troppo lento all'interno di una VM per il lavoro quotidiano e per l'utilizzo di VStudio all'interno di una macchina virtuale, non apporta nulla di nuovo.

Da un prompt dei comandi è possibile eseguire:

icacls C:\Folder

Se vedi una riga come "Etichetta obbligatoria\Livello obbligatorio elevato", la cartella è accessibile solo a un processo ad alta integrità.Se non esiste una linea di questo tipo, i processi di integrità media possono accedervi a condizione che non vi siano altri ACL che negano l'accesso (in base all'utente, ad esempio).

MODIFICARE:Ho dimenticato di menzionare che è possibile utilizzare l'opzione /setintegritylevel per modificare effettivamente il livello di integrità richiesto per accedere all'oggetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top