Passing complex data structure to non-COM DLL function.

A

aaa

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
//
}
}
 
M

Mattias Sjögren

You have to show us the original native type declaration, without it
it's hard to know if you've made any conversion errors.



Mattias
 
A

aaa

Sorry:

---orig function def----------
bool GetTripRecord ( int index,
TripRecord * record
)

Retrieve a downloaded trip record.


Parameters:
index - trip index 0 - first trip
record - see Structures.h

Return values:
true if record was successfully retrieved

---Public Attributes----
DateTimeStruct startTime
DateTimeStruct endTime
DateTimeStruct tripDuration
double maxSpeed
double avgSpeed
double distance
int hardBrakeCount
int extremeBrakeCount
int hardAccelerationCount
int extremeAccelerationCount
int parameter [5]
int samplingInterval [5]
bool parameterSupported [5]
double speedThreshold [3]
double hardBrakeThreshold
double extremeBrakeThreshold
double hardAccelerationThreshold
double extremeAccelerationThreshold
bool disconnectedDuringTrip
 
M

Mattias Sjögren

Well the TripRecord_struct structure looks more or less correct. You
may have to specify [MarshalAs(UnmanagedType.I1)] on the bool members
though.

And you should pass this as a ref parameter to the function. That
doesn't work?




Mattias
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top