使用Java的MAPI-为PWSTR传递什么数据类型?
我想在Java中使用MAPISendMailW。该函数需要我在Java代码中定义的MapiMessageW结构。来自文档的C++代码看起来像这样(): PWSTR定义为指向16位Unicode字符字符串()的指针 我想要传递的字符串,例如lpszSubject包含Unicode字符-例如String myString=“带ač的句子”。据我所知,Java使用UTF-16表示字符串。但是当我试图像传递字符串那样传递myString时,它只在邮件中显示垃圾。 当我尝试先从字符串中获取字节,然后发送新字符串(subjectBytes,“UTF-16”)时,也会发生同样的情况 在java端传递PWSTR值的正确数据类型是什么 编辑:根据注释中的要求-jave代码 这是我定义MapiMessageW的地方:使用Java的MAPI-为PWSTR传递什么数据类型?,java,c++,unicode,utf,mapi,Java,C++,Unicode,Utf,Mapi,我想在Java中使用MAPISendMailW。该函数需要我在Java代码中定义的MapiMessageW结构。来自文档的C++代码看起来像这样(): PWSTR定义为指向16位Unicode字符字符串()的指针 我想要传递的字符串,例如lpszSubject包含Unicode字符-例如String myString=“带ač的句子”。据我所知,Java使用UTF-16表示字符串。但是当我试图像传递字符串那样传递myString时,它只在邮件中显示垃圾。 当我尝试先从字符串中获取字节,然后发送新
class MapiMessageW extends Structure {
public NativeLong ulReserved;
public String lpszSubject;
public String lpszNoteText;
public String lpszMessageType;
public String lpszDateReceived;
public String lpszConversationID;
public NativeLong flFlags;
public Pointer lpOriginator;
public NativeLong nRecipCount;
public MapiRecipDescWs lpRecips;
public NativeLong nFileCount;
public MapiFileDescWs lpFiles;
[...]
}
在此处填充值-getSubject()和getBody()都返回一个字符串:
MapiMessageW message = new MapiMessageW();
message.lpszSubject = new String(email.getSubject());
message.lpszNoteText = new String(email.getBody());
message.nRecipCount = new NativeLong(recipDescs.size());
message.lpRecips = new MapiRecipDescWs(recipDescs);
message.nFileCount = new NativeLong(fileDescs.size());
message.lpFiles = new MapiFileDescWs(fileDescs);
在此处调用MapiSendMailW,并将消息作为参数:
rc = Mapi32W.INSTANCE.MAPISendMailW(sessionPtr.getValue(), null, message,
new NativeLong(Mapi32W.MAPI_DIALOG | Mapi32W.MAPI_LOGON_UI), null).longValue();
PWSTR
是一个wchar\u t*
,其中wchar\u t
在Windows(UTF-16)上是2个字节。因为Java字符串使用UTF-16,所以根本不需要转换。只需按原样使用Java字符串数据。如果有问题,一定是数据传递不正确。请将您的问题显示为实际的Java代码。谢谢您的回复-我在帖子中添加了Java代码。。。因此,我将主题和正文作为字符串发送,但当邮件打开时,我通常会看到问题标记swin32的ULONG
大小为4字节,而Java的Long
大小为8字节。另外,将新字符串
与字符串
输入一起使用是多余的。问号通常意味着字符集编码问题。@RemyLebeau“问号通常意味着字符集编码问题”-我不确定我是否理解正确;如果我的Java字符串是UTF-16编码的,并且可以按原样传递给PWSTR,那么这里的编码问题可能是什么?首先,修复您的ULONG
问题。您很可能向MapiSendMailW()
传递了一个错误的结构,由于字段偏移量不匹配,导致它看到无效的PWSTR
指针。在此之后,任何剩余的编码问题都不会出现在您这边,当它对电子邮件进行编码时,它将位于MailSendMailW()
本身内部。如果它使用的字符集无法处理您试图发送的Unicode字符,则可能会导致问号。调用MapiSendMailW()
时,请尝试指定MAPI\u FORCE\u UNICODE
标志。
rc = Mapi32W.INSTANCE.MAPISendMailW(sessionPtr.getValue(), null, message,
new NativeLong(Mapi32W.MAPI_DIALOG | Mapi32W.MAPI_LOGON_UI), null).longValue();