ももらぼっ!にっき


2006年05月02日 [長年日記]

_ [W-ZERO3][WM5] IMailSyncHandlerを使ったメールの受信。

掲示板でと言ったきり、ずーっとほっぽっていたのですが。 ちょこちょこと調べながらやってみたところ、IMailSyncHandlerを使ったメールの受信に成功したっぽいです。

まぁ、詳細は後述のサンプルソースを見てもらうとして。

そもそも、IMailSyncHandlerってのはMAPIのメールの送受信部分(とか)を請け負うインターフェースのようです。 POP3とかIMAPとかのプロトコルの実装は(多分)このインターフェースを実装したdllで実現してます。 「HKLM\SOFTWARE\Microsoft\Inbox\Svc\IMAP4\DLL」とか「HKLM\SOFTWARE\Microsoft\Inbox\Svc\POP3\DLL」に書かれている「mailtrns.dll」でもこのIMailSyncHandlerの実装を持っています。

で、そのDLLには、IMailSyncHandlerを生成する関数「OneStopFactory」が必ず含まれていますので、その関数をLoadLibrary&GetProcAddressして取得します。

取得したIMailSyncHandlerではまず、Initializeメンバ関数を呼んであげます。で、その前に、IMailSyncCallBackとIMsgStoreが必要ですのでそれを用意します。 IMailSyncCallBackはIMailSyncHandlerで行われた操作の状態を取得するコールバック用インターフェースで*1、これを実装したクラスを作成し、そのインスタンスを用意すればOKです。 IMsgStoreは送受信したいアカウントのIMsgStoreをIMAPISession.GetMsgStoresTableあたりから取ってくればOKです。

んで、後はこのIMailSyncHandlerをごにょごにょすればOKのようです。

ということで試したときのサンプルです。 IMsgStoreを取るところは、今まで作ってきたMAPI.cpp/hをそのまま使っています。 実装を見たい方は、いぬそふとからソースをダウンロードしてくださいな。

//IMailSyncCallBackの実装…空っぽだけど。
class CMailSyncCallBack : public IMailSyncCallBack
{
  HRESULT QueryInterface(REFIID, void **){return S_OK;};
  ULONG AddRef(void){return 0;};
  ULONG Release(void){return 0;};

  HRESULT RequestSync(LPCWSTR, DWORD, LPBYTE){return S_OK;};
  HRESULT Progress(LPCWSTR, SYNCPROGRESSITEM*){return S_OK;};
  HRESULT GetGlobalSetting(LPCWSTR, LPSPropValue){return S_OK;};
  HRESULT LogEvent(TRANSPORTEVENT*){return S_OK;};
  UINT DisplayMessageBox(LPCWSTR, LPCWSTR, LPCWSTR, UINT){return 0;};
  HRESULT RequestCredentials(LPCWSTR, SYNCCREDENTIALS*, SYNCCREDENTIALS**){return S_OK;};
  HRESULT AllocateMem(DWORD, LPBYTE*){return S_OK;};
  HRESULT FreeMem(LPVOID){return S_OK;};
};

