abc.h file
typedef struct sp_BankNoteTypeList { int cim_usNumOfNoteTypes; struct sp_notetype { USHORT cim_usNoteID; CHAR cim_cCurrencyID[3]; ULONG cim_ulValues; bool cim_bConfigured; }SP_CIMNOTETYPE[12]; }SP_CIMNOTETYPELIST,*SP_LPCIMNOTETYPELIST; BNA_API int BanknoteType(SP_CIMNOTETYPELIST *sp_BankNoteType);
abc.cpp (dll file)
int BanknoteType(SP_CIMNOTETYPELIST *sp_BankNoteType) { LPWFSCIMNOTETYPE fw_notetypedata; LPWFSCIMNOTETYPELIST lpNoteTypeList; //output param hResult = WFSGetInfo(hService, WFS_INF_CIM_BANKNOTE_TYPES, (LPVOID)NULL, 400000, &res); lpNoteTypeList=(LPWFSCIMNOTETYPELIST)res->lpBuffer; if(hResult!=0) { return (int)hResult; } sp_BankNoteType->cim_usNumOfNoteTypes = lpNoteTypeList->usNumOfNoteTypes; for(int i=0;i<lpNoteTypeList->usNumOfNoteTypes;i++) { sp_BankNoteType->SP_CIMNOTETYPE[i].cim_usNoteID = lpNoteTypeList->lppNoteTypes[i]->usNoteID; sp_BankNoteType->SP_CIMNOTETYPE[i].cim_ulValues = lpNoteTypeList->lppNoteTypes[i]->ulValues; sp_BankNoteType->SP_CIMNOTETYPE[i].cim_bConfigured = lpNoteTypeList->lppNoteTypes[i]->bConfigured; sp_BankNoteType->SP_CIMNOTETYPE[i].cim_cCurrencyID[0] = lpNoteTypeList->lppNoteTypes[i]->cCurrencyID[0]; sp_BankNoteType->SP_CIMNOTETYPE[i].cim_cCurrencyID[1] = lpNoteTypeList->lppNoteTypes[i]->cCurrencyID[1]; sp_BankNoteType->SP_CIMNOTETYPE[i].cim_cCurrencyID[2] = lpNoteTypeList->lppNoteTypes[i]->cCurrencyID[2]; } return (int)hResult; }
Structure: -
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct sp_notetype { public ushort cim_usNoteID; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 3)] public char[] cim_cCurrencyID; public ulong cim_ulValues; public bool cim_bConfigured; }; [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Auto)] public struct sp_BankNoteTypeList { public int cim_usNumOfNoteTypes; [MarshalAs(UnmanagedType.ByValArray, SizeConst = 12)] public sp_notetype[] SP_CIMNOTETYPE; }; public sp_notetype[] SP_CIMNOTETYPE; public sp_BankNoteTypeList SP_CIMNOTETYPELIST;
Function Call: -
[DllImport(@"abc.dll")] public static extern int BanknoteType(out sp_BankNoteTypeList SP_CIMNOTETYPELIST); public string BNA_BankNoteType(out int[] NoteID,out string[]CurrencyID,out string[] Values,out bool[] Configured) { NoteID = new int[12]; CurrencyID = new string[12]; Values = new string[12]; Configured = new bool[12]; try { trace.WriteToTrace(" Entered in BNA_BankNoteType ", 1); hResult = BanknoteType(out SP_CIMNOTETYPELIST); for (int i = 0; i < 12; i++) { NoteID[i] = (SP_CIMNOTETYPELIST.SP_CIMNOTETYPE[i].cim_usNoteID); CurrencyID[i] = (SP_CIMNOTETYPELIST.SP_CIMNOTETYPE[i].cim_cCurrencyID[0]).ToString() + (SP_CIMNOTETYPELIST.SP_CIMNOTETYPE[i].cim_cCurrencyID[1]).ToString() + (SP_CIMNOTETYPELIST.SP_CIMNOTETYPE[i].cim_cCurrencyID[2]).ToString(); Values[i] = (SP_CIMNOTETYPELIST.SP_CIMNOTETYPE[i].cim_ulValues).ToString(); Configured[i] = (SP_CIMNOTETYPELIST.SP_CIMNOTETYPE[i].cim_bConfigured); } return DicErrorCode(hResult.ToString()); } catch (Exception ex) { return "FATAL_ERROR"; }
when I try to call them in C #, I get the garbage value in C #. While I am debugging them, I find the correct storage of values. Any help on how the values should be conveyed would be very helpful. Thanks in advance.
c ++ pointers structure xfs cen-xfs
TechBrkTru
source share