Laden...

und wieder mal API-Probleme

Erstellt von Masquerader vor 18 Jahren Letzter Beitrag vor 18 Jahren 1.148 Views
M
Masquerader Themenstarter:in
31 Beiträge seit 2005
vor 18 Jahren
und wieder mal API-Probleme

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

M
Masquerader Themenstarter:in
31 Beiträge seit 2005
vor 18 Jahren

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