非同期カスタムプロトコルの実装

(IInternetProtocol,IInternetProtocolRoot)

 

目的

1.1 目的

Webコンポーネントで使用されるカスタムプロトコルの実装が可能となる

hogehoge://〜」を自分で好きなように実装することが出来る

 

実装方法

2.1 インタフェース実装

 

コーディング

class ATL_NO_VTABLE COreProtocol :

        public ICNewScheme,

        public IInternetProtocol

//      public IInternetProtocolRoot

{

        // インタフェース公開

        BEGIN_COM_MAP(COreProtocol)

           COM_INTERFACE_ENTRY(IInternetProtocol)

           COM_INTERFACE_ENTRY(IInternetProtocolRoot)

        END_COM_MAP()

 

 

2.2 レジストリ

俺プロトコルのコンポーネントを次のレジストリに登録する

HKCR\PROTOCOLS\Handler」以下に「hogehoge」キーを作成し、「CLSID」エントリーにCOreProtocolCLSIDを設定する。

 

以下にレジストラ記述を示す

HKCR

{

    NoRemove 'PROTOCOLS'

    {

       NoRemove 'Handler'

       {

          ForceRemove 'hogehoge' = s 'hogehoge:ORE Protocol'

          {

              val 'CLSID' = s '{XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXX}'

          }

       }

    }

}

 

 

 

コーディング

3.1 レジストリ登録

属性プログラミングを行っている場合、次のように「DllRegisterServer」と「DllUnregisterServer」を記述し、regsvr32登録時にレジストリに登録するようにする。

[ module(dll, uuid = "{nnnnnnnn-nnnn-nnnn-nnnn-nnnnnnnnnnnn}",

        name = "OreProtocol",

        helpstring = "俺のプロトコルだ",

        resource_name = "IDR_OREPROTOCOL") ]

class COreProtocolModule

{

public:

    BOOL WINAPI DllMain(DWORD dwReason, LPVOID lpReserved)

    {

        _tsetlocale ( LC_ALL, _T("") );   // 日本語表示対応

        return __super::DllMain(dwReason, lpReserved);

    }

   HRESULT WINAPI  DllRegisterServer(void)

   {

       UpdateRegistryFromResourceS (IDR_OREPROTOCOL , True , NULL );     // rgsの登録

       return __super::DllRegisterServer();

   }

   HRESULT WINAPI  DllUnregisterServer(void)

   {

       UpdateRegistryFromResourceS (IDR_OREPROTOCOL , False , NULL );    // rgsの解除

       return __super::DllUnregisterServer();

   }

// CAtlDllModuleT メンバのオーバーライド

};

 

3.2 IInternetPrococol

MSDNライブラリー

http://msdn.microsoft.com/library/default.asp?url=/workshop/networking/pluggable/reference/ifaces/iinternetprotocol/iinternetprotocol.asp

 

Read

システムからのデータの読み込み要求

LockRequest

使っていないので、S_OKで戻すべし

UnlockRequest

使っていないので、S_OKで戻すべし

 

 

3.3 IInternetProtocolRoot

MSDNライブラリー

http://msdn.microsoft.com/library/default.asp?url=/workshop/networking/pluggable/reference/ifaces/iinternetprotocol/iinternetprotocol.asp

 

Abort

読み出しが中止されたときに呼び出される

Continue

Resume

Start

開始時に呼び出される

Suspend

Terminate

終了時に呼び出される

 

 


 

 

3.4 コーリングシーケンス

 

 

3.5 IInternetProtocolSink

一般的に、IInternetProtocol:Start()で起動されたオブジェクトは、スレッドを作成してスレッドに実際の処理をお任せする。そのスレッドからシステムへ読み込み状況や処理結果の通知を本インタフェースを通じて行う。

 

ReportData

データの状況を報告するために呼び出す

BSCF_DATAFULLYAVAILABLE:データ完了

ReportProgress

データの受信状況の報告に使用する

BINDSTATUS_MIMETYPEAVAILABLE:MIMEタイプを報告するのに使用する

ReportResult

データの受信が完了し、その結果通知に使用する

Switch