raiserle Geschrieben 14. Januar 2015 Geschrieben 14. Januar 2015 Hallo Leute, bei mir kommt es bei follgendem Code zu einer "AccessViolationException". Dim stDMVar_Filter As DllCallsAndTypes.ODK.DataManager.DM_VARFILTER stDMVar_Filter.dwFlags = DM_VARFILTER_ENUM.DM_VARFILTER_NAME stDMVar_Filter.dwNumTypes = 0 stDMVar_Filter.lpszConn = "" stDMVar_Filter.lpszGroup = "" stDMVar_Filter.lpszName = "*" stDMVar_Filter.pdwTypes = IntPtr.Zero Dim ptrVarFilter As IntPtr = Marshal.AllocHGlobal(Marshal.SizeOf(GetType(DM_VARFILTER))) Marshal.StructureToPtr(stDMVar_Filter, ptrVarFilter, True) '<-- HIER EXCEPTION Die Deklaration in C von der Struktur ist diese: typedef struct { DWORD dwFlags; DWORD dwNumTypes; LPDWORD pdwTypes; LPSTR lpszGroup; LPSTR lpszName; LPSTR lpszConn; } DM_VARFILTER; In VB habe ich die Struktur wie follgt angelegt: <StructLayout(LayoutKind.Sequential, CharSet:=CharSet.Ansi, Pack:=1)> Public Structure DM_VARFILTER <MarshalAs(UnmanagedType.U4)> Public dwFlags As DM_VARFILTER_ENUM '4 004 <MarshalAs(UnmanagedType.U4)> Public dwNumTypes As UInt32 '4 008 Public pdwTypes As System.IntPtr '4 012 <MarshalAs(UnmanagedType.LPStr)> Public lpszGroup As [String] '4 016 <MarshalAs(UnmanagedType.LPStr)> Public lpszName As [String] '4 020 <MarshalAs(UnmanagedType.LPStr)> Public lpszConn As [String] '4 024 End Structure Wenn ich die Struktur ausrechne, komme ich auf 24 Byte. Diese werden auch mit Marshal.AllocHGlobal alloziert (siehe Bildchen im Anhang). Was habe ich nicht beachtet, dass es zu einer Access Violation kommt. vG raiserle Zitieren
mfk'); DROP TABLE Users;-- Geschrieben 14. Januar 2015 Geschrieben 14. Januar 2015 On the first call to the StructureToPtr method after a memory block has been allocated, fDeleteOld must be false, because there are no contents to clear. 12345 Zitieren
raiserle Geschrieben 14. Januar 2015 Autor Geschrieben 14. Januar 2015 Ok, hatte ich nicht gelesen. Danke. Aber: Dann müsste doch die Exception immer auftreten? Aber das oben beschriebene tritt nicht immer auf. Zitieren
mfk'); DROP TABLE Users;-- Geschrieben 14. Januar 2015 Geschrieben 14. Januar 2015 Im finsteren Unmanaged-Land gibt es etwas, das sich "undefiniertes Verhalten" nennt. Das heißt, kaputter Code kann funktionieren, er kann dir aber auch um die Ohren fliegen. Oder die Festplatte formatieren. Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.