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("NonC OM.dll")]
public static extern bool GetTripRecord (int index,DataTypes .TripRecord
record);
public static bool GetTripRecordA( int index,DataTypes .TripRecord record)
{
return GetTripRecord(i ndex,record);
}
[DllImport("NonC OM.dll", EntryPoint="Get TripRecord")]
public static extern int GetNumTripRecs( );
public static int GetNumTripRecs_ ()
{
return GetNumTripRecs( );
}
DataTypes.TripR ecord tripRecord=new DataTypes.TripR ecord();
for(int q=0;q<ICarChip. GetNumTripRecsA ();q++) //returns a rec count of
11
{
ICarChip.GetTri pRecordA(q,trip Record); //passing in class right now
x1 = tripRecord.star tTime;
x2 = tripRecord.endT ime;
x3 = tripRecord.trip Duration;
x4 = tripRecord.maxS peed;
x5 = tripRecord.avgS peed;
x6 = tripRecord.dist ance;
x7 = tripRecord.hard BrakeCount;
x8 = tripRecord.extr emeBrakeCount;
x9 = tripRecord.hard AccelerationCou nt;
x10 = tripRecord.extr emeAcceleration Count;
x11 = tripRecord.para meter;
x12 = tripRecord.samp lingInterval;
x13 = tripRecord.para meterSupported;
x14 = tripRecord.spee dThreshold;
x15 = tripRecord.hard BrakeThreshold;
x16 = tripRecord.extr emeBrakeThresho ld;
x17 = tripRecord.hard AccelerationThr eshold;
x18 = tripRecord.extr emeAcceleration Threshold;
x19 = tripRecord.disc onnectedDuringT rip;
}
public class DataTypes
{
[StructLayout(La youtKind.Sequen tial)]
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 extremeBrakeCou nt;
public int hardAcceleratio nCount;
public int extremeAccelera tionCount;
public int parameter;
public int samplingInterva l;
public bool parameterSuppor ted;
public double speedThreshold;
public double hardBrakeThresh old;
public double extremeBrakeThr eshold;
public double hardAcceleratio nThreshold;
public double extremeAccelera tionThreshold;
public bool disconnectedDur ingTrip;
}
[StructLayout(La youtKind.Sequen tial)]
public struct DateTimeStruct
{
public int year;
public int month;
public int day;
public int hour;
public int minute;
public int second;
}
[StructLayout(La youtKind.Sequen tial)]
public struct TripRecord_stru ct
{
public DateTimeStruct startTime;
public DateTimeStruct endTime;
public DateTimeStruct tripDuration;
public double maxSpeed;
public double avgSpeed;
public double distance;
public int hardBrakeCount;
public int extremeBrakeCou nt;
public int hardAcceleratio nCount;
public int extremeAccelera tionCount;
[MarshalAs( UnmanagedType.B yValArray, SizeConst=5)]
public int[] parameter; /*!< int parameter[5] */
[MarshalAs( UnmanagedType.B yValArray, SizeConst=5)]
public int[] samplingInterva l;
[MarshalAs( UnmanagedType.B yValArray, SizeConst=5)]
public bool[] parameterSuppor ted; /*!< bool parameterSuppor ted[5] */
[MarshalAs( UnmanagedType.B yValArray, SizeConst=3)]
public double[] speedThreshold; /*!< double speedThreshold[3] */
public double hardBrakeThresh old;
public double extremeBrakeThr eshold;
public double hardAcceleratio nThreshold;
public double extremeAccelera tionThreshold;
public bool disconnectedDur ingTrip;
};
public DataTypes()
{
//
// TODO: Add constructor logic here
//
}
}