Windows RSS プラットフォームのコンポーネントを使ってみる

Windows RSS プラットフォームとは?

ネットワークからの入力は全て危ない、と疑ってかかるのが基本です。

RSS もまた然り。RSS を取り込むコンポーネント、それをパース (解析) するコンポーネントにセキュリティの問題があれば、 そこが危険なデータの入り口となるわけです。

Windows ではセキュリティ強化の一環として、Windows Vista 以降 Windows RSS プラットフォーム という名称で、 RSS 操作に関わるコンポーネント群が整備されました。

Windows 上のプログラムで、RSS 操作を利用する場合は今後は Windows RSS プラットフォームが利用できないか検討すると良いでしょう。

Windows RSS プラットフォーム利用例 ~ システム・フィード・フォルダのルートディレクトリ直下のフィード・エントリの列挙

この資料では Windows RSS プラットフォームのコンポーネントを利用する簡単な例として、 Windows のシステム・フィード・フォルダに登録されている RSS フィードの一覧 (ルートディレクトリ直下) を表示するコード例を示します。

すなわち、Internet Explorer の左側ペインの Feeds タブにて確認できる RSS フィードエントリを列挙することになります。

システム・フィード・フォルダのルートディレクトリ以下のエントリ

Windows RSS プラットフォームを使う場合は、msfeeds.h を取り込みます。

また、COM として実装されているので、CoInitialize してから、フィードマネージャ (クラス ID = CLSID_XFeedsManager) を CCI して、 そのフィードマネージャからルートフォルダを取得、列挙インターフェイス (IXFeedsEnum) の取得、さらに列挙中にフィードそのものへの参照インターフェイス (IXFeed) を取得して情報を取得・・・ざっというと、そんな流れです。

尚、概要をつかむにはスッキリしていたほうが良いと思い、下記のコードではエラー処理は全くしていませんので、 使うときには十分気をつけてください。

#include <windows.h>
#include <stdio.h>
#include <msfeeds.h>

void main() {

     IXFeedsManager* pFeedMgr    = NULL;
     IXFeedFolder*   pFeedFolder = NULL;
     IXFeedsEnum*    pFeedEnum   = NULL;
     IXFeed*         pFeed       = NULL;
     UINT            cFeeds      = 0;

     CoInitialize( NULL );

     CoCreateInstance(
          CLSID_XFeedsManager,
          NULL,
          CLSCTX_ALL,
          IID_IXFeedsManager,
          (void**) &pFeedMgr );

     pFeedMgr->RootFolder( IID_PPV_ARGS( &pFeedFolder ) );
     pFeedFolder->Feeds( &pFeedEnum );
     pFeedEnum->Count( &cFeeds );

     while ( cFeeds ) {

          pFeedEnum->Item( --cFeeds, IID_PPV_ARGS(&pFeed) );

          LPWSTR wszName = NULL;
          LPWSTR wszUrl  = NULL;
          UINT   cItems  = 0;

          pFeed->Name( &wszName );
          pFeed->Url( &wszUrl );
          pFeed->ItemCount( &cItems );

          wprintf( L"%s", wszName );
          wprintf( L" <%s>", wszUrl );
          wprintf( L" [%d Items]\n", cItems );

          CoTaskMemFree( wszName );
          CoTaskMemFree( wszUrl );

          pFeed->Release();
          pFeed = NULL;

     }

     pFeedEnum->Release();
     pFeedFolder->Release();
     pFeedMgr->Release();

     CoUninitialize();

     return;

}

ビルドして実行すると、確かに次のような結果を得ました。(... は省略)

USA.gov Updates: News and Features <http://go.micros...
Popular Government Questions from USA.gov <http://go...
MSNBC News <http://go.microsoft.com/fwlink/?LinkI...
Microsoft at Work <http://go.microsoft.com/fwlink/...
Microsoft at Home <http://go.microsoft.com/fwlink/...

上のスクリーンショットと見比べると、正しい値を取得できていることがわかります。

ここまでお読みいただき、誠にありがとうございます。SNS 等でこの記事をシェアしていただけますと、大変励みになります。どうぞよろしくお願いします。

© 2024 Web/DB プログラミング徹底解説