tutorials.de Buch-Aktion 05/2012
ERLEDIGT
JA
ANTWORTEN
4
ZUGRIFFE
442
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    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 :
    1
    2
    3
    4
    5
    
            [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
     

  2. #2
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    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ß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  3. #3
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    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 :
    1
    2
    3
    4
    
                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 :
    1
    2
    3
    4
    
                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 :
    1
    2
    
            [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 :
    1
    2
    
                    func = Win32.UnsafeNativeMethods.GetProcAddress(hStorm, "SFileReadFile");
                    SFileReadFile = (tSFileReadFile)Marshal.GetDelegateForFunctionPointer(hStorm, typeof(tSFileReadFile));

    Ich bin momentan echt ratlos!
     

  4. #4
    deepthroat deepthroat ist offline Mitglied Diamant
    tutorials.de Premium-User
    Registriert seit
    Jun 2005
    Beiträge
    8.168
    Hi.
    Zitat Zitat von Cromon Beitrag anzeigen
    Code :
    1
    2
    
                    func = Win32.UnsafeNativeMethods.GetProcAddress(hStorm, "SFileReadFile");
                    SFileReadFile = (tSFileReadFile)Marshal.GetDelegateForFunctionPointer(hStorm, typeof(tSFileReadFile));
    Ich nehme an, das GetDelegateForFunctionPointer(hStorm, ...) ist nur ein Tippfehler?!

    Gruß
     
    If at first you don't succeed, try again. Then quit. No use being a damn fool about it.

  5. #5
    Cromon Cromon ist offline Mitglied Brillant
    Registriert seit
    Apr 2008
    Beiträge
    819
    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

    Gruss und Dank
    Cromon
     

Ähnliche Themen

  1. Antworten: 1
    Letzter Beitrag: 12.08.10, 10:03
  2. DllImport
    Von dila71 im Forum .NET Café
    Antworten: 2
    Letzter Beitrag: 27.05.08, 12:48
  3. Funktionszeiger in eine Map speichern
    Von int0xicated im Forum C/C++
    Antworten: 0
    Letzter Beitrag: 01.05.08, 20:43
  4. Funktionszeiger in array - aber anders!
    Von zoidberger im Forum C/C++
    Antworten: 10
    Letzter Beitrag: 22.04.08, 08:20
  5. DLL debuggen (DllImport)
    Von MD1978 im Forum .NET Café
    Antworten: 2
    Letzter Beitrag: 06.04.06, 09:18