ERLEDIGT
JA
JA
ANTWORTEN
4
4
ZUGRIFFE
442
442
EMPFEHLEN
-
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
-
23.11.10 15:54 #2
- 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.
-
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!
-
24.11.10 08:49 #4
- Registriert seit
- Jun 2005
- Beiträge
- 8.168
If at first you don't succeed, try again. Then quit. No use being a damn fool about it.
-
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
-
Konvertieren eines sigc::slots in einen Funktionszeiger?
Von engelmarkus im Forum C/C++Antworten: 1Letzter Beitrag: 12.08.10, 10:03 -
DllImport
Von dila71 im Forum .NET CaféAntworten: 2Letzter Beitrag: 27.05.08, 12:48 -
Funktionszeiger in eine Map speichern
Von int0xicated im Forum C/C++Antworten: 0Letzter Beitrag: 01.05.08, 20:43 -
Funktionszeiger in array - aber anders!
Von zoidberger im Forum C/C++Antworten: 10Letzter Beitrag: 22.04.08, 08:20 -
DLL debuggen (DllImport)
Von MD1978 im Forum .NET CaféAntworten: 2Letzter Beitrag: 06.04.06, 09:18





Zitieren
Login





