著作一覧 |
助田さんのところに出ている問題を再現させてみようと、メソッドを呼び出したらそのままえんえんと処理を続ける外部プロセスサーバを作ってみた。といっても、メソッドの呼び先でSleepすれば良いだろう。
で、VS2008でATLを使ってみたが、自動登録処理は実装されていないので、自分で実装したメモ。
WinMainで以下のように実装
extern "C" int WINAPI _tWinMain(HINSTANCE /*hInstance*/, HINSTANCE /*hPrevInstance*/, LPTSTR lpCmdLine, int nShowCmd) { std::basic_string<TCHAR> cmdline = std::basic_string<TCHAR>(lpCmdLine); for (size_t i = 0; i < cmdline.length(); i++) { cmdline[i] = _totlower(cmdline[i]); } if (cmdline.find(_T("/regserver")) != std::string::npos) { _AtlModule.RegisterServer(FALSE); _AtlModule.RegisterServer(TRUE); } else if (cmdline.find(_T("/unregserver")) != std::string::npos) { _AtlModule.UnregisterServer(FALSE); _AtlModule.UnregisterServer(TRUE); } else { return _AtlModule.WinMain(nShowCmd); } return 0; }
最初tcslwrを使おうと思ったが、c_str()で返した文字列の変更は禁止となっているので、TCHAR単位の処理(引数にシフトJISが来た場合のことは無視)。
以前はEXEの場合にはTYPELIBリソースは自動生成されなかったような記憶があるが、このバージョンでは組み込まれているので、単にCComModule(CAtlModuleなど含む)のRegisterServerメソッドの呼び出しだけで済む。
ただ、当然といえば当然だが、コマンドラインから何も用意せずに/regserverで実行すると、E_ACCESSDENIEDになる(上では面倒なので返値チェックはしていない)ので、インストーラを作って実行すべきことかも知れない(なので、自動生成されないのかなぁ)。つまりHKCRを更新するので管理者権限で実行する必要がある。
それはそれとして、まったく再現しないのだが、クライアント側にGUIが必要なのかな?
なんで再現しないかわかったような気がする。
Excelはおそらくファイル保存を別のスレッドで行うか、あるいはトップレベルのメッセージポンプがアイドルの時に行うのだろう。
ということは、SaveAsを呼んだ時点では保存動作は行われず、Win32OLE側へ戻してしまう。その状態で、Win32OLEが次のメソッドを呼ぶからエラーになるということ(なのだろう)。
であれば、上で考えていた、単にメソッド呼び出しが戻らないのではだめだろう。
ただ、呼び出し側がUIを持っていれば、呼び出し中のマウスクリックなどに対して、ビジーの反応をしたように覚えているんだよなぁ。だから、そのタイプなのだと思ったのだが、Win32OLEだとUIがないから、メッセージポンプでそのあたりのメッセージを拾うわけないし。
iTunesのアルバムアートワークの設定の仕方がわかったので(いろいろ試行錯誤したが、結局、アルバムの全曲を選択して、「情報を見る」を表示して、Safariから書影をアルバムアートワークの枠内にドラッグアンドドロップするのが一番簡単)、さっそく、ポップ側にも反映しようと思ったが、ほぼ全部、埋まっているし、埋まっていないのは存在しない。
と思ったら、大物が空のままだった。
内藤というカメラマンのこと、その動物写真のこと、なぜかEpicのアンケート調査に選ばれたこと、シーナとそのカバーのこととか、いろいろ個人的な曰くが多いが、こうやってオリジナルのアルバムアートワークが入手できて、カバーフローに表示されるのを眺めるのはハッピーなことだ。
ウガチボー。
(こんなジャケットだとうれしかない)
ジェズイットを見習え |