Hallo,
erstmal vielen Dank für eure ganzen letzten Tips. Hat gut weitergeholfen. Hab jetzt aber ein neues Problem:
Die API ist laut Header-Datei in C++ wiefolgt deklariert:
int i_PCI3001_ReadMoreAnalogInput (
unsigned char b_BoardHandle,
unsigned char b_SequenzArraySize,
unsigned char *pb_ChannelArray,
unsigned char *pb_GainArray,
unsigned char *pb_PolarityArray,
unsigned int ui_ConvertTiming,
unsigned char b_InterruptFlag,
unsigned int *pui_AnalogInputValueArray);
Wegen der Pointer sieht die Deklaration bei mir dann so aus:
[DllImport("PCI3001.DLL", EntryPoint = "i_PCI3001_ReadMoreAnalogInput")]
static public extern int i_PCI3001_ReadMoreAnalogInput(
byte b_BoardHandle,
byte b_SequenzArraySize,
IntPtr pb_ChannelArray,
IntPtr pb_GainArray,
IntPtr pb_PolarityArray,
uint ui_ConvertTiming,
byte b_InterruptFlag,
IntPtr pi_AnalogInputValueArray);
private byte [] ab_ChannelArray = new byte[16];
private byte [] ab_GainArray = new byte[16];
private byte [] ab_PolarityArray = new byte[16];
private long [] ai_AnalogInputValueArray = new long[16];
Die Anderen Werte sind uninteressant. Das Problem ist jetzt, wenn ich die Funktion aufrufe mit:
IntPtr pb_ChannelArray = Marshal.AllocHGlobal(16);
Marshal.Copy(ab_ChannelArray, 0, pb_ChannelArray, 16);
IntPtr pb_GainArray = Marshal.AllocHGlobal(16);
Marshal.Copy(ab_GainArray, 0, pb_GainArray, 16);
IntPtr pb_PolarityArray = Marshal.AllocHGlobal(16);
Marshal.Copy(ab_PolarityArray, 0, pb_PolarityArray, 16);
IntPtr pi_AnalogInputValueArray = Marshal.AllocHGlobal(16);
Marshal.Copy(ai_AnalogInputValueArray, 0, pi_AnalogInputValueArray, 16);
i_ReturnValue = i_PCI3001_ReadMoreAnalogInput(
b_BoardHandle,
b_SequenzArraySize,
pb_ChannelArray,
pb_GainArray,
pb_PolarityArray,
ui_ConvertTiming,
b_InterruptFlag,
pi_AnalogInputValueArray);
Marshal.Copy(pi_AnalogInputValueArray, ai_AnalogInputValueArray, 0, 16);
Marshal.FreeHGlobal(pi_AnalogInputValueArray);
Marshal.FreeHGlobal(pb_PolarityArray);
Marshal.FreeHGlobal(pb_GainArray);
Marshal.FreeHGlobal(pb_ChannelArray);
dann bringt er beim Starten keine Fehlermeldung, jedoch wenn ich die Funktion aufrufe stürzt er ab. Genauer gesagt ist es nicht mal die API selber, sondern das letzte Marshalling:
IntPtr pi_AnalogInputValueArray = Marshal.AllocHGlobal(16);
Marshal.Copy(ai_AnalogInputValueArray, 0, pi_AnalogInputValueArray, 16);
Hoffe mal es kann mir jemand helfen. Hab Spaßenshalber mal probiert ai_AnalogInputValueArray als byte [] zu deklarieren und das hat funktioniert. Ich brauche dort aber dringend die 8 byte vom long.
MFG und schon mal vielen Dank
Masquerader
Ok, Problem gelöst...
Hatte irgendwie Mist gebaut... Wenn 1 long = 8 byte dann sollte 16 long auch 128 bytes und nicht 16 bytes sein...
Also:
IntPtr pi_AnalogInputValueArray = Marshal.AllocHGlobal(128);
Marshal.Copy(ai_AnalogInputValueArray, 0, pi_AnalogInputValueArray, 16);
Trotzdem danke
Masque