Hi,
I'm currently working on a project that dynamicaly load an unmanaged dll and use it. Everything works fine unless for a specific fonction that take a structure array as an argument. The function is supposed to fill the array with correct values, but after the method ends, all data in my struct are on their default value.
Here's the c++ struct:
Here's the c++ function declaration :Code:typedef struct { // Field Descriptor UINT16 iFldNum; // Field number (1..n) DBINAME szName; // Field name UINT16 iFldType; // Field type UINT16 iSubType; // Field subtype (if applicable) INT16 iUnits1; // Number of Chars, digits etc INT16 iUnits2; // Decimal places etc. UINT16 iOffset; // Offset in the record (computed) UINT16 iLen; // Length in bytes (computed) UINT16 iNullOffset; // For Null bits (computed) FLDVchk efldvVchk; // Field Has vcheck (computed) FLDRights efldrRights; // Field Rights (computed) BOOL16 bCalcField; // Is Calculated field (computed) UINT16 iUnUsed[2]; } FLDDesc; typedef FLDDesc far *pFLDDesc;
Here's my c# struct :Code:DBIResult DBIFN DbiGetFieldDescs ( // Get field descriptions hDBICur hCursor, // Cursor handle pFLDDesc pfldDesc // Array of field descriptors );
Here's my delegate :Code:[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack=1)] struct FLDDesc { // Field Descriptor public ushort iFldNum; // Field number (1..n) [MarshalAs(UnmanagedType.ByValArray, SizeConst = 32)] public char[] szName; // Field name public ushort iFldType; // Field type public ushort iSubType; // Field subtype (if applicable) public short iUnits1; // Number of Chars, digits etc public short iUnits2; // Decimal places etc. public ushort iOffset; // Offset in the record (computed) public ushort iLen; // Length in bytes (computed) public ushort iNullOffset; // For Null bits (computed) public FLDVchk efldvVchk; // Field Has vcheck (computed) public FLDRights efldrRights; // Field Rights (computed) public short bCalcField; // Is Calculated field (computed) [MarshalAs(UnmanagedType.ByValArray, SizeConst = 2)] public ushort[] iUnUsed; }
Here's how i call the dll method :Code:private delegate ushort DbiGetFieldDescs(IntPtr hCursor, FLDDesc[] pfldDesc);
If anyone have a clue, it would be really appreciatedCode:pFldDesc = new FLDDesc[curProps.iFields]; /*for (int i = 0; i < curProps.iFields; i++) pFldDesc[i] = new FLDDesc();*/ if (pFldDesc == null) { // Throw exception for DBIERR_NOMEMORY return null; } pProc = GetProcAddress(idapi, "DbiGetFieldDescs"); DbiGetFieldDescs dbiGetFieldDescs = (DbiGetFieldDescs)Marshal.GetDelegateForFunctionPointer(pProc, typeof(DbiGetFieldDescs)); dbiResult = dbiGetFieldDescs(m_hCursor, pFldDesc);
Thanks


Reply With Quote
