Laufzeitfehler in Pinvoke Signatur,...

04/11/2009 - 08:59 von Kerem Gümrükcü | Report spam
Hallo,

hoffentlich kann mir jemand hierbei helfen. Irgendwas
klappt bei meiner Pinvoke Signatur nicht, d.h. ich bekomme
einen Fehler zur Laufzeit. Hier das Original:

typedef struct _PROCESS_HEAP_ENTRY {
PVOID lpData;
DWORD cbData;
BYTE cbOverhead;
BYTE iRegionIndex;
WORD wFlags;
union {
struct {
HANDLE hMem;
DWORD dwReserved[3];
} Block;
struct {
DWORD dwCommittedSize;
DWORD dwUnCommittedSize;
LPVOID lpFirstBlock;
LPVOID lpLastBlock;
} Region;
} ;
}PROCESS_HEAP_ENTRY


und so sieht meines aus,...


[Flags]
public enum PROCESS_HEAP_ENTRY_WFLAGS : ushort
{
PROCESS_HEAP_ENTRY_BUSY = 0x0004,
PROCESS_HEAP_ENTRY_DDESHARE = 0x0020,
PROCESS_HEAP_ENTRY_MOVEABLE = 0x0010,
PROCESS_HEAP_REGION = 0x0001,
PROCESS_HEAP_UNCOMMITTED_RANGE = 0x0002,
}


[StructLayoutAttribute(LayoutKind.Explicit)]
public struct UNION_BLOCK
{
[FieldOffset(0)]
public STRUCT_BLOCK Block;

[FieldOffset(0)]
public STRUCT_REGION Region;
}

[StructLayoutAttribute(LayoutKind.Sequential)]
public struct STRUCT_BLOCK
{
public IntPtr hMem;
[MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst=3,
ArraySubType=UnmanagedType.U4)]
public uint[] dwReserved;
}

[StructLayoutAttribute(LayoutKind.Sequential)]
public struct STRUCT_REGION
{
public uint dwCommittedSize;
public uint dwUnCommittedSize;
public IntPtr lpFirstBlock;
public IntPtr lpLastBlock;
}

[StructLayoutAttribute(LayoutKind.Sequential)]
public struct PROCESS_HEAP_ENTRY
{
public IntPtr lpData;
public uint cbData;
public byte cbOverhead;
public byte iRegionIndex;
public PROCESS_HEAP_ENTRY_WFLAGS wFlags;
public UNION_BLOCK UnionBlock;
}


Ich will noch anmerken, das meine Interpretation nahezu
identisch mit dem des pinvoke signature Toolkit ist, was
eigentlich auch in 99,9% aller Fàlle die Strukturen richtig
übersetzt, daher ist mir diese fehlermeldung auch nicht
ganz geheuer. Mir ist klar, das sich keine Wertetypen mit
Referenztypen überlappen dürfen, was aber hier nicht der
Fall ist. Das gibt dann als Fehlermeldung:

System.TypeLoadException: Der Typ "UNION_BLOCK" der
Assembly "ListViewEx, Version=1.0.0.0, Culture=neutral,
PublicKeyToken=null" konnte nicht geladen werden,
da sie bei Offset 0 ein Objektfeld enthàlt, das
falsch ausgerichtet ist oder von einem Feld überlappt
wird, das kein Objektfeld ist.

Nachzubilden mit diesem Stück Code:

MessageBox.Show(Marshal.SizeOf(typeof(PROCESS_HEAP_ENTRY)).ToString());

Übersehe ich hier was oder was mache ich falsch?
Jemand eine Idee,...

Grüße

Kerem

Beste Grüsse / Best regards / Votre bien devoue
Kerem Gümrükcü
Latest Project: http://www.pro-it-education.de/soft...iceremover
Latest Open-Source Projects: http://entwicklung.junetz.de
 

Lesen sie die antworten

#1 Elmar Boye
04/11/2009 - 09:55 | Warnen spam
Hallo Kerem,

"Kerem Gümrükcü" schrieb ...
hoffentlich kann mir jemand hierbei helfen. Irgendwas
klappt bei meiner Pinvoke Signatur nicht, d.h. ich bekomme
einen Fehler zur Laufzeit. Hier das Original:

[StructLayoutAttribute(LayoutKind.Sequential)]
public struct STRUCT_BLOCK
{
public IntPtr hMem;
[MarshalAsAttribute(UnmanagedType.ByValArray,SizeConst=3,
ArraySubType=UnmanagedType.U4)]
public uint[] dwReserved;



Der "Bösewicht" wàre hier das Array, wodurch eine Überlappung
zu unten in der REGION Struktur existiert.
Denkbar wàre 3 einzelne uints dwReservered0..2 zu nehmen,
da sie nur zum Auffüllen gedacht sind.

Gruß Elmar

Ähnliche fragen