2008-08-27 4 views
4

Ich habe heute Nachmittag auf einer Kundenbox getestet, die Windows Vista hat (Er hatte zu Hause, aber ich teste auf einer Business Edition mit den gleichen Ergebnissen).Windows Vista: DLL 'x.dll' konnte nicht geladen werden: Ungültiger Zugriff auf den Speicherort. (DllNotFoundException)

Wir verwenden eine .DLL, die die Hardware-ID des Computers erhält. Die Bedienung ist sehr einfach und das von mir erstellte Beispielprogramm funktioniert. Die Dll ist This from AzSdk. In der Tat funktioniert das perfekt unter Windows XP. Doch aus irgendeinem seltsamen Grund, in unserem Projekt (viel größer), bekommen wir 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 verursacht, da ich die volle Kontrolle über den Ordner haben. Das Projekt ist eine C# .net Windows Forms-Anwendung und alles funktioniert gut, außer dem Aufruf für die externe Bibliothek.

Ich deklariere es so: (Hinweis: es ist nicht eine COM-Bibliothek und es muss nicht registriert werden).

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

Und dann der aufrufende Code ist 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 zu erstellen, es funktioniert, aber in meinem projectit nicht. Unter XP funktioniert das gut. Irgendwelche Ideen darüber, was ich in Vista tun sollte, damit dies funktioniert? Wie gesagt, der Ordner und seine Unterordner haben Vollzugriff auf "Everybody".

UPDATE: Ich habe Vista SP 1 nicht installiert.

UPDATE 2: Ich habe Vista SP1 installiert und jetzt, mit UAC deaktiviert, nicht einmal die einfache Probe funktioniert !!! Verdammt :(Vista.

Antwort

2

@Martín

Der Grund, warum Sie die UAC-Eingabeaufforderung nicht bekamen, weil UAC kann sich nur ändern, wie ein Prozess gestartet ist, sobald der Prozess es läuft auf der gleichen Höhe Niveau bleiben müssen. Die UAC wird passieren wird aufgefordert, wenn:

  • Vista denkt, es ist ein Installer (lots of rules here, die einfachste ist, wenn es „setup.exe“ genannt),
  • Wenn es als „Ausführen als Administrator“ (Sie markiert ist kann dies bearbeiten, indem Sie die Eigenschaften der Verknüpfung oder der exe ändern, oder
  • Wenn die Exe enthält ein Manifest anfordern Administratorrechte.

Die ersten beiden Optionen Abhilfen für ‚Legacy‘ Anwendungen sind, die sich um vor UAC waren, ist der richtige Weg für neue Anwendungen zu tun, für die Privilegien embed a manifest resource zu stellen, die Sie benötigen.

Einige Programme, wie Process Explorer scheinen einen laufenden Prozess zu erhöhen (wenn Sie in diesem Fall "Details für alle Prozesse anzeigen" im Dateimenü wählen), aber was sie wirklich tun, ist eine neue Instanz zu starten, und diese ist neu Instanz, die erhöht wird - nicht die, die ursprünglich ausgeführt wurde. Dies ist die empfohlene Vorgehensweise, wenn nur einige Teile Ihrer Anwendung eine Erhöhung benötigen (z. B. ein spezieller Dialog "Admin-Optionen").

1

Ist die Maschine, die Sie haben den Code zum Einsatz auf einer 64-Bit-Maschine? Sie könnten auch in eine DEP Ausgabe laufen.

bearbeiten

Dies ist eine erste Generation Macbook Pro mit einem ersten Generation Core Duo 2 Intel-Prozessor. Weit weg von 64 Bit.

erwähnte ich 64 Bit, weil auf einem niedrigen Niveau structs von 32 Bit auf 64 Bit werden nicht richtig gehandhabt wird. da die Maschinen ‚aren t 64bit, dann mehr als li Eine Deaktivierung von DEP wäre ein guter logischer nächster Schritt. Vista wurde sicherer als XP SP2.

Nun, ich habe gerade DEP global vergebens ausgeschaltet. Derselbe Fehler.

Nun, ich habe auch gelesen, dass Leute diesen Fehler nach der Aktualisierung einer Maschine auf Vista SP1 bekommen haben. Haben diese Vista-Installationen SP1 auf ihnen?

Entpuppt sich als etwas völlig anderes. Nur um zu testen, ich habe de UAC deaktiviert (Hinweis: Ich bekam keine Eingabeaufforderung).

Großartig, ich wollte das vorschlagen, aber ich dachte, Sie haben es wahrscheinlich schon versucht.

0

Haben Sie eine Supportanfrage an den Anbieter gestellt? Vielleicht gibt es etwas an der MacBook Pro-Hardware, das verhindert, dass das Produkt funktioniert.

0

Da die Ausnahme ein DllNotFoundException ist, mögen Sie vielleicht die HardwareID.dll Überprüfung mit Dependency Walker vor der Installation der Entwickler-Tool auf dem Vista, um zu versuchen zu installieren, um zu sehen, ob es in der Tat fehlt eine Abhängigkeit.

+0

Der Name der Ausnahme könnte fehlleitend sein. Siehe Beitrag oben. – Pupsik

4

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

Der Name DllNotFoundException ist verwirrend Sie - dies mit der Suche nach oder das Laden der DLL-Datei ist kein Problem, das Problem ist, dass, wenn die DLL geladen wird, tut es ein illegales Speicherzugriff, der dazu führt, dass der Ladevorgang fehlschlägt.

Wie ein anderes Poster hier, ich denke, dies ist ein DEP-Problem, und dass Ihre UAC, usw., Änderungen haben Sie schließlich DEP für diese Anwendung zu deaktivieren.

+0

+1 für die Erklärung des Problems in einer Weise, dass ich verstehe, was das eigentliche Problem ist, und wissen, wonach ich suchen soll – Rachel

0

Neben der Möglichkeit, die volle Kontrolle „Jeden“ ist die Lage auch mit mittlerer Integrität Ebene Prozesse erlauben zu schreiben?

Wie überprüfe ich das? Ich bin neu in Vista, ich mag es nicht zu sehr, es ist zu langsam in einer VM für die tägliche Arbeit und für die Verwendung von VStudio in einer virtuellen Maschine, es bringt nichts Neues.

Von einer Eingabeaufforderung Sie ausführen können:

icacls C:\Folder 

Wenn Sie eine Zeile wie „Pflicht Etikett \ Hochverbindlichkeitsstufe“ sehen dann den Ordner nur für eine hohe Integrität Prozess. Wenn es keine solche Zeile gibt, können Medienintegritätsprozesse darauf zugreifen, vorausgesetzt, es gibt keine anderen ACLs, die den Zugriff verweigern (z. B. basierend auf einem Benutzer).

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

Verwandte Themen