void sample(void)
{
  IMailSyncHandler *plHandler = NULL;
  MAPI::CMAPI mapi;
  MAPI::CSession session;
  CMailSyncCallBack callback;
  HRESULT hr = 0;

  //OneStopFactory関数を取得
  HINSTANCE hDll = LoadLibrary(_T("mailtrns.dll"));
  if (!hDll) return;

  ONESTOPFACTORYFUNC pOneStopFactory = (ONESTOPFACTORYFUNC) GetProcAddress(hDll, _T("OneStopFactory"));
  if (!pOneStopFactory) goto EXIT_FUNC;

  //POP3のIMailSyncHandlerを取得
  hr = pOneStopFactory(_T("POP3"), &plHandler);
  if (FAILED(hr)) goto EXIT_FUNC;

  //IMailSyncHandler.Initializeを呼ぶ
  MAPI::CMsgStore &msgStore = session.GetAccount(_T("あかうんと"));
  LPMDB pMsgStore = msgStore.GetLPMDB();
  hr = plHandler->Initialize(&callback, _T("あかうんと"), pMsgStore);
  if (FAILED(hr)) goto EXIT_FUNC;

  //IMailSyncHandler.Connectを呼ぶ
  //このタイミングで「ログイン...」相当が行われているっぽい。
  SYNCCREDENTIALS sc;
  ZeroMemory(&sc, sizeof(SYNCCREDENTIALS));
  sc.cbSize = sizeof(SYNCCREDENTIALS);
  sc.pszUsername = _T("ゆーざめい");
  sc.pszPassword = _T("ぱすわーど");
  sc.pszDomain = _T("どめいん");
  hr = plHandler->Connect(0, &sc);
  if (FAILED(hr)) goto EXIT_FUNC;

  //IMailSyncHandler.Synchronizeを呼ぶ
  //このタイミングでメールが受信されている。
  MAILSYNCREQUEST msr;
  ZeroMemory(&msr, sizeof(MAILSYNCREQUEST));
  msr.cbSize = sizeof(MAILSYNCREQUEST);
  msr.ffFlags = SYNC_NORMAL;
  hr = plHandler->Synchronize(&msr);
  if (FAILED(hr)) goto EXIT_FUNC;

  //IMailSyncHandler.Disconnectを呼ぶ
  //「ログオフ...」相当をやっているのかな。
  hr = plHandler->Disconnect(0);

EXIT_FUNC:
  if (plHandler) plHandler->ShutDown(0);
  if (hDll) FreeLibrary(hDll);
}

*1  多分ね。まだ試してないので…

_ [WM5][W-ZERO3] で、IMailSyncHandlerを使うと何が嬉しいの?

画面制御を完全に自分でコントロール可能になると思われます。

今のSandRでは、PDXメールを送受信するときは邪魔なバルーンが毎回出てきちゃいます。 その他のアカウントのメールだとメールソフトが起動しちゃいます。

それが、この方法を使うと、完全に裏で処理をすることが可能になりそうです。(いや、まだちゃんと試してないのですよ)

また、これまたあんまり試してないですけど、IMailSyncCallBackで細かい状況の取得ができそうですので、邪魔にならないようにそれを表示させることもできるかもしれません。

ということで、SandRとSendNowはこの手法を使った方式に切り替えていこうかなーと思っています。

あ、でも。 送受信するときにアカウント名&パスワードが必要になっちゃうんですよね。 PDXメールだけを使っている人には敷居が高くなっちゃうかもなので、今まで通りの方式で送受信する方法も残しておきたいとは思っています。

で、ここまで書いて思ったんですけど。

ここで知った技術をベースに、mailtrns.dllをラップしたdllを作って置き換えれば、メールが受信されるタイミングを正確に取れる気がします。 tmail.exeの置き換えで実現しているtmail_qmail3をもっと違った実装で実現したり、 メールの着信鳴り分けを実現したりできるかもしれません。

思っただけなので私が実装する可能性はものすごく低いんですがorz 技術共有はするので誰か作ってくれないかなー。


2006年05月11日 [長年日記]

_ [W-ZERO3] ウィルコムファン W-ZERO3にウチのソフトが掲載されるってさ。

ウィルコムファンの中の人からメールを頂いちゃいました。

kickmailとSandRを、近々ウィルコムファンで紹介していただけるそうです。

wktkしながら待つことにします。

_ [W-ZERO3] PDA Try&ErrorでExecMultiを紹介していただきました。

ExecMultiの解説をしていただいています

具体的なiniファイルの設定例をあげてくださっているので、使い方がわからない〜って人は見てみていただけるとよいかと。

…あー。 忘れててたわけじゃ全然ないんですが、 頂いたアイコンを取り込んだ版を公開しないとですねー。


2006年05月12日 [長年日記]

