I am new to C#/.net programming.
I am marshaling the following C# struct from WPF code to a C++ class in an unmanaged C++ dll.
[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
public struct CallbackParams
{
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string displayName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string userName;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string sipIdentity;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string sipProxyAddress;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string password;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string sipurl;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 80)]
public string calleeURI;
[MarshalAs(UnmanagedType.U4)]
public UInt32 releaseCallId;
[MarshalAs(UnmanagedType.U4)]
public UInt32 answerCallId;
[MarshalAs(UnmanagedType.U4)]
public UInt32 answerCode;
[MarshalAs(UnmanagedType.U4)]
public UInt32 timeout;
[MarshalAs(UnmanagedType.U4)]
public UInt32 rate_percent;
}
The C++ class looks like this
typedef struct CallbackParams_s {
char displayName[80];
char userName[80];
char sipIdentity[80];
char sipProxyAddress[80];
char password[80];
char sipurl[80];
char calleeURI[80];
unsigned int releaseCallId;
unsigned int answerCallId;
unsigned int answerCode;
unsigned int timeout;
unsigned int rate_percent;
} CallbackParams;
In the C# code
public CallbackParams cb;
public int code;
[DllImport("XXXDll.dll", CharSet = CharSet.Ansi, CallingConvention = CallingConvention.Cdecl)]
public static extern int DLLCBFunc1([MarshalAs(UnmanagedType.I4)] int someCode, ref CallbackParams cbParams);
cb.displayName = "XYZ";
... ...
... ...
...Init other fields in struct ....
...
cb.calleeURI = "ABC";
code = 0;
DLLCBFunc1(code, ref cb);
In the above call the cb struct is marshalled correctly to the unmanaged dll. Now,
cb.calleeURI = "DEF";
code = 1;
DLLCBFunc1(code, ref cb);
When the DLLCBFunc1 is called again, the code parameter is marshalled correctly in the unmanaged dll but cb.calleeURI is still set to the earlier "ABC" than "DEF".
What am I missing?
Appreciate your help.
EDIT:
Edited to provide more code
C++ code
Class MyClass {
...
...
public:
void SetCBParams(CallbackParams *cb) { cbParams = cb };
private:
CallbackParams *cbParams;
}
MyClass *m_class;
extern "C" __declspec(dllexport) int DLLCBFunc1(int code, CallbackParams *cb)
{
if(code == 0) {
m_class = new MyClass;
}
m_class->setCBParams(cb);
....
..call some func ...
}