关于C#中P/Invoke带字符串结构体的传送问题
我想问一下,C#的P/Invoke的使用问题
目前我的情况是这样,想用C++ Native Code中的MAPI实现读取本机短信的功能,由C#做界面显示。
我用到了结构体的传递问题。
C++中是这样定义的:
typedef struct __ST_TEST_SMS__
{
int Oid; //联系人Oid
LPTSTR lpMsg; //短信内容
LPTSTR lpDate; //时间
} ST_TEST_SMS;
C#定义如下:
public struct SMSContent
{
public UInt32 Oid;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 128)]
public string lpMsg;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 16)]
public string lpDate;
};
并且我写了个接口函数,只是很简单的想先试试通过dll来改变结构体中的值,可一直不行~~~
C++的函数:
ST_TEST_SMS *g_stSMS;
int g_nSize;
int WINAPI XN_GetStruct(ST_TEST_SMS *pSMS)
{
/*
g_nSize = sizeof(ST_TEST_SMS);
memset(pSMS, 0x00, g_nSize);
pSMS.Oid = 1;
pSMS.lpMsg = _T("Message content.");
pSMS.lpDate = _T("2006-8-8 12:34:56");
*/
g_stSMS = pSMS;
g_nSize = sizeof(ST_TEST_SMS);
memset(g_stSMS, 0x00, g_nSize);
g_stSMS->Oid = 1;
g_stSMS->lpMsg = _T("dll content.");
g_stSMS->lpDate = _T("2006-8-8 12:34:56");
return 1;
}
C#:
[DllImport("dlltest.dll")]
static extern int XN_GetStruct(ref SMSContent stSMS);
SMSContent stSms = new SMSContent();
stSms.Oid = 100;
stSms.lpMsg = "Invoke content.";
stSms.lpDate = "2006-11-7";
XN_GetStruct(ref stSms);
MessageBox.Show(String.Format("{0}, {1}", stSms.Oid, stSms.lpMsg.ToString()));