« MiGrep2試作版 | トップページ | MiBarcode Ver.7フルインストール版 »

2017.04.02

MiGrep2その後(1)

ひとまずMiGrep2の本体は置いといて・・・シェル拡張部分を作成中です。

シェル拡張用のDLLはだいぶ昔にLazarusで作成した「64bit版TEADで開く」を元に今回もLazarusで32biti版と64bit版を作成しています。Delphi10.1 Starter版は32biti環境のみ、XE2 Pro版(64bit環境あり)はあるものの、Lazarus(FPC)用のソースファイルをDelphi用に修正するのも面倒ですし、Delphiにこだわる理由がなかったもので。

エクスプローラのコンテキストメニューの状態
Migrepexdll

で起動すると・・・
Migrepex

今回はコンテキストメニューから起動するためのアプリケーションを別に作成しています。旧MiGrepではコンテキストメニューから起動した場合、MiGrepそのものが起動して検索専用のダイアログフォームを表示していましたが、別アプリケーションにした方がMiGrep側との情報のやり取りがし易いのではと思ったためです。

で、コンテキストメニューからの起動では複数のファイルやフォルダーを選択して起動できるのですが、ファイルとフォルダー混在でリスト表示する際にフォルダーアイコンの表示でちょっとつまづきました。で、手っ取り早く以下のような処理を行っています。本当はもっとスマートな方法があるかも知れません。

procedure TForm1.LVAddList(FileList: TStringList);
var
  item: TListItem;
  i: integer;
  fname: string;
  sfi: TSHFileInfo;
 
  // ListViewにファイルアイコンを登録する
  procedure LoadShellIcon;
  var
    sfi: TSHFileInfo ;
    ImageListT: HImageList ;
    begin
      // コモンコントロールのイニシャライズ
      InitCommonControls;
      // 小さいイメージのロード
      ImageListT := SHGetFileInfo('', 0,  sfi,sizeof(TSHFileInfo),
                                  SHGFI_SYSICONINDEX or
                                  SHGFI_SMALLICON);
      // ListView 側の SmallImage に小さいアイコンを設定
      ListView_SetImageList(ListView1.handle, ImageListT, LVSIL_SMALL) ;
  end;
begin
  LoadShellIcon;
 
  for i := 0 to FileList.Count - 1 do
  begin                           
    item := ListView1.Items.Add;
    fname :=FileList.strings[i];
    item.Caption := fname;
    ShGetFileInfo(PChar(fname), 0, sfi, SizeOf(sfi),
                  SHGFI_SYSICONINDEX or SHGFI_SMALLICON or
                  SHGFI_USEFILEATTRIBUTES);
    // ファイルアイコンを取得できなかった場合はフォルダーアイコンを取得する
    if sfi.iIcon = 0 then
    ShGetFileInfo(PChar(fname), FILE_ATTRIBUTE_DIRECTORY, sfi, SizeOf(sfi),
                  SHGFI_SYSICONINDEX or SHGFI_SMALLICON or
                  SHGFI_USEFILEATTRIBUTES);
 
    item.ImageIndex := sfi.iIcon;
  end;
end;

それから、折角なのでxdoc2txtのDLLをDelphiで使用する方法を書いておきます。

type
  // xdoc2txtダイナミックリンクライブラリー関数の定義
  TExtractText = function(lpFileName: WideString; // 入力ファイル名
                          bProp: Boolean;         // True:プロパティの抽出 False:本文テキストの抽出
                          lpFileText: PWideString): Integer; cdecl; // BSTRはPWideString
 
// DLL呼び出し用関数を宣言
var
  ExtractText: TExtractText;
 
// DLLの動的ロードと解放
var
  xdocHdl: THandle;
 
xdocHdl := LoadLibrary(PWideChar(xd2txlib.dllのフルパス名));
if xdocHdl = 0 then
  MessageDlg('xdoc2txtのDLLをロード出来ませんでした.'+#13#10+'xdoc2txtライブラリーパスを指定して下さい', mtError, [mbOK], 0)
else
  @ExtractText := GetProcAddress(xdocHdl, 'ExtractText');
 
// ExtractTextの呼び出し
var
  rtxt: WideString;
 
// FileNameにテキストに変換したいファイル名(フルパス名)を入れる
ExtractText(WideString(FileName), False, @rtxt)
 
// DLLの解放
if xdocHdl <> 0 then
  FreeLibrary(xdocHdl);

Delphiからでも簡単に使用することが出来ます。
あらためて開発者のhishidaさんに感謝です。


|

« MiGrep2試作版 | トップページ | MiBarcode Ver.7フルインストール版 »

コメント

コメントを書く



(ウェブ上には掲載しません)




トラックバック


この記事へのトラックバック一覧です: MiGrep2その後(1):

« MiGrep2試作版 | トップページ | MiBarcode Ver.7フルインストール版 »