独自プロトコルの登録リソースが存在する位置を表す文字列として、URLは日常的に使用されています。文字列からどのようなことを行うかを直観的に理解できます。データを取得する方法もより多様化するのではないでしょうか。URLを通じてデータベースの中身を取得できて便利といえるでしょう。このような独自のプロトコルをサポートするCOMオブジェクトを作成できるようになります。MonikersにそのURLを指定します。Protocolsのオブジェクトに処理を渡します。Monikersに返します。アプリケーションはプロトコル独自のデータを受け取れるようになります。プロトコルからどのオブジェクトへ処理を渡すかを決める中継としての傾向の方が強いといえるでしょう。登録されているオブジェクトは、次のレジストリキーから確認できます。aboutプロトコルを実装するオブジェクトに処理が含まれています。Monikersがabout:のハンドラへの中継になったわけです。実際にHKEY_CLASSES_ROOT\CLSID以下から確認できるでしょう。ちなみに、httpやfileなどのプロトコルをサポートするオブジェクトはurlmon.dllです。ハンドラとしての役割も担っているわけです。httpやfileなどをサポートするオブジェクトは、内部でWinINetを使用しています。Protocolsとしての役割を果たすオブジェクトは、IInternetProtocolを実装しなければなりません。そこでオブジェクトは独自のプロトコルのデータを返すことができます。今回は、IInternetProtocolを継承したCInternetProtocolというクラスを定義しています。m_bComplete;};IInternetProtocolはIInternetProtocolRootを継承しているため、IInternetProtocolRootのメソッドも実装することになります。ReadからUnlockRequestまでがIInternetProtocolのメソッドです。メソッドが呼ばれる順番は一般的に、Start、Read、LockRequest、Terminate、UnlockRequestになります。データはグローバルではなくメンバとして定義するようにします。IInternetProtocolのメソッドで重要となるのは、StartとReadです。そのプロトコルに関連するデータを用意します。Readでは用意しておいたデータを返します。アプリケーションはReadで返されたデータを取得できます。Startの実装は次のようになっています。S_OK;}オブジェクトは、IInternetProtocolSink::ReportDataとIInternetProtocolSink::ReportResultを必ず呼び出すようにします。ReportDataを呼び出せばデータが利用可能になったことを通知でき、内部でIInternetProtocol::Readが呼ばれます。バインドフラグにキャッシュの使用を無効にする値(dwNoCacheFlag)が含まれていない場合は、少し話が変わります。第2引数にキャッシュファイルの名前を指定するようにします。キャッシュを使用しない場合は、アプリケーションに返したいデータを格納します。URLを解析してデータベースからデータを取得し、そのデータと<table>タグを含めることになるでしょう。ReportProgressにBINDSTATUS_VERIFIEDMIMETYPEAVAILABLEを指定しているのは、MIMEタイプを通知するためです。これは必須の処理ではありませんが、行っていた方がよいとされています。BSCF_LASTDATANOTIFICATIONはデータの利用が終了したことを意味します。BSCF_DATAFULLYAVAILABLEは全てのデータを利用したことを意味します。Readではデータを全て返すまでS_OKを返し、全てのデータを返し終わったらS_FALSEを返しているからです。一回のReportDataで全てのデータを処理しているため、各定数をまとめて指定しています。ReadがS_FALSEを返せばReportDataも制御を返すことになり、そこではReportResultを呼び出しています。第2引数にプロトコル固有のエラーコード、第3引数にプロトコル固有の文字列を指定します。IInternetProtocolSink::ReportDataの内部で呼ばれるIInternetProtocol::Readは、次のようになっています。hr;}通常、Readではpvにデータを返すことになりますが、キャッシュを利用している場合は例外です。サイズ分だけキャッシュファイルからデータが取得されることになります。そのコピーするサイズがpvのサイズを超えてはなりません。コピーしたサイズはpcbReadに格納します。S_FALSEを返すことでReadがこれ以上呼ばれないようにします。次のように独自のURLを入力できるようになります。MonikersでそのURLへアクセスしようとするはずです。独自のデータがIEに返ることになります。sql:含んだURLを入力すると独自のデータが返ります。ページのソースを開いてみれば、StartのszDataに格納していた文字列が含まれていることが分かるでしょう。次に今回作成したプログラムの内容を示します。DLLのdefファイルを示します。PRIVATE続いて、ヘッダーファイルを示します。fLock);};最後に、ソースファイルを示します。TRUE;}作成したDLLを登録するには、コマンドプロント上で次の文字列を入力します。次の方法でレジストリに登録できます。ようにする)これによってDLLのDllRegisterServerが呼ばれ、HKEY_CLASSES_ROOT\PROTOCOLS以下に書き込みが行われます。