On 2012-02-21, Curtis Newton <
cne...@web.de> wrote:
> Geht doch. Funktion mit "ref IntPtr" deklarieren und aus dem IntPtr
> mittels Marshal.PtrToStructure nachm struct konvertieren.
Jetzt habe ich ein anderes Problem:
Die C-Struktur:
#define MAX_STRING_LEN 300
typedef struct _DeviceKey
{
INT32 _serial;
char _manufacturer_str[MAX_STRING_LEN];
char _product_str[MAX_STRING_LEN];
char _device_str[MAX_STRING_LEN];
INT32 _busy;
} DeviceKey;
C#-Äquivalent:
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi)]
public struct DeviceKey
{
public Int32 _serial;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 300)]
public string _manufacturer_str;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 300)]
public string _product_str;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 300)]
public string _device_str;
public Int32 _busy;
};
Geht, aber nur in eine Richtung. Ich habe z.B. diese Funktion:
INT32 __cdecl OpenDevice(const DeviceKey *device_key, Device *device);
C#:
[DllImport("My.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int OpenDevice(out DeviceKey device_key, out IntPtr device);
Ändere ich den DeviceKey vor Aufruf der Funktion, kommt das nicht an.
Alles ist 0. Ändere ich den Key in der Funktion, kommt das aber raus,
heißt der Key ist geändert. Komisch,. C#-Beispiel:
DeviceKey key;
key._serial = 1234;
// debugge ich diese Funktion, ist key._serial 0 und nicht 1234
// innerhalb der Funktion wird key._serial auf 4321 gesetzt
GetDeviceKeyListEntry(0, out key);
/// key._serial ist jetzt 4321
C.