使用Java的MAPI-为PWSTR传递什么数据类型?

使用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时,它只在邮件中显示垃圾。 当我尝试先从字符串中获取字节,然后发送新

我想在Java中使用MAPISendMailW。该函数需要我在Java代码中定义的MapiMessageW结构。来自文档的C++代码看起来像这样():

PWSTR定义为指向16位Unicode字符字符串()的指针

我想要传递的字符串,例如lpszSubject包含Unicode字符-例如String myString=“带ač的句子”。据我所知,Java使用UTF-16表示字符串。但是当我试图像传递字符串那样传递myString时,它只在邮件中显示垃圾。 当我尝试先从字符串中获取字节,然后发送新字符串(subjectBytes,“UTF-16”)时,也会发生同样的情况

在java端传递PWSTR值的正确数据类型是什么

编辑:根据注释中的要求-jave代码

这是我定义MapiMessageW的地方:

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();