Functionsと呼ばれる関数群を利用することもできます。その結果に対して署名の検証などを行うことになります。#7形式のデータをデコードする際に呼び出すCryptMsgOpenToDecodeなどを取り上げます。pStreamInfo);dwMsgEncodingTypeは、エンコーディングタイプを指定します。dwFlagsは、基本的に0を指定します。dwMsgTypeは、メッセージタイプを指定します。0を指定した場合、メッセージに設定されたコンテンツからメッセージタイプを判別します。pRecipientInfoは、予約されているためNULLを指定します。pStreamInfoは、ストリーミングに関する引数ですが、基本的にNULLを指定します。戻り値は、メッセージのハンドルが返ります。エンコードまたはデコードするための情報を含むことができます。#7形式にエンコードされたデータとなります。データをコンテンツとしてメッセージに追加するには、CryptMsgUpdateを呼び出します。fFinal);hCryptMsgは、メッセージのハンドルを指定します。pbDataは、エンコードまたはデコードしたいデータを指定します。cbDataは、pbDataのサイズを指定します。fFinalは、CryptMsgOpenToDecodeのdwFlagsにCMSG_DETACHED_FLAGを指定していない場合は、TRUEを指定します。メッセージに追加されたということです。この追加されたデータがコンテンツとなります。デコードと目的の動作を同時に行っています。ここからどうのような動作を行うかは、アプリケーション次第となるわけです。コンテンツを維持したメッセージが必要になります。次に、メッセージから特定のパラメータを取得するCryptMsgGetParamを示します。*pcbData);hCryptMsgは、メッセージのハンドルを指定します。dwParamTypeは、取得したいパラメータを表す定数を指定します。dwIndexは、どの情報を取得するかを表すインデックスを指定します。dwParamTypeの値によって使用しない場合があります。pvDataは、パラメータを受け取るバッファを指定します。得られる形式は、dwParamTypeの値によって異なります。pcbDataは、バッファのサイズを格納した変数のアドレスを指定します。pvDataにNULLを指定した場合は、バッファのサイズが返ります。dwParamTypeに指定できる定数を次に示します。メッセージに含まれる証明書の数を取得する。メッセージに含まれる証明書を取得する。メッセージのコンテンツを取得する。その変更を考慮して再度エンコードし直すことができる。受取人の数を取得する。受取人の情報を取得する。メッセージのタイプを取得する。タイプには、CMSG_SIGNEDとCMSG_ENVELOPEDがある。メッセージのタイプを表すOIDを取得する。このOIDは、実際にメッセージ上に格納されている。認証済み属性を取得する。認証されていない属性を取得する。メッセージのハンドルは、不要になったらCryptMsgCloseでクローズすることになります。hCryptMsg);hCryptMsgは、クローズしたいメッセージのハンドルを指定します。#7形式のデータから証明書を取得します。#7形式でエクスポートした.p7bファイルが当てはまります。CryptMsgOpenToDecodeを呼び出してメッセージのハンドルを取得します。メッセージのコンテンツはデコードされたデータとなります。証明書を取得するコードは、次のようになっています。MB_OK);}証明書の数は、CryptMsgGetParamにCMSG_CERT_COUNT_PARAMを指定することで取得できます。数値が返るため、第4引数に指定するバッファはDWORD型で十分です。現在のカウントをインデックスとしてCryptMsgGetParamを呼び出します。第4引数には証明書のバイトデータが返ります。そのサイズ分のメモリを確保してから2回目の呼び出しでデータを取得します。#7形式のデータから証明書を取り出すコードを書くことができるでしょう。証明書の発行先を表示しています。Functionsでも可能であり、コードも少なくなる傾向があります。次のように記述することができます。指定したPKCS#7形式のデータを証明書ストアと見立てることを可能とします。証明書を取得を慣れ親しんだ方法で行えることになります。その第1引数はCERT_STORE_PROV_PKCS7を指定しています。