Hallo,
ich habe hier eine DLL, mit der man eine verschlüsselte Datei öffnen und auslesen kann.
Mein Code:
[DllImport("Reader.dll", CallingConvention = CallingConvention.Cdecl)]
private static extern int OpenDb(string filename, string pw, int n, out IntPtr handle);
private IntPtr handle = IntPtr.Zero;
private string file = "Datei";
public bool Open(string password)
{
if (OpenDb(this.file, password, 0, out handle) == 0)
return true;
else
return false;
}
Das Interessante ist nun, dass das ganze funktioniert, solange man das Programm im Debugger (also F5) ausführt. Wenn ich es normal starte (Strg + F5) dann stürzt das Programm mit einer AccessViolationException ab.
Wie kann das sein? Habt ihr eine Idee?
Danke.
Mfg
Firewire
AccessViolation ist eine Speicherverletzung.
Du musst das Password schon an einer fixen Stelle im Password speichern, damit nicht der Garbage Collector die Adresse verschiebt, waehrend Deine externe Funktion aufgerufen ist. Stichwort Fixed-Anweisung.
Das ist jetzt aber nur ein Problem - kann gut sein, dass Du noch weitere Fehler hast.
Hallo weismat, hallo Firewire,
es ist nicht nötig Strings, oder Arrays, zu fixieren für einen PInvoke-Aufruf, die Runtime übernimmt das für einen.
Grüße
spooky