Hallo C#-Gemeinde !<BR>
<BR>
Ich bemühe mich seit geraumer Zeit einen Zeiger auf ein Byte-Array <BR>
an eine API-Funktion zu übergeben. Beim Erstellen des Projektes
<BR>
geht noch alles gut, allerdings schlägt der Aufruf der Funktion
<BR>
beim Debuggen mit folgender Meldung fehl :<BR>
<BR>
//<BR>
<BR>
Eine nicht behandelte Ausnahme des Typs 'System.ArgumentException' <BR>
ist in WindowsApplication1.exe aufgetreten. <BR><BR>
Zusätzliche Informationen: <BR>
Es kann keine sinnvolle Offsetgröße berechnet werden, da der Typ <BR>
System.Byte[] nicht als nicht verwaltete Struktur gemarshallt werden <BR> kann.<BR>
// <BR> <BR>
Genau dieser Typ System.Byte[] <BR>
wird aber in einem Bespielprogramm zu Visual C# verwendet. <BR>
Die Compileroption /unsafe ist übrigens aktiviert. <BR> <BR>
Hier die Deklaration und der Aufruf : <BR>
<BR><PRE>
public struct TVendorRequestIn <BR>
{ <BR>
public byte Request;<BR>
public ushort Value;<BR>
public ushort Index;<BR>
public ushort Length;<BR>
public byte Direction;<BR>
public byte Data;<BR>
}<BR>
<BR>
[DllImport("kernel32.dll", EntryPoint = "DeviceIoControl")]<BR>
unsafe internal static extern bool IoControlRdRam <BR>
(uint Handle, uint IoControlCode, <BR>
void* VendorRequestIn, int InBufferSize, <BR>
void* BArray, int OutBufferSize, <BR>
uint* ByteReturn, uint lpOverLapped); <BR><BR>
public unsafe bool RdRamByte ( uint Handle, byte[] Buffer, <BR>
ushort Addr, ref byte RetByte)<BR>
{<BR>
TVendorRequestIn VendorRequestIn;<BR>
bool RetValue; uint nBytes = 0;<BR>
// Initialisierung<BR>
VendorRequestIn.Request = 0xA0; VendorRequestIn.Value = Addr;
<BR>
VendorRequestIn.Index = 0; VendorRequestIn.Length = 0;<BR>
VendorRequestIn.Direction = DirectionRead; VendorRequestIn.Data = 0;
<BR><BR>
fixed ( byte* PtrBuffer = &Buffer[5] )<BR>
{<BR>
// Aufruf<BR>
RetValue = IoControlRdRam(Handle, CTL_Ezusb_VENDOR_REQUEST,<BR>
&VendorRequestIn, 10,<BR>
PtrBuffer, Marshal.SizeOf(Buffer),<BR>
&nBytes, 0);<BR>
}<BR>
RetByte = Buffer[0];<BR>
return RetValue;<BR>
}<BR><BR></PRE>
Auch das genaue nachvollziehen des Beispieles mit <BR>
"fixed ( byte* PtrBuffer = Buffer )"<BR>
bringt keinen Erfolg !<BR>
<BR>
Bin nun leider am Ende mit meinem Latein und für jede Hilfe dankbar !<BR><BR>
Grüsse Karsten!
<BR>
Ich bemühe mich seit geraumer Zeit einen Zeiger auf ein Byte-Array <BR>
an eine API-Funktion zu übergeben. Beim Erstellen des Projektes
<BR>
geht noch alles gut, allerdings schlägt der Aufruf der Funktion
<BR>
beim Debuggen mit folgender Meldung fehl :<BR>
<BR>
//<BR>
<BR>
Eine nicht behandelte Ausnahme des Typs 'System.ArgumentException' <BR>
ist in WindowsApplication1.exe aufgetreten. <BR><BR>
Zusätzliche Informationen: <BR>
Es kann keine sinnvolle Offsetgröße berechnet werden, da der Typ <BR>
System.Byte[] nicht als nicht verwaltete Struktur gemarshallt werden <BR> kann.<BR>
// <BR> <BR>
Genau dieser Typ System.Byte[] <BR>
wird aber in einem Bespielprogramm zu Visual C# verwendet. <BR>
Die Compileroption /unsafe ist übrigens aktiviert. <BR> <BR>
Hier die Deklaration und der Aufruf : <BR>
<BR><PRE>
public struct TVendorRequestIn <BR>
{ <BR>
public byte Request;<BR>
public ushort Value;<BR>
public ushort Index;<BR>
public ushort Length;<BR>
public byte Direction;<BR>
public byte Data;<BR>
}<BR>
<BR>
[DllImport("kernel32.dll", EntryPoint = "DeviceIoControl")]<BR>
unsafe internal static extern bool IoControlRdRam <BR>
(uint Handle, uint IoControlCode, <BR>
void* VendorRequestIn, int InBufferSize, <BR>
void* BArray, int OutBufferSize, <BR>
uint* ByteReturn, uint lpOverLapped); <BR><BR>
public unsafe bool RdRamByte ( uint Handle, byte[] Buffer, <BR>
ushort Addr, ref byte RetByte)<BR>
{<BR>
TVendorRequestIn VendorRequestIn;<BR>
bool RetValue; uint nBytes = 0;<BR>
// Initialisierung<BR>
VendorRequestIn.Request = 0xA0; VendorRequestIn.Value = Addr;
<BR>
VendorRequestIn.Index = 0; VendorRequestIn.Length = 0;<BR>
VendorRequestIn.Direction = DirectionRead; VendorRequestIn.Data = 0;
<BR><BR>
fixed ( byte* PtrBuffer = &Buffer[5] )<BR>
{<BR>
// Aufruf<BR>
RetValue = IoControlRdRam(Handle, CTL_Ezusb_VENDOR_REQUEST,<BR>
&VendorRequestIn, 10,<BR>
PtrBuffer, Marshal.SizeOf(Buffer),<BR>
&nBytes, 0);<BR>
}<BR>
RetByte = Buffer[0];<BR>
return RetValue;<BR>
}<BR><BR></PRE>
Auch das genaue nachvollziehen des Beispieles mit <BR>
"fixed ( byte* PtrBuffer = Buffer )"<BR>
bringt keinen Erfolg !<BR>
<BR>
Bin nun leider am Ende mit meinem Latein und für jede Hilfe dankbar !<BR><BR>
Grüsse Karsten!