_ [W-ZERO3] 起動と同時に標準メールの「受信済みアイテム」画面を表示/kickmail

昨日「近日公開」って言ったばっかりなのに、早速公開されています。

…ってか、中の人からメールが届いた後すぐにネタを書かないからこーゆーことになるんですよ(T-T)

で、この紹介を見て気づいたんですが、kickmailってCABでの公開をまだしてなかったんですねぇ。。。 Seasarカンファレンスが終わって気持ちが落ち着いたら、CAB版の公開をしたいと思います。 しばしお待ちを…。

_ [WM5][W-ZERO3] 軽いスケジューラを開発中…?

WM5用のスケジューラを開発中だそうです。

起動が早いってのはものすごくうれしいところなので、めいっぱい期待しています。

…が、

1ヶ月最大500件の予定迄など制限有りと低機能かつ制限が付く

と書かれているので、標準のPIMデータを使ってるわけではなさそうですね…。 標準のデータと同期されないのは個人的にはちょっと辛いなぁ。

なんにせよこれまたwktkしながら待ってみましょう。

_ [W-ZERO3] W-ZERO3をしまうとき

3つのことを必ずやっているようです。

そんなときこそ拙作ExecMultiですよ。 もうすでにその操作に慣れているそうなのでそのままでもいいのかもしれませんが、ぜひ導入を検討してみてください。

縦横長押しの画面ロックと同等の機能を持つユーティリティは現時点では無いようなのでExecMultiで統合することはできませんが、 全アプリ終了&通信終了まではワンキーでできるようになりますよ。

本日のツッコミ(全2件) [ツッコミを入れる]

_ kzou [トラバどうもです! POOMを使っているので標準の予定との同期もOKですよ(^^)]

_ ももたろ [kzouさん> おぉ。それなら完璧です! もっとwktkしながら待ってます♪]


2006年05月14日 [長年日記]

_ [Seasar] 今からカンファレンス会場に向かいます。

いよいよ、今日の13:00から、右上にアイコンを出していたSeasar Conference 2006 Springが始まります。

準備があるので、今から会場に向かいます。

多くの方にきていただけることをwktkしながら待っています。

