ももらぼっ!にっき


2006年03月23日

_ [WM5][W-ZERO3] MailSyncMessagesを使うには。

Windows Mobile 5.0から追加された「MailSyncMessages」というAPIを見つけた。MSDNによると

The MailSyncMessages function synchronizes the messages for the specified account.

とこのことなので、 多分、指定したアカウントのメッセージの送受信ができると思われる。

ということで早速以下のようなコードを書いて試してみた。

#include "stdafx.h"
#include "cemapi.h"

int WINAPI WinMain(HINSTANCE hInstance,
                   HINSTANCE hPrevInstance,
                   LPTSTR    lpCmdLine,
                   int       nCmdShow)
{
    MailSyncMessages(_T("070xxxxxxxx"), MCF_ACCOUNT_IS_NAME);

    return 0;
}

ビルドしてみると、以下のようなエラーが出てしまう。

error LNK2019: 未解決の外部シンボル "long __cdecl MailSyncMessages(wchar_t const *,unsigned long)"
(?MailSyncMessages@@YAJPB_WK@Z) が関数 WinMain で参照されました。

ちゃんと、cemapi.libはリンクしているのにもかかわらずだ。

いろいろ調べてみると*1同じような現象に遭っている人*2を見つけた。 この人がやっているようにdumpbinを使ってみると、見事に同じ件であることが判明した。

C:\...\Lib\ARMV4I>dumpbin.exe /exports cemapi.lib | grep MailSyncMessages
                  ?MailSyncMessages@@YAJPBGK@Z (long __cdecl MailSyncMessages(unsigned short const *,unsigned long))
C:\...\Lib\ARMV4I>

結局よくわかってないんだけど、ビルドする際のwchar_tの扱いの問題だったようだ。「プロジェクト」→「xxx のプロパティ...」から「構成プロパティ」→「C/C++」→「言語」の「wchar_tをビルドイン型として扱う」を「いいえ (/Zc:wchar_t-)」にすると無事にビルドされた。

さて、実際にMailSyncMessagesを呼ぶとどうなるかというと、以下のような動作をするようだ。

  1. 「メール(tmail)」を起動し、
  2. 指定したアカウントの「受信トレイ」をアクティブにし、
  3. 「送受信」相当の動作をする。

tmail側の動作は非同期で行われるようで、送受信が終了する前に、MailSyncMessagesの処理は返ってきていた。

SandRでレジストリを書き換える代わりにこいつを呼んでやると、他のアカウントの送受信もできるようになる。 しかし、tmailから「送受信」をしたタイミングでPHSの接続をした場合には切断はやってくれないのは変わらなかった。 PDXメールの送受信に限って言えばレジストリ書き換え方式の方が有用だろう。

*1  なんて軽く書いているが、この調査に1ヶ月程度はかかっている

*2  Jan 13の「Debugging adventure」のところね

_ [WM5][W-ZERO3] .Net Compact Framework 2.0メモ

Windows Mobile 5.0用のインストーラの作成方法がわからなくて、zipでの提供のみをしていたんですが、インストーラの作成方法を解説しているサイトを見つけました。

一時期MIDPなアプリを作ろうとして参考にしていたん・ぱか工房さんところではないですかorz

次回リリースするときから、CABでの配布もするようにしてみようと思います。

さらに、「WILLCOM 携帯アプリプログラミングブック〜WS003SH-WX310SA-WX310J 対応」なんて本も出されているようで。 一度見てみますか。