おいふぉりーのぶろぐ

きっと趣味のブログに違いないです!!

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。
  1. --/--/--(--) --:--:--|
  2. スポンサー広告

TortoiseSVNのCOMインターフェースを使ってみる

TortoiseSVN というバージョン管理ソフトには SubWCRev というプログラムが付属していて, バージョン管理下のファイルのリビジョンや更新日時を取得することができます.今回は SubWCRev の COM インターフェースを使って,自作プログラムから SubWCRev を介してバージョン管理下のファイルの情報を取得してみたというお話.

ここでは,COM インターフェースを使って SubWCRev の機能を呼び出すために,IDL ファイルからインターフェースを定義するヘッダー ファイルを作成してみます.次のように MIDL コンパイラを呼び出します.

midl SubWCRevCOM.idl /notlb /h SubWCRevCOM_h.h

上記のコマンドを実行すると,SubWCRevCOM_h.h と SubWCRevCOM_i.c が作成されます.SubWCRevCOM_h.h にはインターフェースの定義が,SubWCRevCOM_i.c にはクラス ID やインターフェース ID が含まれています.

で,後はプログラムを書くだけ.詳細は続きに載せておきます. 書いたプログラム tsvn_com.cpp と SubWCRevCOM_i.c を Visual C++ でビルドすれば完成です. このプログラムでは,コンパイラ COM サポートを利用してます. _COM_SMARTPTR_TYPEDEF マクロを使って ISubWCRevPtr というスマート ポインタ(侵入型参照カウント方式)を定義してます.スマート ポインタなので,参照カウントの増減を自動でやってくれてとても便利です.

プログラムの動作ですが,第一引数にバージョン管理下のファイル名を渡すと, リビジョンと更新日時が標準出力に表示されます.


ソースコード tsvn_com.cpp

#include "SubWCRevCOM_h.h"
#include <iostream>
#include <comip.h>  //  Compiler COM Support
#include <comdef.h>

_COM_SMARTPTR_TYPEDEF(ISubWCRev, IID_ISubWCRev);

int main(int argc, char *argv[])
{
  HRESULT hr;

  hr = ::CoInitialize(NULL);
  if (FAILED(hr))
  {
    std::cerr << "Failed to initalize COM" << std::endl;
    return 1;
  }

  try
  {
    if (argc != 2)
    {
      std::cout << "Usage: tsvn_com <File Name>" << std::endl;
      return 0;
    }

    _bstr_t path(argv[1]);

    ISubWCRevPtr refRev;
    hr = refRev.CreateInstance(CLSID_SubWCRev);
    if (FAILED(hr))
    {
      std::cerr << "Failed to create SubWCRev object!" << std::endl;
      return 1;
    }

    hr = refRev->GetWCInfo(path, VARIANT_TRUE, VARIANT_TRUE);
    if (FAILED(hr))
    {
      std::cerr << "Failed to get SVN information!" << std::endl;
      return 1;
    }

    _variant_t varRevision;
    _variant_t varDate;
    refRev->get_Revision(&varRevision);
    refRev->get_Date(&varDate);

    std::cout << "Revision: " << static_cast<_bstr_t>(varRevision) << std::endl;
    std::cout << "Date: " << static_cast<_bstr_t>(varDate) << std::endl;
  }
  catch (...)
  {
    std::cerr << "Unknown exception is thrown!" << std::endl;
  }

  ::CoUninitialize();

  return 0;
}


  1. 2011/05/11(水) 19:02:39|
  2. ソフトウェア開発
  3. | トラックバック:0
  4. | コメント:0
| ホーム | パソコンがやってきた>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバックURLはこちら
http://tm86eublog.blog42.fc2.com/tb.php/266-850a853d
この記事にトラックバックする(FC2ブログユーザー)

来客数

プロフィール

Euphorie

Author:Euphorie
"おいふぉりー"って呼んでくださいな☆
ハードウェアとかソフトウェアとかの開発に興味があったり。。。
連絡先は上の画像。

最近の記事

最近のコメント

最近のトラックバック

月別アーカイブ

カテゴリー

ブロとも申請フォーム

この人とブロともになる

ブログ内検索

RSSフィード

リンク

このブログをリンクに追加する

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。