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
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
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.
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.
Empfohlene Beiträge
Erstelle ein Benutzerkonto oder melde Dich an, um zu kommentieren
Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können
Benutzerkonto erstellen
Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!
Neues Benutzerkonto erstellenAnmelden
Du hast bereits ein Benutzerkonto? Melde Dich hier an.
Jetzt anmelden