I am having trouble getting a complex data type to get passed to a non-COM
dll's function by ref and return back data from that object. Simple data
types work fine but when I try the complex data types, with the class it
simply initializes but returns nothing. The struct I have tried several
different ways all of them either erros or the app simply closes out
(usually when I try to pass the struct with the ref keyword). Any help would
be appreciated.
//TRIP LOGS
[DllImport("NonCOM.dll")]
public static extern bool GetTripRecord (int index,DataTypes.TripRecord
record);
public static bool GetTripRecordA(int index,DataTypes.TripRecord record)
{
return GetTripRecord(index,record);
}
[DllImport("NonCOM.dll", EntryPoint="GetTripRecord")]
public static extern int GetNumTripRecs();
public static int GetNumTripRecs_()
{
return GetNumTripRecs();
}
DataTypes.TripRecord tripRecord=new DataTypes.TripRecord();
for(int q=0;q<ICarChip.GetNumTripRecsA();q++) //returns a rec count of
11
{
ICarChip.GetTripRecordA(q,tripRecord); //passing in class right now
x1 = tripRecord.startTime;
x2 = tripRecord.endTime;
x3 = tripRecord.tripDuration;
x4 = tripRecord.maxSpeed;
x5 = tripRecord.avgSpeed;
x6 = tripRecord.distance;
x7 = tripRecord.hardBrakeCount;
x8 = tripRecord.extremeBrakeCount;
x9 = tripRecord.hardAccelerationCount;
x10 = tripRecord.extremeAccelerationCount;
x11 = tripRecord.parameter;
x12 = tripRecord.samplingInterval;
x13 = tripRecord.parameterSupported;
x14 = tripRecord.speedThreshold;
x15 = tripRecord.hardBrakeThreshold;
x16 = tripRecord.extremeBrakeThreshold;
x17 = tripRecord.hardAccelerationThreshold;
x18 = tripRecord.extremeAccelerationThreshold;
x19 = tripRecord.disconnectedDuringTrip;
}
public class DataTypes
{
[StructLayout(LayoutKind.Sequential)]
public class TripRecord
{
public DateTime startTime;
public DateTime endTime;
public DateTime tripDuration;
public double maxSpeed;
public double avgSpeed;
public double distance;
public int hardBrakeCount;
public int extremeBrakeCount;
public int hardAccelerationCount;
public int extremeAccelerationCount;
public int parameter;
public int samplingInterval;
public bool parameterSupported;
public double speedThreshold;
public double hardBrakeThreshold;
public double extremeBrakeThreshold;
public double hardAccelerationThreshold;
public double extremeAccelerationThreshold;
public bool disconnectedDuringTrip;
}
[StructLayout(LayoutKind.Sequential)]
public struct DateTimeStruct
{
public int year;
public int month;
public int day;
public int hour;
public int minute;
public int second;
}
[StructLayout(LayoutKind.Sequential)]
public struct TripRecord_struct
{
public DateTimeStruct startTime;
public DateTimeStruct endTime;
public DateTimeStruct tripDuration;
public double maxSpeed;
public double avgSpeed;
public double distance;
public int hardBrakeCount;
public int extremeBrakeCount;
public int hardAccelerationCount;
public int extremeAccelerationCount;
[MarshalAs( UnmanagedType.ByValArray, SizeConst=5)]
public int[] parameter; /*!< int parameter[5] */
[MarshalAs( UnmanagedType.ByValArray, SizeConst=5)]
public int[] samplingInterval;
[MarshalAs( UnmanagedType.ByValArray, SizeConst=5)]
public bool[] parameterSupported; /*!< bool parameterSupported[5] */
[MarshalAs( UnmanagedType.ByValArray, SizeConst=3)]
public double[] speedThreshold; /*!< double speedThreshold[3] */
public double hardBrakeThreshold;
public double extremeBrakeThreshold;
public double hardAccelerationThreshold;
public double extremeAccelerationThreshold;
public bool disconnectedDuringTrip;
};
public DataTypes()
{
//
// TODO: Add constructor logic here
//
}
}