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の実装...空っぽだけど。//このタイミングで「ログイン...」相当が行われているっぽい。//このタイミングでメールが受信されている。//「ログオフ...」相当をやっているのかな。IMailSyncHandlerを使うと何が嬉しいの?画面制御を完全に自分でコントロール可能になると思われます。今のSandRでは、PDXメールを送受信するときは邪魔なバルーンが毎回出てきちゃいます。その他のアカウントのメールだとメールソフトが起動しちゃいます。それが、この方法を使うと、完全に裏で処理をすることが可能になりそうです。(いや、まだちゃんと試してないのですよ)また、これまたあんまり試してないですけど、IMailSyncCallBackで細かい状況の取得ができそうですので、邪魔にならないようにそれを表示させることもできるかもしれません。いうことで、SandRとSendNowはこの手法を使った方式に切り替えていこうかなーと思っています。送受信するときにアカウント名&パスワードが必要になっちゃうんですよね。PDXメールだけを使っている人には敷居が高くなっちゃうかもなので、今まで通りの方式で送受信する方法も残しておきたいとは思っています。ここまで書いて思ったんですけど。ここで知った技術をベースに、mailtrns.dllをラップしたdllを作って置き換えれば、メールが受信されるタイミングを正確に取れる気がします。メールの着信鳴り分けを実現したりできるかもしれません。技術共有はするので誰か作ってくれないかなー。Joe'sのVPSを借りてみた。tDiaryのバージョンを上げた。gistのソースを張ってみるテスト。Ver.0.23テスト公開。WILLCOM03の電源が入らなくなった。あけましておめでとうございます。