アプリケーションが明示的に行った呼び出しを検出することは、あまり意味がないといえます。別の個所で通知を受け取る必要もないわけです。Monikersを使用するオブジェクトを扱う場合は、それなりに利点があります。Webページの内容を変更できるからです。パフォーマンスが若干悪くなる可能性もあるため、その点は注意するべきといえます。一部のページについてはアクセス禁止にする処理が含まれています。http://eternalwindows.jp/にアクセスすれば、アクセスが禁止された旨が表示されることになります。ヘッダーファイル(protocol.h)を示します。コントロール関連)を示します。NULL)m_pInternetProtocolFactory->Release();}}続いて、ソースファイル(IInternetProtocol関連)を示します。"<html><body>アクセスがブロックされているページです。コントロールを表示するには、OLEにおけるインプレースアクティベーションという技術を使用します。それらを継承したCWebBrowserHostというクラスを定義しています。コントロールに渡しています。コントロールのウインドウが、m_hwndの子ウインドウになります。IInternetProtocolを実装したオブジェクトの登録は、前節と同じくIInternetSessionを使用します。それ以外の場合は既定の処理を行うというものです。これを取得しておきます。"<html><body>アクセスがブロックされているページです。IID_PPV_ARGS(&m_pProtocol));}CoCreateInstanceにCLSID_HttpProtocolを指定すれば、既定のオブジェクトを作成できます。m_dwDataSizeにはそのサイズが格納されています。IInternetProtocol::Startでは、URLへのアクセスを禁止するかの判断を行います。これとszUrlが一致する場合は、m_bDefaultHandlerにFALSEを格納します。これは既定のオブジェクトを使用しないということなので、アプリケーションが明示的にIInternetProtocolSinkのメソッドを使用します。既定のIInternetProtocol::Startを呼び出すようにしています。m_bDefaultHandlerがTRUEの際に既定のメソッドを呼び出すのは、InternetProtocolの他のメソッドにおいても共通しています。IInternetProtocol::Readの実装は次のようになっています。ない場合はpvにm_szDataをコピーします。このときにはS_OKを返すことになるため、再びReadが呼ばれることになります。今度は返すべきデータはありませんから、S_FALSEを返すようにします。IServiceProvider::QueryServiceを使用する方法もあります。ここでIInternetProtocolを実装したオブジェクトを返すようにします。すると、IInternetProtocol::Startが呼ばれることになります。httpsによるアクセスが生じた場合は、今回の実装では上手くいかないことになるでしょう。エラーが発生して失敗するようです。