« クロスフェードが重いのは・・・ | メイン | Pythonのライセンス »

2005年02月11日

ツール開発メモ:: SWIGを使ってみる (Perlでゴミ箱へ)

    

perlでいきなりファイルを削除せずにゴミ箱へ移すために、ゴミ箱へ削除するためのperlモジュールを作ることにした。
で、以前知ったSWIGを使ってみることにした。
マニュアルとサンプルを見てとにかく書いてみる。
まずは、ゴミ箱へ削除する関数を書く。
ファイル名はtoTrashBox.cppとした。

#include <windows.h>
#include <shellapi.h>
#include <string.h>

extern "C" void toTrashBox( const char *p )
{
  SHFILEOPSTRUCT stFile;
  char path[MAX_PATH];

  size_t len = strlen(p);
  strcpy( path, p );
  path[len+1] = '\0';

  memset( &stFile, 0, sizeof(SHFILEOPSTRUCT) );
  stFile.hwnd = NULL;
  stFile.wFunc = FO_DELETE;
  stFile.pFrom = path;
  stFile.pTo = NULL;
  stFile.fFlags = FOF_ALLOWUNDO | FOF_NOCONFIRMATION;
  ::SHFileOperation( &stFile );
}

パスは\0\0で区切らないとならないため、内部でコピーして\0を足している。
後、渡すパスはフルパスでないといけない。
他はたいしたことはやっていない。
次にSWIGスクリプト(?)をW32Shell.iという名前で作る。
中身は次の通り。

/* File : W32Shell.i */
%module W32Shell

extern void toTrashBox( const char *p );

で、コマンドラインでSWIGに渡す。

> swig -perl W32Shell.i

すると、W32Shell_wrap.c と W32Shell.pm が出来る。
次に、W32Shell 用のプロジェクトを作る。
DLLのプロジェクトとして作り、中身は空にする。

C/C++の追加インクルードディレクトリに"C:\Perl\lib\CORE"を追加。
リンカの追加の依存ファイルに"C:\Perl\lib\CORE\perl58.lib"を追加。
これはインストール環境やperlのバージョンによって変わるので、適宜あわせる。
で、プロジェクトにW32Shell_wrap.c と toTrashBox.cpp を追加。
後はビルドすればOK。
W32Shell.dllが出来る。
で、実際に使う場合のperlスクリプトは次のようにする。

use W32Shell;
W32Shell::toTrashBox('C:\test.txt');

これで、C:\test.txt がゴミ箱へ移動される。
もしかしたら需要があるかもしれないので、その内このモジュールは公開するかも。
気ままにメソッドを追加しそうだけど。
と言っても、そんなに使いたい物はないかな?
まあ、欲しくなったときに追加していこう。



投稿者 Takenori : 2005年02月11日 00:32




comments powered by Disqus
Total : Today : Yesterday : なかのひと