…最近、wktkしてばかりのようです(^-^;;


2006年05月16日 [長年日記]

_ [Seasar] Seasar Conference 2006 Spring 無事終わりました。

うまく文章にできないので、箇条書きで雑感を。

青い服多いよ!

当日、スタッフは青いTシャツでそろえていったのですが、 改めてみるとたくさんのスタッフがいたようですねー。 懇親会のときは、どこに行っても青い服がいました(^^;;

スタッフさん方、ホントお疲れ様でした。

特に私と一緒に受付周りをやってくださった皆様。 ほとんど受付に貼り付けになっちゃったので、何もできなかったのではないでしょうか。

段取り不足で申し訳ない…。

そんな私もずっと受付に…。

そんな状態だったので、ブースやセッションにはほとんど顔を出せずじまい。 一番聞きたかったセッションが、受付が落ち着いた時点で既に終わっていたという…(T-T)

印刷されたスライドを見ながら聴いた気分になってみます。

あらそんな。MVPだなんて。

はぶさんに「MVP」と呼ばれてしまいました。 びっくりです。

でも全然そんなことはなくて。

同じ受付でいろいろとサポートしてくれた高橋会長を始め、皆さんがいたから、いろいろと好き勝手に立ち回れたんですけどね。 にしても、何かの長をしている人はすごいな〜とか思った瞬間でもありました。

マーケチームになっちゃいました。

そんなこんなで当日裏方で走り回っていたら、「マーケチームやらない?」と声をかけていただいて。 なかなかないチャンスなのとお酒飲んでたのとで「やります〜。よろひくお願いひまふ〜」と答えてしまいました。

やるからには頑張りますよー。

本日のツッコミ(全2件) [ツッコミを入れる]

_ kusumoto [いっしょに受付をしたkusumotoです。 大変お世話になりました。 結局午後からは好き勝手やっててすみませんでし..]

_ ももたろ [kusumotoさん> お疲れ様でしたー。 こちらこそ皆さんをこき使ってしまってすいませんでした。 なんにせよ、楽し..]


2006年05月19日 [長年日記]

_ [tDiary] ツッコミスパム。

…が、また大量に来てしまいました。 RSSでウチのサイトをチェックしてくれている人は大量のフィードが流れちゃったかと思います。 すいませんm(_ _)m

ということで、ウチのツッコミはURL不可ってことにしちゃいました。 URLを書き込みたい人は適宜ttpとかに変換してくれると嬉しいです。

…まぁ、ttpをリンクに変えたりとかはしてませんけどorz

さて、いい加減ウチの掲示板のスパムをどうにかしないとなぁ。 Perlで実装されているんだけど、ソースが読みにくくてハックできてないのですよ…(T-T)


2006年05月21日 [長年日記]

_ Let's note CF-W5

買っちゃいました。

今まで使っていたdynabook SS SXの調子が悪く、この間リカバリを試みたんだけど。 ハードディスクが逝っちゃったみたいで、修復不可能な状態になっちゃってました…。 で、いつまでも使えないPCと心中していてもしょうがないので、勢いで買っちゃいました。

で。そんなW5の話はさておき問題が。

今までメインだったノートPCのハードディスクが逝っちゃったってことは、今までの資産たちも無くなっちゃったってことです。 前回バックアップを取ったのなんて数年前だし(ダメじゃん)。 なので、今まで公開してきたソフトのリソースが手元に無くなっちゃったわけですよ。

そこで気付いたんですが、自分のソフトってソースを公開してるのでそこから復旧可能だったんですよね。ソースまで公開していることに自分で感謝しちゃいました。 作りかけてて公開していないソースの復元はできないけど、そんなのはほとんどないし。

ということで、ソフトを公開している皆さんも、ハードディスクが壊れる前にソースを公開した方がいいですよ、というお話でした。

本日のツッコミ(全2件) [ツッコミを入れる]

_ 藤代千尋 [バックアップ取りすぎて、どれが最新が分からなくなったりしてます。(^^;)]

_ ももたろ [バックアップ取らない私よりよっぽど健全です(^^;; CF-W5にはコンボドライブがついてるので、 今度こそDVD..]


2006年05月24日 [長年日記]

_ きびだんご掲示版。

イヤになるほどスパムが届くので、久々にPerlを読んでquickhackしてみました。

あー。Perl読みにくい! …っていうか、この掲示板CGIが特に読みにくいのかもしれませんけど。

http://は全てはじいてしまったので、リンクを含む投稿をしたい場合は、頭のhを取って、ttp://としてください。 自動でhttp://に変換するようになっています。


2006年05月28日 [長年日記]

_ [WM5][W-ZERO3] ExecDouble Ver.0.10 リリース。

W-ZERO3用ソフトウェア第7弾で、Execシリーズ第3弾です。

今度は、起動する回数によって異なるアプリを実行できるツールを作りました。

詳細はExecDoubleのページを見てもらうとして、こんな用途に使用できます。

  • ハードキーを一回押したらディスプレイをオフに、二回押したらさらにサスペンドを行う。(添付のサンプルではAppCloseを使ってこの機能を実現するようにしています。)
  • ハードキーをダブルクリックしたときのアプリケーションを指定できる。

私は、シャッターボタンでディスプレイオフをするようにしていて、 それで困ったことはあまりなかったんですが、よくよく考えてみたら、 ディスプレイオフなだけだと結構バッテリー食うんですよね。 なので、しばらく使わないときはサスペンドするようにしたかったんですが、 これ以上空いているハードキーがない…。 そんな不満を解消するために作りました。

一度お試しあれ。


2006年05月29日 [長年日記]

_ [WM5][W-ZERO3] ExecDouble Ver.0.11 リリース。

昨日公開したExecDoubleのReadMeに記述漏れがあったのと、 実害はないと思うけどちょっと気になる問題があったので修正しました。

修正点は以下の通り。

  • ReadMeにコマンドラインパラメータのことを追記。
  • 最後のセクションでmodeとintervalの指定があった場合にも、 待機をしてしまっていたのを修正。 最後のセクションならexecのアプリを起動し、すぐに終了するようにした。

2006年05月30日 [長年日記]

_ [WM5][W-ZERO3] 明日はMEDCWMDCOM

ということで、明日は有休を取ってイベントに行ってきます。

WindowsMobileの開発系セミナーなので、その辺の技術動向を知りにいくのはもちろんなのですが、秋のSeasar Conferenceに向けて、イベントの運営ノウハウについてもネタを仕入れて来られたらよいなーとか思っています。 お金のあるところとないところの差はあるので、どこまでノウハウを活用できるかは微妙かもしれませんけどね(T-T)

ということで、ここを見ている人で明日会える人がいるかもしれませんね。…いないかな…。 私は多分Let'sNote片手にうろちょろしていると思いますので、見かけたら声をかけてみてくださいませ。


2006年05月31日 [長年日記]

_ [WM5] クリップボードの監視。

ふと思い立って、W-ZERO3でクリップボードの監視ができないか調べてみたんだけど。 Windows CEにはクリップボード監視用のAPIであるSetClipboardViewerが存在しないみたいね。 適当な間隔でSetTimerして、その中でGetClipboardDataとかして前回値と比較して内容が変わっているかチェックする…なんて効率の悪い方法しか思いつかない。

いくつか、WindowsCE上でクリップボードの監視機能を実現しているソフトがあるんだけど、これらはどうやって実現しているんだろう。 気になるところです。

_ w-zero3@momo-lab.netがついにスパム屋に収集されちゃいました。

きびだんご掲示板でWMFのテストをするために作成したアドレスで、一度&つまっちさんが一度このアドレスにメールくれただけ、というほとんどどこにも公開していないアドレスだったんですが。 こんな小さなサイトの掲示板のたったひとつの投稿までbot君はメールを収集しに来るんですねぇ。

びっくりです。

あ。もうこのアドレスは使えなくしたので、スパム送っても無駄ですよー。>スパム業者さん

_ [WM5][W-ZERO3] MEDCに来ています。

Windows CE 6 Beataインストールちう。

「Windows CE 6 Beta」のDVDをもらえたので、早速持参したCF-W5にインストールしています。 会場で何やってるんだか。私。

うわ。インストール中にセッション始まっちゃったよ…。 DVDの回転音がうるさい…。

…とか書いているうちにインストール終了。 ハンズオンセッションを聞きつつ同じことを、自分のPCでもやってみよう。

Windows CE 6のPlatform Builderを試す。

「次期バージョンWindows CEとPlatform Builderの新機能の紹介」 というハンズオンセッションを聞き中。

で、それと同じことを今インストールしたWindows CE 6 Betaでもできるようなので試してみる。 …新しいプロジェクトの一覧に「Platform Builder」はでるのだが、 なぜかウィザード下部のボタンが表示されない。 どうしたもんだろう…。

とか悩んでいたら、ハンズオンのスタッフさんがその画面を見て 「それどうしたのか教えてください」 とのこと。 このセッションの後ちょっと話してみようと思います。

バグだったりするのかなぁ…。

…なんて書いていたら、スタッフさんが教えてくれました。 このベータ版は英語版のOSでないとダメだったようです。 動かないわけじゃないようですが、いろいろと問題があるようですね。 インストールしてみようとしている人とはご注意を。

(追記)OSだけじゃなく、VS2005も英語版である必要があるようです。 …そりゃそうか。

とりあえず終了〜。

すべてのイベントが、ついさきほど終わりました。

感想は後程。

本日のツッコミ(全1件) [ツッコミを入れる]

_ ももたろ [ツッコミができないって報告があったのでテスト。]