关于C#中P/Invoke带字符串结构体的传送问题

boymaster boymaster 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
我想问一下,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()));
...全文
评论
收藏 已收藏
分享
返回顶部
boymaster
Windows客户端开发 7,655 成员 18,839 内容