DLLImport <-> Unverwalteter Funktionszeiger

Cromon

Erfahrenes Mitglied
Hallo zusammen!

In meinem aktuellen Tool gibt es verschiedene Versionen einer DLL, auf die ich von aussen keinen Einfluss nehmen kann. Je nach Umgebung auf der Zielplattform muss dabei eine andere DLL verwendet werden. Aus diesem Grund ist es mir nicht möglich das DLLImport-Attribut zu verwenden, denn ich weiss den DLLNamen erst zu Laufzeit. Deshalb verwende ich LoadLibrary und GetProcAddress. Bisher funktioniert das super, allerdings habe ich ein Problem mit der folgenden Funktion.

Hier die beiden Varianten:
Code:
        [DllImport("Stormlib_40.dll", EntryPoint = "SFileReadFile")]
        public static extern bool FileRead(IntPtr hFile, [In, Out] byte[] buffer, uint bytes, ref uint read, IntPtr overlapped);

        [UnmanagedFunctionPointer(CallingConvention.StdCall, CharSet = CharSet.Ansi)]
        public delegate bool tSFileReadFile(IntPtr hFile, [In, Out] byte[] buffer, uint bytes, ref uint read, IntPtr overlapped);

Nun ist es so, dass obige Variante problemlos funktioniert während die untere eine Zugriffsverletzung in der DLL auslöst. Meine Vermutung ist, dass dabei entweder Parameter buffer oder read verantwortlich sind. Allerdings verstehe ich nicht, wo das Problem genau liegt!

Ich hoffe, mir kann dabei jemand helfen!

Gruss
Cromon
 
Hi.

Zeig mal etwas mehr Code. Wie verwendest du denn den delegate?

Ich hätte buffer als "[Out] out byte[]" und read als "[Out] out uint" deklariert.

Gruß
 
Hallo deepthroat!

Leider hat bisher noch nichts zum Ergebnis geführt, ich habe es auch mit unsafe und void* als Parameter versucht und dann ein gepinntes Array übergeben, aber leider auch nichts. Mein aktueller Aufruf sieht folgendermassen aus (mit gepostetem delegat, wobei ref durch out ersetzt wurde)
Code:
            int size = Marshal.SizeOf(typeof(T));
            byte[] buffer = new byte[size];
            uint bytesRead = 0;
            StormMethods.SFileReadFile(hFile, buffer, (uint)size, out bytesRead, IntPtr.Zero);

Dies funktioniert nicht. Ändere ich es so ab:
Code:
            int size = Marshal.SizeOf(typeof(T));
            byte[] buffer = new byte[size];
            uint bytesRead = 0;
            StormMethods.FileReadFile(hFile, buffer, (uint)size, out bytesRead, IntPtr.Zero);

mit
Code:
        [DllImport("Stormlib_40.dll", EntryPoint = "SFileReadFile")]
        public static extern bool FileReadFile(IntPtr hFile, [In, Out] byte[] buffer, uint bytes, out uint read, IntPtr overlapped);

Ist die Welt in Ordnung. Geladen wird das delegat wie alle anderen auch:
Code:
                func = Win32.UnsafeNativeMethods.GetProcAddress(hStorm, "SFileReadFile");
                SFileReadFile = (tSFileReadFile)Marshal.GetDelegateForFunctionPointer(hStorm, typeof(tSFileReadFile));

Ich bin momentan echt ratlos!
 
Hallo deepthroat

Das war in der Tat ein Tippfehler, der sich allerdings auch in der Applikation verewigt hat. Es ist erstaunlich, dass mir das beim unzähligen Drüberblicken und sogar beim posten hier nicht aufgefallen ist. Ein Grund, warum ich unverwalteten Code so ungerne in verwaltetem Verwende, die Variablen mit denen man hantiert haben plötzlich alle den gleichen Typ (IntPtr) und können beliebig verwechselt werden :D

Gruss und Dank
Cromon
 
Zurück