2005-06-17 [長年日記]

_DPIEWebBrowserEvents2

IEのDWebBrowserEvents2に対応して、PIEには_DPIEWebBrowserEvents2があります。ドキュメントを眺めると送られるイベントはDWebBrowserEvents2と大して変わらないように見えるので同じように扱えるかと思いきや色々と問題がありました。

まず、IConnectionPointContainer::FindConnectionPointでDIID__DPIEWebBrowserEvents2の接続ポイントを検索するとNULLが返ってきてしまいます。EnumConnectionPointsで調べてみると、IID_IDispatchであれば接続できるようです。

さらに、IID_IDispatchで接続してからページを開いてみると、ドキュメントの説明とは違って以下のような順序でイベントが発生します。

  1. DISPID_BEFORENAVIGATE
  2. DISPID_TITLECHANGE
  3. DISPID_NAVIGATECOMPLETE
  4. DISPID_DOCUMENTCOMPLETE

まずはDISPID_BEFORENAVIGATEをDWebBrowserEvents::BeforeNavigateと同じように処理すればよいかと思ったのですが、引数の数からして違い、6個しか渡されません。型はVT_BSTR, VT_I4, VT_BSTR, VT_BSTR, VT_BSTR, VT_I4の順番です。1個目から5個目まではBeforeNavigateの2個目から6個目までの引数に対応しているようです。最後の引数はなんだかわかりません。いずれにしてもBeforeNavigateの最後の引数にあたる出力引数がないのでここでキャンセルさせることができなそうです。

QMAIL3では、HTMLメールからリンクをたどったときにブラウザで開くために、ここでイベントを処理してキャンセルし、別のブラウザを開いているので、ここでキャンセルできないのは痛いです。ちなみに、IBrowser::Stopを呼び出しても止まりませんでした。

[Q3] RSS/Atom取得時にCookieを指定

Cookieでセッションを管理しているサイトで、ログインしていないとアクセスできないRSSやAtomを取得できるようにするために、Cookieを送れるようにしました。本当はブラウザの設定からCookieの値を取得して送るようにするのが良いのだと思いますが、プラットフォームによって取得方法が異なりそうとか、色々なブラウザに対応するのが面倒とかの理由により手動で設定することしかできません。

Cookieの有効期限が短いサイトや頻繁にログアウトするような使い方では役に立ちませんが、ログインしっぱなしという場合にはそこそこ使えます。

ちなみに、保存されているCookieの値の取得方法は、適宜覚書: IEのクッキーについてがわかりやすいと思います。


トップ «前の日記(2005-06-16) 最新 次の日記(2005-06-18)»