Windows Vista:DLL 'x.dll' kann nicht geladen werden:Ungültiger Zugriff auf den Speicherort.(DllNotFoundException)

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

Frage

Ich habe heute Nachmittag auf der Box eines Kunden getestet, der Windows Vista hat (er hatte zu Hause, aber ich teste auf einer Business Edition mit den gleichen Ergebnissen).

Wir verwenden eine .DLL, die die Hardware-ID des Computers erhält.Die Verwendung ist sehr einfach und das von mir erstellte Beispielprogramm funktioniert.Die Dll ist Dies von AzSdk.Tatsächlich funktioniert dies unter Windows XP einwandfrei.Aus irgendeinem seltsamen Grund erhalten wir jedoch in unserem (viel größeren) Projekt diese Ausnahme:

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

Ich weiß nicht, was das Problem verursachen könnte, da ich die volle Kontrolle über den Ordner habe.Das Projekt ist eine c#.net Windows Forms-Anwendung und alles funktioniert einwandfrei, bis auf den Aufruf der externen Bibliothek.

Ich erkläre es so:(Notiz:es ist nicht eine COM-Bibliothek und muss nicht registriert werden).

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

Und dann ist der aufrufende Code ganz einfach:

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

Wenn Sie eine Beispielanwendung erstellen, funktioniert es, in meinem Projekt jedoch nicht.Unter XP funktioniert es einwandfrei.Irgendwelche Ideen, was ich in Vista tun muss, damit das funktioniert?Wie ich bereits sagte, haben der Ordner und seine Unterordner Vollzugriff für „Jeder“.

AKTUALISIEREN: Ich habe Vista SP 1 nicht installiert.

UPDATE 2: Ich habe Vista SP1 installiert und jetzt, mit deaktivierter Benutzerkontensteuerung, funktioniert nicht einmal das einfache Beispiel!!!:( Verdammtes Vista.

War es hilfreich?

Lösung

@Martin

Der Grund dafür, dass Sie die UAC-Eingabeaufforderung nicht erhalten haben, liegt darin, dass UAC nur ändern kann, wie ein Prozess ist gestartet, Sobald der Prozess ausgeführt wird, muss er auf dem gleichen Höhenniveau bleiben.Die UAC-Eingabeaufforderung wird angezeigt, wenn:

  • Vista denkt, es sei ein Installer (Hier gibt es viele Regeln, am einfachsten ist es, wenn es „setup.exe“ heißt),
  • Wenn es als „Als Administrator ausführen“ gekennzeichnet ist (Sie können dies bearbeiten, indem Sie die Eigenschaften der Verknüpfung oder der Exe-Datei ändern), oder
  • Wenn die Exe ein Manifest enthält, das Administratorrechte anfordert.

Bei den ersten beiden Optionen handelt es sich um Problemumgehungen für „ältere“ Anwendungen, die es vor der Benutzerkontensteuerung gab. Der richtige Weg, dies für neue Anwendungen zu tun, ist: Einbetten einer Manifest-Ressource Bitten Sie um die Privilegien, die Sie benötigen.

Einige Programme, wie z Process Explorer scheinen einen laufenden Prozess hochzustufen (wenn Sie in diesem Fall im Dateimenü „Details für alle Prozesse anzeigen“ wählen), aber in Wirklichkeit starten sie eine neue Instanz, und es ist diese neue Instanz, die hochgestuft wird – nicht die, die es war ursprünglich ausgeführt.Dies ist die empfohlene Vorgehensweise, wenn nur einige Teile Ihrer Anwendung eine Erhöhung benötigen (z. B.ein spezielles Dialogfeld „Administratoroptionen“).

Andere Tipps

DLL „HardwareID.dll“ kann nicht geladen werden:Ungültiger Zugriff auf den Speicherort.(Ausnahme von HRESULT:0x800703E6)

Der Name DllNotFoundException verwirrt Sie – das ist kein Problem beim Finden oder Laden der DLL-Datei, das Problem besteht darin, dass beim Laden der DLL ein illegaler Speicherzugriff erfolgt, der dazu führt, dass der Ladevorgang fehlschlägt.

Wie ein anderer Poster hier denke ich, dass dies ein DEP-Problem ist und dass Ihre UAC-Änderungen usw. es Ihnen endlich ermöglicht haben, DEP für diese Anwendung zu deaktivieren.

Ist der Computer, auf dem Sie den Code bereitgestellt haben, auf einem 64-Bit-Computer?Sie könnten auch auf eine stoßen DEP Ausgabe.

Bearbeiten

Dies ist ein Macbook Pro der 1. Generation mit einem Core Duo 2 Intel-Prozessor der 1. Generation.Weit entfernt von 64 Bit.

Ich habe 64 Bit erwähnt, da Strukturen von 32 Bit bis 64 Bit auf niedrigen Ebenen nicht richtig verarbeitet werden.Da die Maschinen nicht 64-Bit sind, wäre die Deaktivierung von DEP höchstwahrscheinlich ein guter logischer nächster Schritt.Vista wurde sicherer als XP SP2.

Nun, ich habe gerade DEP global deaktiviert, ohne Erfolg.Gleicher Fehler.

Nun, ich habe auch gelesen, dass diese Fehlermeldung bei Leuten auftritt, nachdem sie einen Computer auf Vista SP1 aktualisiert haben.Ist auf diesen Vista-Installationen SP1 installiert?

Es stellt sich heraus, dass es etwas ganz anderes ist.Nur zu Testzwecken habe ich die Benutzerkontensteuerung deaktiviert (Hinweis:Ich habe keine Aufforderung erhalten).

Großartig, das wollte ich eigentlich vorschlagen, aber ich dachte, dass du es wahrscheinlich schon probiert hast.

Haben Sie eine Supportanfrage an den Anbieter gestellt?Möglicherweise gibt es etwas an der MacBook Pro-Hardware, das die Funktion des Produkts verhindert.

Da es sich bei der Ausnahme um eine DllNotFoundException handelt, sollten Sie versuchen, die HardwareID.dll mit zu überprüfen Abhängigkeit Walker Bevor Sie Entwicklungstools auf der Vista-Installation installieren, prüfen Sie, ob tatsächlich eine Abhängigkeit fehlt.

Ermöglicht der Speicherort nicht nur die volle Kontrolle für „Jeder“, sondern auch das Schreiben von Prozessen mit mittlerer Integritätsstufe?

Wie überprüfe ich das?Ich bin neu bei Vista, es gefällt mir nicht so gut, es ist in einer VM für die tägliche Arbeit zu langsam und für die VStudio-Nutzung in einer virtuellen Maschine bringt es nichts Neues.

Von einer Eingabeaufforderung aus können Sie Folgendes ausführen:

icacls C:\Folder

Wenn Sie eine Zeile wie „Mandatory Label\High Mandatory Level“ sehen, ist der Ordner nur für einen Prozess mit hoher Integrität zugänglich.Wenn keine solche Zeile vorhanden ist, können Prozesse mit mittlerer Integrität darauf zugreifen, sofern keine anderen ACLs den Zugriff verweigern (z. B. basierend auf dem Benutzer).

BEARBEITEN:Ich habe vergessen zu erwähnen, dass Sie den Schalter /setintegritylevel verwenden können, um die erforderliche Integritätsstufe für den Zugriff auf das Objekt tatsächlich zu ändern.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top