使用 MAPI 发送中文短信时避免乱码的方法

此文章转载来自于:http://www.titilima.cn/show-532-1.html

 

这个有必要记录一下,在使用 MAPI 发送中文短信时,会发现所有的英文都很正常,但是中文却变成了 "?" 这样的乱码。在接收端用内存视图查看,会发现这个 "?" 是真正的问号字符,而不是乱码。
出现这个问题的原因是发送端未将短信属性设为 Unicode 格式,具体代码如下:

 

C++代码
// IMessage* pMessage;      MAPINAMEID idName;  
ZeroMemory(&idName,  sizeof (MAPINAMEID));   
idName.lpguid = (LPGUID)&PS_MAPI;  
idName.ulKind = MNID_STRING;  
idName.Kind.lpwstrName = L "SMS:Unicode" ;  
LPMAPINAMEID pidName = &idName;  
LPSPropTagArray pPropTag = NULL;   HRESULT  hr = pMessage->GetIDsFromNames(1, &pidName, MAPI_CREATE, &pPropTag); 

这样就获得了 Unicode 短信属性的 Tag,接下来就可以设置短信并发送了。

 

SPropValue props[5];  

ZeroMemory(&props,  sizeof (props));  

props[0].ulPropTag = PR_SUBJECT_W;  

props[0].Value.lpszW = L "你好,世界!" ;   

props[1].ulPropTag = PR_SENDER_EMAIL_ADDRESS;  

props[1].Value.lpszW = L "" ;  

props[2].ulPropTag = PR_MSG_STATUS;  

props[2].Value.ul = MSGSTATUS_RECTYPE_SMS;  

props[3].ulPropTag = PR_MESSAGE_FLAGS;   props[3].Value.ul = MSGFLAG_FROMME | MSGFLAG_UNSENT;   props[4].ulPropTag = CHANGE_PROP_TYPE(pPropTag[0].aulPropTag[0], PT_BOOLEAN);   props[4].Value.b = TRUE;   hr = pMessage->SetProps( sizeof (props) /  sizeof (props[0]), (LPSPropValue)&props, NULL);   hr = pMessage->SubmitMessage(0);

 

另外,值得一提的是,PS_MAPI 要自己定义一下了,如果找不到的话:

 GUID PS_MAPI = {0x00020328, 0, 0, 0xC0,0,0,0,0,0,0,0x46};

你可能感兴趣的:(html,C++,c,C#)