マクロで使うDLL

top秀丸エディタマクロ

update : 2024/11/03 (Sun)

1 目次

DLLの64bit対応について

DLL

色々なDLLの使い方

変換モジュール

COMコンポーネント

WSH

2 DLLの64bit対応について

マクロを使用するに場合には、32bit/64bit の違いを気にする必要はありませんが、外部DLLを使用する場合は注意が必要です。

基本的には 64bit アプリケーションで 32bit DLL を使用する事はできませんが、 64bit版秀丸エディタには 32bit DLL 使用するためのオプションが存在します。

64bit設定画面

このオプションを ON にすることで、64bit秀丸エディタ上で 32bit DLL を使うことができますが、 32bit DLLで hmjre.dll を使用する場合は問題があります。

64bit 秀丸エディタに付属するのは、64bit hmjre.dllです。 32bit DLL から 64bit DLL のロードはできない為、32bit DLL で 64bit 秀丸エディタ本体と同じ場所にある 64bit hmjre.dll をロードしようとしても必ず失敗します。

hmjre.dllを使用可能な外部DLLには、以下のDLL等があります。

オプションを「ON」にしても、64bit秀丸エディタから上記 32bit DLLを経由し hmjre.dll(64bit) を使用すると必ず失敗することになります。 (CompleteX、祝鳥では「hmjre.dllを読込に失敗した」等のメッセージが表示される。)

解決方法としては、

  1. 外部DLLを32bit版ではなく64bit版を使用する。(全部64bit版を使う。)
  2. 64bit 秀丸エディタではなく32bit 秀丸エディタを使用する。(64bit 秀丸エディタを使わない。全部32bit版を使う。)
  3. 別途 32bit版hmjre.dll を用意し、マクロにある hmjre.dll をロードする箇所を修正する。

等があります。

説明追加

ヘルプ(動作環境- 64bit版) にも説明がありますが、64bit秀丸上で32bitDLL使うには、かなり強引な方法をとっています。その為、オプションを有効にしても、DLL によっては正常に動作しない場合もあります。

2.1 64bit hmjre.dllを使う際の注意

C/C++など、プログラミング言語から、64bit hmjre.dllを使う場合の注意点。

  • 64bit対応で、JRE2構造体の定義が一部変更されているため、配布されている JREUSR.H を変更する必要があります。詳細はturukame.2:02359を、参照してください。変更しない場合は、 "Jre2Open" が、失敗します。

    JREUSR.Hが含まれる開発関連資料はこちら:jredoc

2.2 64bit版macrodll.dll

macrodll.dllのx64版は更新停止。祝鳥 Ver.1.10 で 64ビット対応しているので、祝鳥 Ver.1.10 に含まれる DLL を使ってください。

プロパティの「詳細」だと、ファイルバージョン 0.8.9.1 になっていますが、マクロからバージョンチェックすると 1.10.00 です。

#dll = loaddll(currentmacrodirectory + @"\macrodll.dll");
if(#dll != 0){
    $ret = "「" + currentmacrodirectory + @"\macrodll.dll」のバージョン" + 
    "\nバージョン:" + dllfuncstr(#dll, "GETVERSIONSTR") + 
    "\nコンパイル:" + dllfuncstr(#dll, "GETCOMPILEDATE");
    freedll #dll;
    message $ret;
}else{
    message "DLLのロードに失敗しました。";
}
endmacro;

マクロ実行結果

---------------------------
秀丸エディタ
---------------------------
「c:\temp\fortex_1_10\fortex\sub\macrodll.dll」のバージョン
バージョン:1.10.00
コンパイル:Aug 17 2023
---------------------------
OK   
---------------------------

32bit版DLLは「macrodll32.dll」というファイル名になっているので、「macrodll.dll」と名前を変えるかマクロ側を修正する必要がありますがバージョンは1.02?

---------------------------
秀丸エディタ
---------------------------
「c:\temp\fortex_1_10\fortex\sub\macrodll32.dll」のバージョン
バージョン:1.02.00
コンパイル:Oct  6 2020
---------------------------
OK   
---------------------------

祝鳥に含まれている、「macrodll.dll」のx64版です。作者 あべのりゆき氏 の許可を得て公開しています。

上記URLで、公開されているソースを元に、Visual Studio Community 2017(Ver.15.9.45) でコンパイルしています。


最新版(祝鳥 1.02a):macrodll.dll(x64)Ver.1.02a 2022/03/17版

  • Ver.1.0.2からの変更点

    2022/01/18
    • "EDIT_CREATE" で、入力時に補間が効かなかったのを修正。
    2022/03/17(Ver.1.02a 正式版)
    • リソースファイルのバージョンを変更しコンパイル。(ソースの変更無し)

旧 版(祝鳥 1.01):macrodll.dll(x64)Ver.1.01 2018/10/06版

  • 動作確認は、Windows10(64bit)で行っています。
  • 全ての機能の動作確認はしていません。CompleteX や、自前のマクロでの動作確認をしているだけです。
    (TeX は使用していないので、祝鳥の動作確認は行っていません。)
    最悪の場合、秀丸エディタ毎クラッシュする場合があります。
  • この DLL を使用して、損害が生じても、損害に対する保証は出来かねますので、あらかじめご了承ください。また、この DLL 使用時に、不具合があった場合は、「h-tom」まで連絡してください。対処可能なら修正します。連絡先は、トップページか添付文書を参照してください。送信フォーム もあります。

2.3 64bit版田楽DLL

「田楽DLL」のx64版です。作者 杉浦まさき氏 の許可を得て公開しています。

上記URLで公開されているソースを元に、VCEE2010SP1+Windows SDKでコンパイルしています。

田楽DLL(x64)Ver.3.22.1 2017/12/02

2017/12/01 Ver.3.22.1
  • グローバル変数操作系の関数 SETVAR が動作していなかったのを修正。
2013/02/17 Ver.3.22.0
  • x64対応のみ
2012/03/07 Ver.3.21.4
  • *.sph関連修正(UNBYPASS.Hを参考に修正)
  • グローバル変数操作系の関数で、定数シンボルを使うように修正(INVALID_HANDLE_VALUE) (colder氏からの連絡による。)
2011/10/23 Ver.3.21.3
  • *.sph修正(構造体変更)
2011/10/16 Ver.3.21.2
  • *.sphに対応
2011/10/08 Ver.3.21.1
  • bregonig.dll Ver.3.00βを使用するように変更
2011/10/04 Ver.3.21.0
  • x64対応のみ
  • 動作確認は Windows10(64bit) で行っています。

  • 全ての機能の動作確認はしていません。dgdll.macや、自前のマクロでの動作確認をしているだけです。最悪の場合、秀丸エディタ毎クラッシュする場合があります。

  • このDLLは、64bitでコンパイルしているため、32bit DLLを直接ロードはできません。(一般的に流通している Susie Plug-in は 32bit DLL なので、ロードできない。)

  • BREGEXP 関数に関しては、K.Takata氏作成 bregonig.dll のx64版が使用できます。 bregonig.dll 自体は Unicode(UTF-16LE) 対応ですが、本DLLでは ANSI 対応のみで Unicode には対応していません。

    K.Takata's Web Page

    x64版をコンパイルする場合には、bregonig.dll のソースに含まれる "BREGEXP.H" が必要です。

  • Susie Plug-inに関しては、一応 "*.sph"に対応しています。 "*.sph"に関しては以下のURLを参照して下さい。

    TORO's Library

    UNBYPASS.DLLに含まれる、 "ZBYPASSI.SPH" を使用すると、64bit田楽DLLから、32bit Susie Plug-in を使用することが出来ます。

  • この DLL を使用して損害が生じても、損害に対する保証は出来かねますのであらかじめご了承ください。また、この DLL 使用時に不具合があった場合は、「h-tom」まで連絡してください。連絡先はトップページか添付文書を参照してください。送信フォーム もあります。

3 DLL

3.1 ht_tools.dll

秀丸エディタ/秀丸メールで使用するマクロ拡張用DLLです。マクロで(簡単には)実現できない(事もない?)各種機能(?)を提供します。

動作環境

  • 秀丸エディタが必要です。秀丸メールでも動作します。秀丸エディタは DLL をサポートした Version3.02以降、なるべく最新版を使用してください。
  • Windows 11で動作確認しています。

詳細な説明はDLLの解説(Version 1.29.00)をみて下さい。

  • 正式版

    • ht_tools.dll Version 1.29.00(2024/11/02)
      32ビット/64ビットdll同梱(64ビットdllは、x64フォルダに格納されています。フォルダ構成を保った状態で解凍して下さい。) libhunspell.dll は、Version 1.7.0 以降が必要です。
      圧縮ファイルの内容
        ht_tools.dll              :32bit DLL
        ht_tools.html             :説明ファイル
        HidemaruMacroInstaller.lst:HidemaruMacroInstaller用スクリプト
        ht_tools_dictionary.txt   :単語補完用辞書ファイル
        x64                       :フォルダ
        └ht_tools.dll            :64bit DLL

    hunspell関連に関数の実行には、ライブラリ(libhunspell.dll)と辞書ファイルが必要です。

    辞書ファイルの入手先

    EditorConfig に関してはEditorConfigを参照してください。

    2024/10/31 Version 1.29.00
    • 機能追加
    • 修正
      • editorconfig-core-c を更新(0.12.9)
        editorconfig-core-c で使用しているPCREを更新(PCRE2 10.37 --> 10.44)
    • その他
    2023/01/02 Version 1.28.00
    • 機能追加

      [DebugOut]関数を追加。

    • 修正

    • その他

    2022/11/04 Version 1.27.00
    • 機能追加

      FileOpenW関数、WrFileW関数、WrFileLineW関数、RdFileW関数、RdFileLineW関数、RdFileLine関数、AnalyzeEncoding関数を追加。

    • 修正

      IsUTF16LE関数の仕様を変更し、UTF-8のBOMも認識可能にした。関数名と機能が一致しないので、エイリアスとしてIsBOM関数を追加。

    • その他

    2021/10/25 Version 1.26.01(正式版)
    • 機能追加
      • DwmMoveWindow関数を追加。
    • 修正
    • その他
    2021/10/23 Version 1.26.00
    • 機能追加

      DwmGetWindowRect_Top関数、DwmGetWindowRect_Bottom関数、DwmGetWindowRect_Left関数、DwmGetWindowRect_Right関数、 DwmGetWindowRectAll関数、GetWindowRectAll関数を追加。

    • 修正

    • その他

    2021/07/03 Version 1.25.00(正式版)
    • 機能追加

      EditorConfigExecuteW関数を追加。(EditorConfigExecuteのユニコード版)

    • 修正

      • editorconfig-core-c を更新(0.12.5)
        editorconfig-core-c で使用しているPCREを更新(PCRE2 10.36 --> 10.37)
    • その他

    2021/04/17 Version 1.24.00a(正式版)
    • 機能追加

    • 修正

    • その他

      ドキュメント修正。 editorconfig-core-c のバージョンが間違っていたのを修正。

    2021/04/17 Version 1.24.00(正式版)
    • 機能追加

    • 修正

      • editorconfig-core-c を更新(0.12.4)
        editorconfig-core-c で使用しているPCREを更新(PCRE2 10.32 --> 10.36)

      • ExistSection/ExistSectionW関数で、誤検出する場合があったのを修正。

    • その他

      • editorconfig-core-c、PCRE2 の LICENCE を更新

目次へ

3.2 hmonig.dll

hmonig.dll(命名IKKI氏)は秀丸エディタ/秀丸メールで使用する、hmjre.dll 互換の正規表現検索DLLです。 Ver.0.5.9 より、 正規表現エンジンに鬼雲(Ver.5.10.0以降)を使用しています。

鬼車の基本的な正規表現については、鬼車のドキュメントを参照してください。 hmjre.dll の互換性から、"\<"、"\>"は使用可能です。

鬼雲で拡張された正規表現については、鬼雲のドキュメントを参照してください。

後方参照(タグ参照)は、\nの形式は、1~9までが指定可能です。 \k<n>、\k'n'も使用可能で、10以上も指定可能ですが、秀丸エディタの置換で、16以上は使用できません。(秀丸エディタ/hmjre.dllの制限)

Windows10 で動作確認しています。

hmonig.dllは、

の、2種類がありますが、Shift_JIS版は開発終了とし更新しません。今後はUnicode対応版のみになります。

  • ご意見・要望・バグ報告などあれば、送信フォームから送って下さい。

3.2.1 Unicode対応版

Unicode(秀丸独自コード)対応版です。 DLLの内部で、Unicode(UTF16-LE)に変換し、処理を行っています。その為、hmjre.dllと比較し、メモリ消費量は多くなり、遅くなると思います。

"\w"の扱いが変更になっていて、ASCIIコード範囲内のみマッチします。 (全角文字にはマッチしません。) その影響で、単語境界の認識も変更になっています。

Ver.0.5.9.0より、正規表現エンジンを鬼車(Ver.5.9.2ベース)から、鬼雲(Ver.5.12.0~)へ変更。


正式版

  • hmonig.dll Ver.0.8.7.0(2021/07/22) Unicode対応版のドキュメント
    32ビット/64ビットdll同梱(フォルダ構成を保った状態で解凍して下さい。)

    圧縮ファイルの内容

    COPYING_Onigmo_Oniguruma  :鬼車・鬼雲ライセンス条文
    hmonig.dll                :32bit DLL(Windows Vista以降用)
    hmonig.html               :説明ファイル
    HidemaruMacroInstaller.lst:HidemaruMacroInstaller用スクリプト
    hmonig_dictionary.txt     :hmonig.dllマクロ用関数の単語補完用辞書ファイル
    x64                       :フォルダ
    └hmonig.dll              :64bit DLL(Windows Vista以降用)
2021/07/20 Ver.0.8.7.0(正式版)
  • 秀丸エディタから呼び出された場合、「Jre2Compile」で false を返しているのに、 Jre2GetMatchInfo 系関数が呼び出される場合があったので対処。

    • Jre2Compile/Jre2CompileW で 正規表現コンパイル成功時は、明示的に HmOnigInfo構造体の OnigErrCode に ONIG_NORMAL をセットするようにした。 (エラー時はもともと、エラーコードをセットしている)
    • 内部関数 Jre2GetMatchInfo_Main / Jre2GetMatchInfo_MainW で、マッチデータ構造体へのポインタがNULLだった場合は、 Jre2Compile/Jre2CompileW が失敗したと判断して、falseを返すように修正。
2021/04/28 Ver.0.8.6.0a(正式版)
  • ドキュメント修正。
    変更履歴でおかしな箇所(2011/12/29変更分)があったので修正。
2021/02/20 Ver.0.8.6.0(正式版)
  • 検索の内部関数 Jre2GetMatchInfo_Main で、UTF-16LEとShift_JISの位置情報変換に失敗する場合があったのを修正。検索対象文字列よりマッチ範囲を狭くした場合、位置情報変換に失敗する場合があった。

Unicode処理になることによる違い
  • \x{...}で指定するコードポイントは、Unicodeで指定する必要がある。
  • Character Propertyが、全て使用可能。(\p{Alnum}等)
  • Shift_JISで漢字の範囲を示す、[亜-黑]という表現では、漢字のみを対象にすることはできない。\p{Han} を使用してください。
オリジナルの鬼車との違い
  • Unicodeで処理を行っていますが、\d、\s、\wは、ASCIIの範囲内のみ対象となります。 (\D、\S、\Wも同様に変更になります。) 全角文字等を対象に含めたい場合は、Character Property を使用してください。 (\p{Digit}で、全角を含む数字にマッチします。) Ver.0.5.9.0 以降から、正規表現の中に、(?a)、(?u) オプションが指定でき、マッチする内容を切り替えることが可能です。

    (?a):\w, \d, \s, POSIXブラケットは、非ASCII文字にマッチしない。
    (?u):\w, \d, \s, POSIXブラケットは、非ASCII文字にマッチする。
Unicode以外での違い
  • hmjre.dllとの互換性から、ブラケット「[]」内では、「\uxxxx」、「\u{xx}」が使用できますが、なるべく\x{...}を使用してください。(\uxxxxを指定する場合は、必ず4桁指定してください。)
  • \wの扱いが変更になっていることに伴い、単語境界の認識も変更になっています。
hmjre.dll との違い
  • 正規表現が多少異なります。
    前方一致指定/前方不一致指定では、固定長のみ有効です。
  • hmjre.dll と同様の、マクロ用関数も使用できます。
    • 全ての関数は実装していません。
    • Shift_JIS 範囲外の Unicode 文字を含む場合は、dllfuncw / dllfuncstrw を使用してください。従来の dllfunc / dllfuncstr では、Shift_JIS 範囲外の Unicode 文字は検索できません。
BRegIf.dll + bregonig.dll との違い
  • hmonig.dll 単独で動作する。
    鬼雲を静的リンクしています。あいまい検索を行うには、hmjre.dll が必要です。)
  • 鬼雲の正規表現はデフォルト(ruby)の仕様になっている。
  • BRegIf.dll の独自拡張のうち、"!"(パターンの否定)のみ使用可能。
  • BRegIf.dll 独自のマクロ関数は、実装していない。
  • \wは、英数字, "_" のみにマッチします。
  • bregonig.dll の独自拡張は使用できません。
マクロ用関数の注意

GetLast~の関数は、直前に実行した関数により、戻り値の単位が異なるので注意してください。

  • 通常関数の場合は、バイト単位。
  • ワイド文字対応関数は、文字単位。

ワイド文字を扱う場合は、wcs系の関数を使用してください。

3.2.2 Shift_JIS版

開発終了

BRegIf.dll+bregonig.dll(Shift_JIS専用)相当です。

  • 32ビット版 hmonig.dll 2010/07/19(Ver.0.1.8β版)
  • 64ビット版 hmonig.dll 2010/07/19(Ver.0.1.8β版)

添付のドキュメント

3.2.2.1 変更履歴(hmonig.dll)
3.2.2.1.1 SHIFT_JIS版
2009/07/12 Ver.0.1.0
  • BRegIf.dll+bregonig.dll相当となったので、テスト目的で公開。
2009/07/25 Ver.0.1.1
  • ヒットした扱いにするタグ指定が正常に動作していないバグの修正。

    通常の検索 :最後のタグが指定できない。
    マクロ用関数:指定が有効にならない。
  • バージョン番号が間違っていたので修正。

2009/11/23
  • 64bitのみ。JRE2構造体を修正
2009/12/06 Ver.0.1.2
  • 正規表現コンパイルに失敗した場合、クラッシュするバグの修正。
2009/12/25 Ver.0.1.3
  • 鬼車で、(a){2}z が、"aaz"にマッチしないバグの修正。
    https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=26143
    https://twitter.com/nalsh/statuses/6888780175
2010/01/11 Ver.0.1.4
  • 鬼車をVer.5.9.2に変更。
2010/01/13 Ver.0.1.4.1
  • (x64のみ) 鬼車Ver.5.9.2を更新。

    x64で、「fail to memory allocation」が出る場合があるので対処 (OnigStackIndex long → LONG_PTR へ変更)

2010/01/14 Ver.0.1.4.2
  • 鬼車Ver.5.9.2を更新(x86/x64のソースを統合)。
2010/01/30 Ver.0.1.5
  • エラーメッセージ取得時に、クラッシュする場合があるを修正。
2010/02/06 Ver.0.1.6
  • 秀丸エディタVer.8対応 マクロ関数のバッファを固定から可変へ変更
2010/07/10 Ver.0.1.7
  • マクロ用関数の修正

    GetLastMatchLength、GetLastMatchTagLengthで、文字列の先頭にマッチした場合、戻り値が-2になってしまうバグの修正(colder氏からの連絡による。)

2010/07/15 Ver.0.1.8
  • 鬼車
    http://redmine.ruby-lang.org/issues/show/3568
    Bug #3568: /(?<=a).*b/ =~ "aab" doesn't match
3.2.2.1.2 unicode対応版版
2010/01/28 Ver.0.2.0
  • 秀丸独自コード対応。
2010/01/30
  • エラーメッセージ取得時に、クラッシュする場合があるので対処。

    鬼車API呼び出し時に、エラーコードだけでなく、onig_new() の err_info が、必要な場合がある。秀丸側からはエラーコードのみで、JRE構造体が指定されないため、識別ができない。多少メッセージが不親切になるが、鬼車APIを修正。
    (エラーメッセージ取得時に err_info を使用しない関数を追加し対応。エラー発生時にメッセージを取得し保存しておく方法も考えたが、エラーの発生順とエラーメッセージ取得順が同じになるとは限らないので、メッセージの保存は行わない。)

2010/01/31
  • "\f"使用時に正常に動作しないので対処。

    Jre2SetCodePage が呼ばれない場合があり、その場合はShift_JISとして、動作するように修正。

2010/02/03
  • バイト-文字変換部で、データ終端の認識に失敗するバグの修正。
    Hidemarnet Explorer で、言語の異なるページに移動する場合、最初は元のコードページで検索が行われる。(タイトルタグの内容が、元のコードページで検索が行われる。表示後は、正常なコードページで検索)実際と異なるコードページで変換した場合、マルチバイトデータ終端の認識に失敗して、オーバーランしていた。終端位置と、マルチバイト文字のチェックを強化)
2010/02/06
  • マクロ用関数のワイド文字バージョンを追加。
    マクロ関数のバッファを10KB固定から可変へ変更(最大は 4M まで対応)
2010/02/09
  • \dが全角の数字にもマッチしてしまうので修正。(https://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=24544)
    \w も直るはずだが、マッチ範囲がおかしいので、未対応へ。
    \d、\sのみ対処、\wは要調査。
2010/02/10
  • \d、\sへの対応を、一度無効する。
    \dの対応もうまくいっていない。何故か漢字にもマッチする。
2010/02/11
  • パッチ適応後に、\d、\w、\sが、誤判定する件に対処。
    鬼車はアスキーコード範囲内のデータに対して、属性をテーブルで保持している。

    • OnigEncAsciiCtypeTable

    \w等は、ビット割り付け (ONIGENC_CTYPE_W) をおこなっていて、その属性を持つ範囲に、ビットを立てたテーブルを作成。マッチ時にテーブルにアクセスし、ビットをチェックし、判定を行っている。その為、UTF-16LEの下位ビットが、アスキーコード範囲内だと、誤判定していた。コードポイント値を取得して、ASCIIコード範囲内であることを確認後、チェックするように修正。

    • map_search、map_search_backward(regexec.c)
    • match_at(regexec.c)
2010/02/12 Ver.0.5.0
  • バージョン番号のみ変更。
    秀丸独自コード未対応版との、バージョン番号を離すだけ。
2010/02/17 Ver.0.5.1
  • ソースコードの整理のみ
2010/02/18
  • マッチしなかった場合、マッチ位置と長さを明示的に0(zero)を設定するようにした。
2010/02/19
  • 変数に初期値をセットするようにした。
2010/02/25
  • マクロ用関数で、"\uxxxx"を扱えるようにした。

  • 検索ダイアログを開いたまま、ウィンドウの切替を行うと、エラーとなる場合があるので対処。
    検索ダイアログを開いたまま、ウィンドウの切替を行うと、

    JreGetVersion、Jre2Open、Jre2Compile、Jre2Close

    が呼び出される。

    hmonig.dllでは、正規表現文字列がない場合、エラーにしていたが、チェックをしないようにした。(単純に、検索ダイアログを表示させると空文字がセットされるので、エラーチェックで引っかかっていた。)

2010/02/26
  • Jre2Compileのエラー処理部を変更
    Jre2Compile が false を返した場合、Jre2Close を呼ぶのを期待していたが、 Jre2Compile内で後始末を行うようにした。
  • 鬼車(Unicode)
    "。\Z"が、"です。\n"にマッチしないので、修正。 map_search、map_search_backward(regexec.c) 場当たり的対処なので、そのうち破綻するかも。
2010/02/27
  • 鬼車(Unicode)
    "\d\Z"が、"2\n"にマッチしないので、修正。まだ、マッチしない場合もあるが、"$"を使えばいいので、取りあえずここまでにしておく。
2010/03/02
  • 鬼車(Unicode)
    "\w\db\Z"が、"a2b\n"にマッチしないので、修正。
    forward_search_range、onig_search(regexec.c)
2010/03/03 Ver.0.5.1.1
  • 鬼車(Unicode)
    \s、\d、\wの変更を、rubyの変更をベースにUnicode のみ別途テーブルを定義することで対応。場当たり的な対処を、元に戻した。最初から、この方法でやれば、いろいろ苦労しなくて、すんだのだが、この状態にならないと、まじめに鬼車のソースを追いかけなかったし、動作も理解できなかった。
    testc、testuも修正。testuはUTF-16LEへ変更。
2010/03/05 Ver.0.5.2.0
  • Jre2GetMatchInfo_Mainで、対象文字列が""の場合は、falseを返していたが、空文字にマッチする正規表現もあるので、チェックを行わないようにした。
2010/03/06 Ver.0.5.3.0
  • マクロ用関数
    FindRegular~で、-2を返さないといけないのに、0を返していたので修正。メモリ確保に失敗した場合、戻り値が間違っていた。
  • マクロ用関数
    通常関数とワイド文字対応関数で、GetLast~関数の戻り値が異なっていたのであわせる。検索でマッチしなかった場合の戻り値が異なっていた。
2010/03/12 Ver.0.5.4.0
  • (?\tag-number) ヒットした扱いにするタグ指定の動作が、おかしかったので修正。 (マクロ関数も修正)
    タグ指定ありでタグに対するマッチ範囲がない場合、Trueを返していたので修正。 (falseを返す。)

    正規表現:(.+)\\t|$(?\\1)
    対象文字:\\n

    上記場合だと、正規表現にはマッチするが、\1には、マッチしていない状態もある。

2010/03/14
  • マクロ用関数でクラッシュするバグの修正。
    FindRegular → ReplaceRegular の順で実行すると、クラッシュする場合があるので対処。
2010/03/16 Ver.0.5.5.0
  • 各関数のメモリ確保部分を見直し。
    マクロ用関数でエラーがあった場合に、メモリの解放を行っていない箇所があったので、対処。
    • タグ取得関数で、マッチしていないタグを指定した場合に、明示的にマッチしていない状態を返すよう変更。
    • 動的にメモリを確保している箇所があったが、動的である必要がないので、変更。
2010/03/24 Ver.0.5.5.1
  • マクロ関数の最大バッファサイズを変更(4M → 1M)
    秀丸独自コード変換時に、最大で1バイトが4バイトまで増加するが、非対応DLLでは、独自コードで入力される事がないので1Mに変更。
2010/06/05 Ver.0.5.6.0
  • hmjre.dllを使用し、あいまい検索を可能にした。
2010/07/07 Ver.0.5.6.1
  • マクロ用関数の修正
    GetLastMatchLength、GetLastMatchTagLength で、文字列の先頭にマッチした場合、戻り値が-2になってしまうバグの修正(colder氏からの連絡による。)
2010/07/09
  • マクロ用関数の修正
    ReplaceRegularW、ReplaceRegularNoCaseSenseW 関数で、置換文字列にタグ参照を使用した場合、クラッシュする場合があるのを修正。
2010/07/15 Ver.0.5.7.0
  • 鬼車(Unicode)

    http://redmine.ruby-lang.org/issues/show/3568
    Bug #3568: /(?<=a).*b/ =~ "aab" doesn't match
2011/04/30 Ver.0.5.7.1
  • 鬼車(Unicode)

    http://redmine.ruby-lang.org/issues/show/4088
    Case Sensitivity in Regular Expressions with Lookbehind
2011/05/28 Ver.0.5.8.0
  • hmjre.dll V3.38対応 キャラクタクララス内の\u{xxxxx}
  • hmjre.dll V3.39対応
    ReplaceRegular / ReplaceRegularNoCaseSense 関数の変更に対応
  • ReplaceRegular(W) / ReplaceRegularNoCaseSense(W)で、全置換時、マッチしていない場合、対象文字列を返していたが、""を返すように修正。(hmjre.dllに合わせる)
    意図的ではないこと、全置換でない場合と動作が一致しないので、修正。
2011/09/03 Ver.0.5.9.0(β1)
  • 正規表現エンジンを、鬼車(Ver.5.9.2) → 鬼雲(Ver.5.11.0) へ変更。
2011/09/09 Ver.0.5.9.1(β2)
  • 正規表現エンジンを、鬼雲(Ver.5.11.0) → 鬼雲(Ver.5.11.1) へ変更。
2011/09/10 Ver.0.5.9.2(β3)
  • 正規表現エンジンを、鬼雲(Ver.5.11.1) → 鬼雲(Ver.5.11.2) へ変更。
2011/09/18 Ver.0.5.9.3(β4)
  • 正規表現エンジンを、鬼雲(Ver.5.11.2) → 鬼雲(Ver.5.11.3) へ変更。
2011/10/04 Ver.0.5.9.4(β5 未公開)
  • Unicode版の関数を追加 char を WCHAR に変更しただけ。
    hmjre.dllが対応していないので、Unicodeでの、あいまい検索は出来ません。ほとんどテストしていない状態です。

    JreGetVersionW
    Jre2OpenW
    Jre2SetCodePageW
    Jre2CompileW
    Jre2GetMatchInfoW
    Jre2GetMatchInfo_HmJreW
    Jre2CloseW
    JreGetTagPositionW
    GetJreMessageW
    GetDllVersionStrW
2011/10/18 Ver.0.5.9.5(β6)
  • 正規表現エンジンを、鬼雲(Ver.5.11.3) → 鬼雲(Ver.5.11.4) へ変更。
  • ソースの整理
2011/10/22
  • コンパイラを変更 VCEE 2008 → 2010 へ
2011/10/25 Ver.0.5.9.6(β7 未公開)
  • バージョン情報をリソースから取得するように変更。
  • GetDllVersionStr(W)を修正 DLLロード時に文字列を生成するように修正。
2011/11/03 Ver.0.5.9.7(β8)
  • 通常版APIで、UTF-8文字列が、有効になるよう修正。
    UT-F8を使用する場合は、Jre2SetCodePage で、65001(Unicode (UTF-8))を、指定すること。
2011/11/05 Ver.0.5.9.8(正式版)
  • 通常版API UTF-8 対応のコードを整理。
    ついでに、現状は UTF-8 以外は、全て UTF-16LE へ変換しているが、変換対象をShift_JIS のみに、切替可能にした。

    Shift_JIS 以外で、異常動作した場合の対処
    #define で切り替えるので、コンパイルが必要
2011/11/08 Ver.0.6.0.0(β1)
  • マクロ用関数を修正
    GetDllVersionStr(W)で、64bitOSの場合、"(x64)"と表示するようにした。
  • wcslen2、CheckSurrogatePairを追加
2011/11/20
  • マクロ用関数を修正
    ReplaceRegular / ReplaceRegularW マッチ箇所が幅がない場合、検索がループしてしまいバッファがあふれてしまうバグの修正。(colder氏からの連絡による。)
2011/12/10 Ver.0.6.0.1(β2)
  • 正規表現エンジンを更新。

    2011/12/01: [bug]  /a{2}/i doesn't match 'AA'.

    通常検索では、ほぼ影響なし。マクロ関数に影響あり。 (通常の検索は、大文字小文字を無視する処理は、秀丸エディタ本体側で行っている為、関係ないが、正規表現にオプションを埋め込んでいる場合は関係あり)

2011/12/13 Ver.0.6.0.2(正式版)
  • 正規表現エンジンを更新。鬼雲(Ver.5.11.4 + bug fix) → 鬼雲(Ver.5.12.0)
2011/12/20 Ver.0.6.1.0(β1)
  • 検索時のデフォルトオプション指定を、直接指定を止めて HMONIG_DEF_OPTION を定義し、指定するように変更。
2011/12/29
  • 正規表現エンジンを更新。鬼雲(Ver.5.12.0) → 鬼雲(Ver.5.12.1) へ変更。
2011/12/31
  • API(名前付き捕獲式集合用)を追加
    • JreNameToTags
    • JreNameToTagsW
2012/01/04
  • ReplaceRegular(W) / ReplaceRegularNoCaseSense(W) でバッファの確保に失敗する場合があったので、対処。
  • マクロ用関数の追加
    • GetLastMatchNameToTagCnt
    • GetLastMatchNameToTagCntW
    • GetLastMatchNameToTags
2012/01/06 Ver.0.6.1.1(β2)
  • #defineでスペルが間違っていた箇所があったので修正
2012/01/07
  • UTF-8 を設定した場合、JreNameToTags が正常に動作しなかったバグの修正。 (内部処理をUTF-16LEで、動作させている為。)
  • API(名前付き捕獲式集合用)を追加
    • JreGetCaptureList
2012/01/09
  • APIを追加
    • JreGetTagCnt
  • マクロ用関数を追加
    • GetLastMatchNameCnt
    • GetLastMatchNameCode
    • GetLastMatchName
    • GetLastMatchNameW
2012/01/11
  • GetLastMatchNameW で、クラッシュする場合があったので修正。
2012/01/21 Ver.0.6.1.2(正式版)
  • 正規表現エンジンを更新。鬼雲(Ver.5.12.1) → 鬼雲(Ver.5.13.0) へ変更。
2012/02/05 Ver.0.6.2.0(正式版)
  • 正規表現エンジンを更新。鬼雲(Ver.5.13.0) → 鬼雲(Ver.5.13.1) へ変更。
2012/03/31 Ver.0.6.3.0(正式版)
  • 正規表現エンジンを更新。鬼雲(Ver.5.13.1) → 鬼雲(Ver.5.13.2) へ変更。
2012/05/30 Ver.0.6.4.0(正式版)
  • hmjre.dllの解放し忘れがあったので、修正。
2012/06/03
  • マクロ用関数の追加
    サロゲートペアも一文字扱いするunicode用関数

    • wcsleftstr2
    • wcsrightstr2
    • wcsmidstr2
    • wcsstrstr2
    • wcsstrrstr2
  • 正規表現エンジンを更新。鬼雲(Ver.5.13.2) + Ruby r35724へ変更

2012/06/29 Ver.0.6.5.0(正式版)
  • 正規表現エンジンを更新。
    鬼雲(Ver.5.13.2) + Ruby r35724 + r36070 + r36072へ変更
  • マクロ用関数の修正
    ReplaceRegular(W)/ReplaceRegularNoCaseSense(W)で、正規表現に複数回マッチする場合、後方参照が正常に行われなかったバグの修正
2012/11/03 Ver.0.6.6.0(正式版)
  • 正規表現エンジンを更新。鬼雲(Ver.5.13.2) → 鬼雲(Ver.5.13.3) へ変更。
2013/03/17 Ver.0.6.7.0(正式版)
  • 正規表現エンジンを更新。鬼雲(Ver.5.13.3) → 鬼雲(Ver.5.13.4) へ変更。
2013/04/18 Ver.0.6.8.0(未公開)
  • 正規表現エンジンを更新。鬼雲(Ver.5.13.4) → 鬼雲(Ver.5.13.4) + #8210 fix へ変更。
2013/05/30 Ver.0.6.8.1(正式版)
  • 正規表現エンジンを更新。
    鬼雲(Ver.5.13.4) + #8210 fix + Merge pull request #17 へ
  • ドキュメント修正
2013/06/11 Ver.0.6.9.0(正式版)
  • 正規表現エンジンを更新。
    鬼雲(Ver.5.13.4) + 2013/05/31までの変更内容
  • Jre2GetMatchInfo/Jre2GetMatchInfo_HmJre 修正
    検索開始位置が、対象文字列の最後だった場合に、先頭から検索してしまっていたバグの修正。 (UTF-16LEへの変換時のバグ)
2013/07/06 Ver.0.7.0.0(正式版)
  • 正規表現エンジンを更新。鬼雲(Ver.5.13.4) + bug fix → 鬼雲(Ver.5.13.5) へ変更。
2013/09/07 Ver.0.7.1.0(β1)
  • エラーメッセージが取得できない場合があったのを修正。

  • Jre2Compile / Jre2CompileW で 正規表現文字列が空かどうかのチェックを有効にした。

    以前は、検索ダイアログを開いたまま、ウィンドウの切替を行うと、検索文字列がなくても、 JreGetVersion、Jre2Open、Jre2Compile、Jre2Close が呼び出された。 hmonig.dllでは、正規表現文字列が空だとエラーにしていた為、ウィンドウを切り替えるたびにエラーダイアログが表示されてしまうので、チェックを無効化していた。秀丸エディタVer.8.32では、正規表現文字列が空の場合、JreGetVersion のみ呼び出されるように変更になっていた為、チェックを有効にした。

2013/09/16
  • 正規表現エンジンを更新。コンパイルスイッチを変更。(USE_COMBINATION_EXPLOSION_CHECK を有効化) トラックバックが多くなる場合でも、遅くならないようにした。
2014/02/04
  • ドキュメント変更のみ(ヘルプファイルサイトのURL変更)
2014/04/12 Ver.0.7.1.1(β2)
  • 正規表現エンジンを更新。鬼雲(Ver.5.13.5) → 鬼雲(Ver.5.13.5) + Apr 12, 2014 までの fix へ変更。
2014/04/20
  • 正規表現エンジンを更新。鬼雲(Ver.5.13.5) → 鬼雲(Ver.5.13.5) + Apr 20, 2014 までの fix へ変更。
2014/07/01 Ver.0.7.1.2(正式版)
  • 正規表現エンジンを更新。鬼雲(Ver.5.13.5) → 鬼雲(Ver.5.14.1)
2014/07/27 Ver.0.7.2.0(正式版)
  • 正規表現エンジンを更新。鬼雲(Ver.5.14.1) → 鬼雲(Ver.5.14.2)
2014/09/13 Ver.0.7.3.0(正式版)
  • 正規表現エンジンを更新。鬼雲(Ver.5.14.2) → 鬼雲(Ver.5.15.0)
2015/01/31 Ver.0.7.4.0(β1)
  • 正規表現エンジンを更新。鬼雲(Ver.5.15.0) + Oniguruma 5.9.6更新分

  • マクロ用関数の追加
    unicodeの正規化関連関数を追加

    • GetNormalizeString
    • IsNormalized

    Windows XP用DLLでは動作しません。

2015/05/02 Ver.0.7.4.1(正式版/未公開)
  • 開発環境を変更
    "Visual Studio 2010 Express Edtion" から "Visual Studio Community 2013" へ
2015/12/19 Ver.0.7.4.2(正式版)
  • 正規表現エンジンを更新。鬼雲(Ver.5.15.0) + Oniguruma 5.9.6更新分 + Unicode 8.0.0対応
2016/01/25 Ver.0.7.4.2a(正式版)
  • ドキュメント hmonig.html の修正
    ドキュメント作成を rd(rdtool) から、Markdown(Pandoc)に変更した事による、各種記述ミスの修正。
2016/03/05 Ver.0.7.5.0(β1)
  • 正規表現エンジンを更新。\g{n}を有効にした。
2016/03/12 Ver.0.7.5.1(β2)
  • 未公開関数で、バッファオーバーランする可能性があったので修正。
  • マクロ用関数 ReplaceRegular~ でも、\g{n}を使えるようにした。
2016/07/01 Ver.0.7.5.2(正式版)
  • マクロ用関数 FindRegular、FindRegularNoCaseSense、 FindRegularW、FindRegularNoCaseSenseW で、マッチした位置を正常に返さない場合があったのを修正。(\K使用時にマッチ位置がおかしい)
2016/10/21 Ver.0.7.6.0(β1)
  • マクロ用関数の追加(要秀丸エディタVer.8.66β7以降)
    • SplitRegular(正規表現を使用した文字列分割)
2016/10/26
  • 正規表現エンジンを更新。鬼雲(Ver.5.15.0 master branch 2016/10/26取得分まで)
2016/11/01 Ver.0.7.6.1(β2)
  • マクロ用関数で引数のチェック部分を変更
2016/11/02
  • 正規表現エンジンを更新。鬼雲(Ver.5.15.0 master branch 2016/11/02取得分まで)
2016/12/10 Ver.0.7.6.2(正式版)
  • 正規表現エンジンを更新。鬼雲(Ver.6.0.0)
2017/01/17 Ver.0.7.7.0(正式版)
  • 正規表現エンジンを更新。鬼雲(Ver.6.1.0)
2017/01/29 Ver.0.7.8.0(正式版)
  • 正規表現エンジンを更新。鬼雲(Ver.6.1.1)
2017/05/16 Ver.0.7.9.0(正式版)
  • 正規表現エンジンを更新。鬼雲(Ver.6.1.2)
2017/09/28 Ver.0.8.0.0(正式版)
  • 正規表現エンジンを更新。鬼雲(Ver.6.1.3 + master branch 2017/09/28取得分まで)
2017/10/06 Ver.0.8.0.0a(正式版)
  • ドキュメント修正。
    ドキュメント作成を rd(rdtool) から、Markdown(Pandoc)に変更した事による、各種記述ミスの修正。
2017/11/05 Ver.0.8.0.0b(正式版)
  • ドキュメント修正。
    Pandoc のバージョンアップによる仕様変更への対応と、 JreGetTagPositionの説明を修正。
2018/03/02 Ver.0.8.0.0c(正式版)
  • ドキュメント修正。
    過去ログサイト、ヘルプファイルサイトのURLを変更。
2018/04/17 Ver.0.8.0.0d(正式版)
  • ドキュメント修正。
    各部のURLを変更。
2019/01/31 Ver.0.8.1.0(正式版)
  • 正規表現エンジンを更新。鬼雲(Ver.6.2.0 + Jan 31, 2019 までの修正)
2019/07/03 Ver.0.8.2.0(β1 未公開)
  • マクロ関数 SplitRegular で、バッファーオーバーランが起きる場合があったので対処。 (バッファサイズのチェックミス)
2019/07/04 Ver.0.8.2.1(正式版)
  • 他のマクロ関数も見直し。
2019/07/06
  • freedll時に、マクロ関数用の戻り値を格納する文字列バッファをゼロクリアしてから解放するようにした。
  • ドキュメント修正。(http://www.yamada-labs.com/software/spec/jre/ へのリンクを削除)
2019/08/25 Ver.0.8.3.0(正式版)
  • 正規表現エンジンを更新。鬼雲(Ver.6.2.0 + master branch 2019/08/25取得分まで)
2020/03/22 Ver.0.8.3.0a(正式版)
  • ドキュメントの修正。
2020/04/11 Ver.0.8.4.0(β1)
  • Jre2SetCodePage を呼び出さなかった場合、Shift_JIS で動作するようにしていた箇所を見直し。初期化の位置を変更、引数チェック部分も見直し。
  • Jre2GetMatchInfo_V318、Jre2GetMatchInfo_V500 に対応。ただし、あいまい検索用の引数、構造体は無視します。
  • ドキュメントの修正。(関数名 Jre2GetMatchInfo -> Jre2GetMatchInfo_HmJre)
  • XPを動作対象外へ。
2020/04/20 Ver.0.8.4.1(正式版)
  • 検索の内部関数 Jre2GetMatchInfo_Main で、明示的に型変換を行うように修正。
2020/04/25
  • 鬼車への対応を修正(Ver.6.8.2 -> Ver.6.9.5)
2020/05/03
  • バッファの初期化が抜けていた箇所があったので修正。

  • デバッグ用関数を修正

    • マジックナンバーをマクロ定義に変更
    • ループしてしまう条件があったので修正
2020/06/13 Ver.0.8.4.2(正式版)
  • あいまい検索の「設定」が開けなくなっていたのを修正。
2020/07/17 Ver.0.8.5.0(正式版)
  • Jre2GetMatchInfo_V500 を修正。秀丸エディタ本体で、「選択した範囲」が「文字単位」の場合、ヒットしない場合があるので対処。
2020/07/19
  • デバッグ用関数を修正
2021/02/20 Ver.0.8.6.0(正式版)
  • 検索の内部関数 Jre2GetMatchInfo_Main で、UTF-16LEとShift_JISの位置情報変換に失敗する場合があったのを修正。検索対象文字列よりマッチ範囲を狭くした場合、位置情報変換に失敗する場合があった。
2021/04/28 Ver.0.8.6.0a(正式版)
  • ドキュメント修正。
    変更履歴でおかしな箇所(2011/12/29変更分)があったので修正。
2021/07/20 Ver.0.8.7.0(正式版)
  • 秀丸エディタから呼び出された場合、「Jre2Compile」で false を返しているのに、 Jre2GetMatchInfo 系関数が呼び出される場合があったので対処。

    • Jre2Compile / Jre2CompileW で 正規表現コンパイル成功時は、明示的に HmOnigInfo 構造体の OnigErrCode に ONIG_NORMAL をセットするようにした。 (エラー時はもともと、エラーコードをセットしている)
    • 内部関数 Jre2GetMatchInfo_Main / Jre2GetMatchInfo_MainW で、マッチデータ構造体へのポインタがNULLだった場合は、 Jre2Compile / Jre2CompileW が失敗したと判断して、false を返すように修正。

目次へ

4 色々なDLLの使い方

公開されているdllの使い方などの紹介です。

4.1 macrodll.dllの使い方

あべのりゆき氏が公開されているDLLです。秀丸エディタのTex用マクロである「祝鳥」に含まれています。リストボックスの表示や各種ファイル操作が可能です。

DLL単体でも公開もされています。単体で入手する場合は、「macrodll.dll関数一覧」もダウンロードしましょう。

ここのサンプルを動かす場合は、DLLを秀丸エディタ本体と同じ場所に置いてください。

4.1.1 COM/OLEの操作

2009/02/28
IE関連の注意書き追加

macrodll.dllのVersion.0.81より、COM/OLEを操作する関数が追加されました。これまでは、DDE通信や起動オプションでしか、他のアプリケーションと連携する方法がありませんでしたが、(アプリケーションが対応していれば) COM/OLEを使った連携が可能になります。

例えば、

  • InternetExplorerの操作
  • Word/Excel等Officeの操作
  • Windows Script Hostの機能を利用

等が可能です。DDE通信などより細かい制御が、可能になります。

COM/OLEの操作は、"Windows Script Host(WSH)"関連を調べるといいです。以下のページが参考になります。

個別のアプリケーションを操作する場合は、アプリケーションの解説書や取説を参考にしてください。

COM/OLEの命令を調べるには、「オブジェクトビュアー」等があると便利です。

Word、Excel等を所有している場合、似たような機能を持つ「オブジェクトブラウザ」が使えます。「Visual Basic Editor」を起動し、「ツール」->「参照」で、使いたいCOMオブジェクトを選択し、 "F2"キーを押すと、「オブジェクトブラウザ」が表示され、プロパティ等を確認できます。

4.1.1.1 Windows Script Hostを使って出来ること

Windows Script HostはWindows98以降に標準で搭載されています。ヘルプがない場合は、ダウンロードしましょう。また、最新版でなければ、最新版にしましょう。

  • Microsoft Windows スクリプト テクノロジ

  • Microsoft スクリプト センター

  • FileSystemObjectを使うと各種ファイル操作が可能です。

    • 移動、コピー、削除、属性操作
    • アクセス、更新された日時の取得
  • ショートカットの作成が可能です。マクロを実行する秀丸エディタのショートカットが作成出来ます。

  • アプリケーションの実行。秀丸マクロのrun文と同じですが、実行状態(最大化、最小化、非表示など)を設定できます。また、終了コードを受け取れます。

詳細はヘルプを参照。

4.1.1.2 COM/OLEの例

InternetExplorerを使った例です。同じ機能を、WSHと秀丸マクロで作成しました。実際には、エラー処理が必要になります。

注意InternetExplorerの例は、主にIE6を対象にしています。IE7以降だと、正常に動作しない場合があります。

WSHの記述例

'URLを取り込み
url = InputBox("URLを入力してください。","IEのテスト","https://hide.maruo.co.jp/")
Set WshIE = CreateObject("InternetExplorer.Application")
'非表示状態なので、表示状態へ
WshIE.Visible = true
'指定されたURLを表示
WshIE.Navigate(url)
'表示されるまでまつ
busy = WshIE.busy
state = WshIE.ReadyState
do while(busy = true and state <> 4)
    '1秒タイマー
    Wscript.Sleep(1000)
    busy = WshIE.busy
    state = WshIE.ReadyState
loop
msgbox "表示完了"
Set WshIE = Nothing
wscript.quit

秀丸マクロ+macrodll.dllの記述例

loaddll hidemarudir + "\\macrodll.dll";
//URLを取り込み
$url = input("URLを入力して下さい。","https://hide.maruo.co.jp/");
#ie = dllfunc("OLE_INITIALIZE","InternetExplorer.Application");
//非表示状態なので、表示状態へ
#ret = dllfunc("OLE_SETPROPERTYINT",#ie, "Visible",1);
//指定されたURLを表示
#ret = dllfunc("OLE_INVOKE",#ie, "Navigate","s", $url );
//表示されるまでまつ
#busy = dllfunc("OLE_GETPROPERTYINT", #ie, "busy");
#state = dllfunc("OLE_GETPROPERTYINT", #ie, "ReadyState");
while(#busy != 0 && #state != 4){
    //1秒タイマー
    #en = tickcount + 1000;
    while(tickcount < #en){};
    #busy = dllfunc("OLE_GETPROPERTYINT", #ie, "busy");
    #state = dllfunc("OLE_GETPROPERTYINT", #ie, "ReadyState");
}
message "表示完了";
#ret = dllfunc("OLE_CLEAR");
freedll;
endmacro;
4.1.1.3 マクロのサンプル

COM/OLE操作のサンプルです。マクロを実行すると、新規ファイルを開き、経過を出力します。

4.1.1.3.1 サンプルその1

com_test.mac

InternetExplorerの操作を行います。指定されたURLを開き、URLショートカットを作成します。

4.1.1.3.2 サンプルその2

com_test2.mac

標準入出力へのアクセスを行います。実行時すると、コマンドプロンプトが表示されます。秀丸エディタをアクティブにすると、InputBoxが表示されているので、適当に入力してください。ソートして出力します。ソートはsort.exeを使用しています。

注意環境により、このマクロは正常に実行されない場合があります。マクロを実行時、入力を終了しても、コマンドプロンプトが表示されたままになる場合は、タスクマネージャー等で"sort.exe"を強制終了させてください。

2008/09/15追記 正常に動作しない原因は、Windows標準じゃないsort.exeを使用していたためでした。

4.1.1.3.3 サンプルその3

com_test3.mac

ファイル操作のサンプル。実行時すると、InputBoxが表示されので、適当に入力してください。入力された内容をファイルに出力し、コピー、移動を行います。マクロ実行後、マクロと同じ場所に"COM_TEST3_TEST.TXT"が作成されるので、削除してください。

4.1.1.3.4 サンプルその4

com_test4.mac

起動済みのInternetExplorerから情報を取得。 URLショートカットを作成します。

4.1.1.3.5 サンプルその5

com_test5.mac

起動済みのInternetExplorerから情報を取得。選択している文字列を取得します。

注意選択文字数が多いとエラーになります。

4.1.1.3.6 サンプルその6

com_test_sleipnir.mac

タブブラウザの"Sleipnir"を制御。(動作確認は Ver.2.49) 指定したURLを開きます。既にタブで開いている場合はリロード、そうでない場合は、新規タブで開きます。

"Sleipnir"を制御するには、"Sleipnirオプション"を変更する必要があります。クライアント->全般->「スクリプトによるクライアントの操作を許可する」にチェックを入れること。

17行目を書き換えると、Lunascapeでも動きます。動作確認は、Lunascape Ver.4.06

変更前

00017|#Browser = dllfunc("OLE_INITIALIZE", "Sleipnir.API");
00018|if(#Browser == 0){
00019|    $ERR =  "Sleipnirオブジェクト作成に失敗";
00020|    goto ERRMSG;
00021|}

変更後  "Sleipnir.API" -> "Lunascape2.LunascapeAPI"

00017|#Browser = dllfunc("OLE_INITIALIZE", "Lunascape2.LunascapeAPI")
00018|if(#Browser == 0){
00019|    $ERR =  "Lunascapeオブジェクト作成に失敗";
00020|    goto ERRMSG;
00021|}

目次へ

4.1.2 文字列回収の使い方

2010/03/18 6項を追加。

macrodll.dllにある"文字列回収"機能の説明です。("COLLECTSTR~"関数の使い方になります。)文字列回収とは、ほぼGREPと同じ機能です。特徴的なのは、正規表現のグルーピングを使い、マッチした行全体ではなく、必要な部分を切り出せることです。

使い方

  1. 正規表現を使用するので、SETHMJREDLL関数を呼びだす。 SETHMJREDLL関数を呼びさないと、正規表現を使った検索がうまくいかないので注意。

    #ret = dllfunc("SETHMJREDLL", hidemarudir + "\\hmjre.dll");
  2. COLLECTSTR_SET関数で、出力先を設定。結果をファイルに出力するか、COLLECTSTR_GETSTR関数を使って取り出すかを選択します。

  3. COLLECTSTR_SETOPT関数で、検索オプションを設定。

    • "aimai" : 曖昧検索を使用
    • "word" : 単語の検索を使用
    • "CaseSense" : 大文字小文字を区別する

    以上のオプションが設定できるので、必要なら、"true"をセットします。

  4. COLLECTSTR_COLLECT関数で検索実行(出力先がファイルなら結果はファイルへ出力)

    • 対象のファイルを指定
    • 検索に使う正規表現
    • 実際に出力する文字列をタグで指定する

    切り出す文字列は、正規表現でグルーピングを行い、タグ番号で指定します。

  5. COLLECTSTR_SET関数で、出力先でファイルを指定しない場合は、 COLLECTSTR_GETSTR関数でマッチした部分を取得します。 macrodll.dllのバージョンにより取得方法が異なります。

    • Version.0.81以下

      COLLECTSTR_ISMORESTR関数を使い、取り出せる文字の有無をみて、COLLECTSTR_GETSTR関数で取り出します。

      while(dllfunc("COLLECTSTR_ISMORESTR")){
          $$s = dllfuncstr("COLLECTSTR_GETSTR");
      }
    • Version.0.82以上

      COLLECTSTR_GETDATASIZE関数で、取得した文字列の数を取得し、COLLECTSTR_GETSTR関数で、何番目の文字を読み出すか指定し取り出します。

      ##n = dllfunc("COLLECTSTR_GETDATASIZE");
      ##i = 0;
      while(##i < ##n){
          $$s = dllfuncstr("COLLECTSTR_GETSTR",##i);
          ##i = ##i + 1;
      }
  6. COLLECTSTR_CLEARSTR関数で、文字列をクリアする。 COLLECTSTR_COLLECT関数を続けて行う場合は、実行前にCOLLECTSTR_CLEARSTR関数を実行し、文字列をクリアすること。

目次へ

4.2 秀丸パイプの使い方

秀丸パイプは、m.fujimoto氏作成の変換モジュールです。秀まるおのホームページより、変換モジュールライブラリからダウンロード出来ます。

本来、秀丸パイプは変換モジュールなんですが、マクロからも呼び出せるように、関数が用意されています。使い方は通常のdllを使う方法と同じです。("HmPipe.hmf"をloaddllする。)
filter文、filter関数からも使用可能です。

使い方は、以下のようになります。

dllfuncstrで呼び出す場合(秀丸パイプ付属のテキストファイルから抜粋)

■使い方(マクロ編)
 
  1.関数仕様
    HmPipeRun(instr, progname, param);
      instr     入力文字列
      progname  プログラム名
      param     プログラムの引数(省略可)
 
  2.使用例
    --------------------------------------------
    loaddll "HmPipe.hmf";
    $outstr = dllfuncstr("HmPipeRun", $instr, "sort");
    freedll;
    --------------------------------------------

filter文で呼び出す場合(秀丸パイプ付属のテキストファイルから抜粋)

○Ver1.02
・秀丸マクロのfilter関数から呼ばれたときに引数を取れるようにしました。
  引数では、秀丸パイプから起動するプログラム名と、その引数を指定するこ
  とができます。プログラム名と引数は"|"で区切って指定してください。
 
  filter $HmPipe, "HmPipe", "foo.exe|arg1 arg2";
 
・ワイドキャラクターを扱えるようになりました。
  ワイドキャラクターのプログラムを作成する場合、標準入力、標準出力はす
  べてUTF-16LE(BOMなしリトルエンディアンUTF16)として扱ってください。標
  準出力については、実行プログラムがASCIIやShift_JISでエラーを返すと思
  うので、Unicodeかどうかの判定をしています(厳密には判定できませんが)。
 
  秀丸マクロからfilterを使って呼び出すときは、関数名を"HmPipeW"とします。
 
  filter $HmPipe, "HmPipeW", "xxx.exe|arg1 arg2 arg3";

この、"秀丸パイプ"を使うことで何が出来るかというと、秀丸のマクロでは出来ないことを、他のプログラムを使用して行う事が可能になります。

他のプログラム
sed、gawk、ruby、Perl、WSH等各種スクリプト言語や、標準入出力を使うプログラムなど。

他のプログラムと連携するには、run文等を使えば出来ますが、標準出力をマクロで直接受け取れることが最大の利点です。

ただし、1つの文字列型変数は、8000文字(バイト?)程度が限界なので、注意が必要です。出力が多い場合は、"run ~ >con" を使い、秀丸エディタ上に出力させ、取り込むしかありません。(tipsページファイル一覧の取得 を参照してください。)

Ver.8

例として、OSに標準搭載されている、WSH(cscript.exe)を使用した時間の計算です。現在時刻から2時間後の時間を返します。

  • WSHのスクリプト(時間計算処理の本体) timeadd.vbs 結果を標準出力に出している。

    Option Explicit
    Dim n
    '標準入力を取り込み、スペースで分割
    n = split(trim(WScript.StdIn.ReadLine & " 0 0 0 0"), " ",4)
    '時間の演算
    Wscript.echo TimeSerial(Hour(now) + n(0), Minute(Now) + n(1), Second(Now) + n(2))
  • 呼びだす秀丸マクロ 標準入力として"2 0 0"を送る。(2時間0分0秒)

    loaddll "HmPipe.hmf";
    $t = time;
    $outstr = dllfuncstr("HmPipeRun", "2 0 0", "cscript.exe", "//nologo timeadd.vbs");
    message "現在時:" + $t + "\n2時間後:" + $outstr;
    freedll;
    endmacro;
  • 出力例

    現在時:00:50:07
    2時間後:2:50:08

目次へ

4.3 hmjre.dllの使い方

2010/03/22 マクロ関数を追加

hmjre.dllは、秀丸エディタVer.4.00から使用されている正規表現検索用のDLLです。秀丸エディタの検索・置換で使用されています。このDLLには、マクロから呼び出せる関数があります。

Fuzzy_OptionDialog関数
あいまい検索の設定ダイアログボックスを表示します。
JreGetVersion関数
hmjre.dllのバージョン番号を返します。
FindRegular, FindRegularNoCaseSense関数(V1.50以降から)
FindRegular関数は、特定の文字列から特定の正規表現パターンのマッチングをして、ヒットした場合はその位置を返します。 FindRegularNoCaseSense関数は、大文字/小文字を区別しないで検索する以外は、 FindRegular関数とまったく同じです。
GetLastMatchLength関数(V1.50以降から)
FindRegularまたはFindRegularNoCaseSense関数で0以上の値が返った場合に、マッチした文字列の長さを返します。
EnvChanged関数(V1.71以降から)
あいまい検索関係の設定を、レジストリから読み込み直しします。
GetLastMatchTagPosition(V1.91以降から)
FindRegularまたはFindRegularNoCaseSense関数で0以上の値が返り、正規表現中にタグが指定されていた場合、指定されたタグの位置を返します。
GetLastMatchTagLength(V1.91以降から)
FindRegularまたはFindRegularNoCaseSense関数で0以上の値が返り、正規表現中にタグが指定されていた場合、指定されたタグにマッチした文字列の長さを返します。
FindGeneral(V1.97以降から)
「大文字/小文字の区別」、「正規表現」、「あいまい検索」の3つをそれぞれについて、 ON/OFFをパラメータで指定して検索を実行。
ReplaceRegular, ReplaceRegularNoCaseSense(V1.98以降から)
文字列から、正規表現パターンのマッチングを行い、ヒットした場合は置換を実行します。置換した結果の文字列を返します。ヒットしなかった場合や正規表現のコンパイルエラーの場合は""を返します。 ReplaceRegularNoCaseSense関数は、大文字/小文字を区別しないで検索する以外は、 ReplaceRegular関数とまったく同じです。
SetUnicodeIndexAutoConvert(V3.13以降)

Hmjre.dll側での文字コードインデックス自動変換をON/OFFする関数。関数にユニコード文字を含む文字変数を渡す場合、ユニコード文字1文字が4バイトのデータとして渡される形となります。その為、通常の文字操作関数で、Hmjre.dllの戻り値を、そのまま使用すると、通常の文字インデックスの値とずれることになります。この関数を使用することにより、通常の文字操作関数で使用するのに問題のない値に、自動的に変換することが可能です。
(秀丸エディタ V8.00β45以上、および秀丸メール V5.34β9以上で対応)

実際の使い方は、turukame.3:05320を参照してください。

関数の詳細は、hmjre.dllのヘルプを参照してください。

マクロ作成時に、文字列変数に対して、正規表現を使った検索を行うには、

  • FindRegular, FindRegularNoCaseSense関数
  • FindGeneral関数
  • GetLastMatchLength関数

を使用します。

置換を行うには、

  • ReplaceRegular, ReplaceRegularNoCaseSense関数

を使用します。

"FindRegular"は見つけた位置(先頭は0)を、"GetLastMatchLength"はマッチした文字列の長さを返す為、 midstr関数を使えば、マッチした文字列を取得できます。

4.3.1 hmjre.dllを使った検索の注意点

  • "^"は検索文字列の先頭を示します。検索文字が"a1111\nb2222"とある場合、マッチするのは"a"の前だけで、 "b"の前にはマッチしません(検索開始位置を変えてもマッチしない)。 hmjre.dllでは、"^"は「行頭」ではなく「検索文字列の先頭」を示します。

  • "$"は基本的に「検索文字列の末尾」を示します。例外的に、行末(\nの前)にマッチする仕様になっています。

基本的に、行単位で処理を行うことを、前提としている為、 "$"が、\nの前にマッチする事が、特殊と考えた方がいいかもしれません。 (検索等で、複数行の処理が苦手となっている原因)

実験用マクロ

debuginfo 1;
//         012345 678901
$target = "a1111\nb2222";
loaddll "hmjre.dll";
if(!result){
  message "DLLのロードに失敗しました。";
  endmacro;
}
call hmjre_check "^";
call hmjre_check "$";
freedll;
endmacro;
hmjre_check:
#st = 0;
while(1){
  #ret = dllfunc("FindRegular",$$1, $target, #st);
  //正規表現にマッチすると-1より大きい値を返す。
  if(#ret > -1){
    //マッチした部分の長さを取得
    #len = dllfunc("GetLastMatchLength");
    debuginfo $$1 + ": #ret=" + str(#ret) + " #len=" + str(#len) + " #st=" + str(#st);
  }else{
    break;
  }
  #st = #ret + 1;
}
return;

実行結果

//         012345 678901
$target = "a1111\nb2222";
^: #ret=0 #len=0 #st=0    --> 先頭にしかマッチしない。
$: #ret=5 #len=0 #st=0    --> 改行の前にマッチ
$: #ret=11 #len=0 #st=6   --> 検索対象の末尾にマッチ

4.3.2 hmjre.dllを使ったマクロの例

4.3.2.1 ファイルパスの分割

ファイル名をドライブ、各フォルダ、ファイル名に分割します。

  • 正規表現:[^\]+  ""を含まない文字列
$name = "C:\\Program Files\\Hidemaru\\hidemaru.exe";
loaddll "hmjre.dll";
if(!result){
    message "DLLのロードに失敗しました。";
    endmacro;
}
//ファイルの各要素を分割
// C:\Program Files\Hidemaru\hidemaru.exe
// 01234567890123456789012345678901234567
// 12 1234567890123 12345678 123456789012
// 0  0             1        2
// 0  3             7        6
#st = 0;
while(1){
    #ret = dllfunc("FindRegular","[^\\\\]+", $name, #st);
    //正規表現にマッチすると-1より大きい値を返す。
    if(#ret > -1){
        //マッチした部分の長さを取得
        #len = dllfunc("GetLastMatchLength");
        $match  = midstr($name, #ret, #len);
        message "match -> " + $match + "\n#ret=" + str(#ret) + " #len=" + str(#len);
    }else{
        break;
    }
    #st = #st + #len + 1;
}
freedll;
endmacro;

実行結果

1回目
  match -> C:
  #ret=0 #len=2
2回目
  match -> Program Files
  #ret=3 #len=13
3回目
  match -> Hidemaru
  #ret=17 #len=8
4回目
  match -> hidemaru.exe
  #ret=26 #len=12

今回はファイルのパスを分解しましたが、正規表現を変えれば、splitの替わりになるかな?

4.3.2.2 フォルダ名、ファイル名、拡張子の取得

変数に格納されたファイルパスから、フォルダ名、ファイル名、拡張子を取得します。

$name = "C:\\Program Files\\Hidemaru\\hidemaru.exe";
loaddll "hmjre.dll";
if(!result){
    message "DLLのロードに失敗しました。";
    endmacro;
}
//ファイル名部分を検索
#ret = dllfunc("FindRegular","[^\\\\]+$", $name, 0);
//正規表現にマッチすると-1より大きい値を返す。
if(#ret > -1){
    //マッチした部分の長さを取得
    #len = dllfunc("GetLastMatchLength");
    $basename  = midstr($name, #ret, #len);
    $directory = leftstr($name, #ret - 1);
}
//拡張子を検索
#ret = dllfunc("FindRegular","\\..+$", $name, 0);
//正規表現にマッチすると-1より大きい値を返す。
if(#ret > -1){
    //マッチした部分の長さを取得
    #len = dllfunc("GetLastMatchLength");
    $extention  = midstr($name, #ret, #len);
}
message "ファイルパス:" + $name + "\n" + 
        "フォルダ名  :" + $directory + "\n" + 
        "ファイル名  :" + $basename  + "\n" + 
        "拡張子      :" + $extention;
freedll;
endmacro;

実行結果

ファイルパス:C:\Program Files\Hidemaru\hidemaru.exe
フォルダ名  :C:\Program Files\Hidemaru
ファイル名  :hidemaru.exe
拡張子      :.exe
4.3.2.3 ファイル名のチェック

入力されたファイル名に、使用できない文字があるかどうかをチェックします。

loaddll "hmjre.dll";
if(!result){
    message "DLLのロードに失敗しました。";
    endmacro;
}
$input = input("ファイル名を入力してください。");
$regexp = "[\\/:,;*?\"<>|]";
//フルパスの場合は:\をチェックから外す
if((midstr($input,1,2) == ":\\") || (midstr($input,0,2) == "\\\\")){
    $regexp = "[/,;*?\"<>|]";
}
#ret = dllfunc("FindRegular",$regexp ,$input ,0);
if(#ret > -1){
    #len = dllfunc("GetLastMatchLength");
    $check = midstr($input, #ret, #len);
    message "ファイル名に使えない文字があります。\n「" + $check + "」";
}else{
    message "ファイル名に問題はありません。";
}
freedll;
endmacro;
4.3.2.4 両端のスペースの削除

Visual Basicのtrim関数と同等の機能。空白(0x20)、全角空白(0x8140)、タブ(0x9)を削除します。 hmjre.dllの独自仕様である"ヒットした扱いにするタグ指定"を使っています。

$name = "  \t   C:\\Program Files\\Hidemaru\\hidemaru.exe   \t  ";
loaddll "hmjre.dll";
if(!result){
    message "DLLのロードに失敗しました。";
    endmacro;
}
$regexp = "^([  \\t]+)(.+?)([  \\t]+$)(?\\2)";
#ret = dllfunc("FindRegular",$regexp ,$name ,0);
if(#ret > -1){
    #len = dllfunc("GetLastMatchLength");
    $check = midstr($name, #ret, #len);
    message "「" + $check + "」";
}else{
    message "検索に失敗しました。";
}
freedll;
endmacro;

目次へ

4.4 田楽DLL(dengakudll.dll)の使い方

2024/04/17:ダウンロード先に64bit版を追加

田楽DLLは、杉浦方紀氏が作成した秀丸エディタ/秀丸メールのマクロから呼び出せる機能拡張DLLで、以下の機能があります。

  • ダイアログの作成
  • 多段メニューの作成
  • ファイル・フォルダの操作
  • 文字列操作
  • BREGEXP.DLLのラッパー機能
  • hmjre.dllのラッパー機能
  • 画像(Susie Plug-in)操作
  • グローバル関数操作

田楽DLLのダウンロード先

関連項目

4.4.1 ダイアログの作成例

どんな、ダイアログが作成可能か知りたい場合は、配布ファイル内にある"dgdll.mac"を実行して下さい。使用できるコントロールが全て使用されているので、サンプルとしても役に立ちます。

作成例として、「検索ボックス向け検索オプション変更マクロ」を使います。チェックボックスと、ボタンを並べただけの、簡単なダイアログです。

検索オプション設定画面

マクロの構成としては、以下の3つから構成されています。

  1. 田楽DLLのロード部分
  2. 部品の配置と通知コードの設定
  3. 通知コードの取得と対応した処理
4.4.1.1 田楽DLLのロード部分
00016|//田楽DLLを読込
00017|loaddll "DengakuDLL.dll";
00018|if (!result) loaddll hidemarudir + "\\DengakuDLL.dll";
00019|if (!result) loaddll macrodir + "\\DengakuDLL.dll";
00020|if (!result) loaddll currentmacrodirectory + "\\DengakuDLL.dll";
00021|if (!result){
00022|    message "DengakuDLL.dll がロードできません。\n 実行ファイルと同じフォルダかマクロファイル用のフォルダに置いてください";
00023|    endmacro;
00024|}

単純に、「loaddll "DengakuDLL.dll";」だけでもいいですが、ロードに失敗した場合は、 DLLのロードする場所を、

  • 秀丸エディタ本体と同じ場所
  • マクロフォルダ
  • 実行しているマクロと同じ場所

に順次切り換えて、ロードを試みます。それでも失敗した場合は、エラーで終了します。

4.4.1.2 部品の配置と通知コードの設定

使用する部品の配置や、表示内容などの設定を行います。

00025|    //ダイアログ作成
00026|    #w1 = 26;
00027|    if (dllfunc("NEWDIALOG", $title + str(#TIMEOUTSET), #w1) == 0 ||
00028|        //大文字/小文字の区別
00029|        dllfunc("NEWCONTROL","check", "casesense","大文字/小文字の区別(&C)") == 0 ||
00030|        dllfunc("SETCTRLSTATE","casesense", str(searchoption & 0x00000002 == 0x00000002)) == 0 ||
00031|        dllfunc("SETCTRLNOTIFY","casesense", "101") == 0 ||
00032|        //単語の検索
(省 略)
00063|        message "ダイアログ作成エラー!";freedll;endmacro;
00064|    }

簡単な各命令の説明です。

NEWDIALOG
ダイアログを作成する場合に、必ず必要な命令、ダイアログの作成の宣言です。ダイアログ上部に表示させる文字列と、ダイアログの幅を設定します。

次に、部品を"NEWCONTROL"で配置して、各種設定(通知コードの設定と、検索フラグの状態をセット)を行います。

NEWCONTROL

部品の配置を行います。部品の種類と、部品名を設定します。ここでは、

  • "check" ==> チェックボックスを配置
  • "casesense" ==> チェックボックスの識別名を、"casesense"に設定
  • "大文字/小文字の区別(&C) ==> 表示する文字列を設定

を、行ってます。

SETCTRLSTATE

部品の状態の設定を行います。部品の識別名と、設定したい状態を指示します。ここでは、チェックボックスなので、チェックの有無を指定します。

  • "casesense" ==> 設定したいコントロールの識別名
  • 状態の設定を文字列で行う。今回は、各オプションの各ビットの状態を設定。
SETCTRLNOTIFY

部品を操作した場合の、通知コードを設定します。通知コードとは、そのコントロールを操作した事を通知する為のコードです。(ボタンを押した場合、エディットボックスで入力した場合など)

  • "casesense" ==> 設定したいコントロールの識別名
  • "101" ==> 識別用の通知コード

田楽DLLで部品配置は、部品配置列の各行に対し、部品を置いておく事になります。

  部品配置列
行┌─────────────────┐
1│□大文字/小文字の区別(&C)         │
 ├─────────────────┤
2│□単語の検索(&W)                  │
 ├─────────────────┤
3│□正規表現(&R)                    │
 ├─────────────────┤
4│□あいまい検索(&F)                │
 ├─────────────────┤
5│□次の秀丸エディタも続けて検索(&H)│
 ├─────────────────┤
6│□一周する(&O)                    │
 ├─────────────────┤
7│□検索文字の強調/検索(&I)         │
 ├─────────────────┤
8│閉じる                            │
 └─────────────────┘

例では、行に1つの部品しか配置していませんが、複数の部品の配置も可能です。複数の部品を配置する場合は、"SETCTRLWIDTH"を使用します。 "SETCTRLWIDTH"で幅を指定すると、次のコントロールは、幅を指定したコントロールの右側に、幅を指定しない場合は、次行に配置する事になります。また、幅を指定しない場合、"NEWDIALOG"で指定した幅を元に、コントロールの幅が、自動的に設定されます。(「閉じる」ボタンを参照)

部品を配置し、設定したら、ダイアログを実際に表示します。

00066|    if (!dllfunc("SHOWDIALOG",hidemaruhandle(0),1)){
00067|        freedll;
00068|        message "ダイアログの表示に失敗しました。";
00069|        endmacro;
00070|    }
SHOWDIALOG
作成したダイアログを表示します。失敗した場合は、DLLを解放し、マクロを終了します。
4.4.1.3 通知コードの取得と対応した処理

通知コードの待ち受け処理です。

00071|    //メインループ
00072|    #st = tickcount;
00073|    #timeout = #st + (1000 * #TIMEOUTSET);
00074|    #n = 1;
00075|    while (1) {
00076|        $retcode = "";
00077|        while (strlen($retcode) == 0){
00078|            $retcode = dllfuncstr("WAITCTRLNOTIFY",10);
00079|            //タイムアウト処理
00080|            if(tickcount > #timeout){
00081|                $retcode = "BREAK";
00082|                break
00083|            }
00084|            if((#st + (#n * 1000)) < tickcount){
00085|                #ret = dllfunc("SETDLGTITLE", $title + str(#TIMEOUTSET - #n));
00086|                #n = #n + 1;
00087|            }
00088|        }

77~88行目が、通知コードの待ち受け部分です。 dllfuncstr("WAITCTRLNOTIFY",10)が、実際に通知コードを受け取る命令になります。本来なら、1行で済みますが、今回はタイムアウト処理などがあるので、多くなってます。

タイムアウト処理がなければ、こんな感じです。

while (strlen($retcode) == 0) $retcode = dllfuncstr("WAITCTRLNOTIFY",10);

ここでは、何かしら、通知コードが入力されるまで(ダイアログが操作されるまで)、ひたすら待ち続けます。

実際の処理部。受け取った通知コードをみて、各種処理をおこないます。

00089|        if($retcode == "0" || $retcode == "BREAK"){
00090|            break;
00091|        }else if($retcode == "101"){
00092|            setsearch searchbuffer, (searchoption ^ 0x00000002);
00093|        }else if($retcode == "102"){
00094|            setsearch searchbuffer, (searchoption ^ 0x00000001);
00095|        }else if($retcode == "103"){
00096|            setsearch searchbuffer, (searchoption ^ 0x00000010);
00097|        }else if($retcode == "104"){
00098|            setsearch searchbuffer, (searchoption ^ 0x00000020);
00099|        }else if($retcode == "105"){
00100|            setsearch searchbuffer, (searchoption ^ 0x00000080);
00101|        }else if($retcode == "106"){
00102|            setsearch searchbuffer, (searchoption ^ 0x01000000);
00103|        }else if($retcode == "107"){
00104|            setsearch searchbuffer, (searchoption ^ 0x00000800);
00105|        }else if($retcode == "108"){
00106|            setsearch searchbuffer, (searchoption ^ 0x00001000);
00107|        }

例では、検索オプションの書き換えを行っています。

通知コードが"0"(閉じるボタン)または、"BREAK"(タイムアウト)の場合は、待ち受けループを抜け、ダイアログを閉じ、終了します。

00111|    ##ret = dllfunc("ENDDIALOG");

目次へ

4.5 BRegIf.DLLのマクロ関数の使い方

BRegIf.DLLは、v0,1,3,0 以降、マクロから呼び出せる各種関数が実装されています。その関数の使い方の例です。というか、開発時に使っている動作確認用マクロです。新規秀丸を開き、結果を出力します。

出力結果

c:\program files\hidemaru\bregif.dll
BRegIf.dll Ver.1.32(bregonig.dll Ver.1.44 with Oniguruma 5.9.1)
          1         2         3         4         5         6         7
01234567890123456789012345678901234567890123456789012345678901234567890
 Yokohama 045-222-1111  Osaka 06-5555-6666  Tokyo 03-1111-9999 

FindRegularのテスト
FindRegular("(03|045)-(\d{3,4})-(\d{4})", $target, 0)
見つかった場所:10
マッチした長さ:12
マッチした文字:045-222-1111
見つかった場所1:10
マッチした長さ1:3
マッチした文字1:045
見つかった場所2:14
マッチした長さ2:3
マッチした文字2:222
見つかった場所3:18
マッチした長さ3:3
マッチした文字3:111
GetFunctionResultを使用した場合
見つかった場所0:045-222-1111
見つかった場所1:045
見つかった場所2:222
見つかった場所3:1111

Matchのテスト
Match("(03|045)-(\d{3,4})-(\d{4})","",$target, 0)
見つかった場所:10
マッチした長さ:12
マッチした文字:045-222-1111
見つかった場所1:10
マッチした長さ1:3
マッチした文字1:045
見つかった場所2:14
マッチした長さ2:3
マッチした文字2:222
見つかった場所3:18
マッチした長さ3:3
マッチした文字3:111
GetFunctionResultを使用した場合
見つかった場所0:045-222-1111
見つかった場所1:045
見つかった場所2:222
見つかった場所3:1111

FindRegularNoCaseSenseのテスト1
FindRegularNoCaseSense("(YOKOHAMA).+(OSAKA).+(TOKYO)", $target, 0)
見つかった場所:1
マッチした長さ:48
マッチした文字:Yokohama 045-222-1111  Osaka 06-5555-6666  Tokyo
GetFunctionResultを使用した場合
見つかった場所0:Yokohama 045-222-1111  Osaka 06-5555-6666  Tokyo
見つかった場所1:Yokohama
見つかった場所2:Osaka
見つかった場所3:Tokyo

FindRegularNoCaseSenseのテスト2
FindRegularNoCaseSense("(yoKoHaMa).+(oSAka).+(tOkYo)", $target, 0)
見つかった場所:1
マッチした長さ:48
マッチした文字:Yokohama 045-222-1111  Osaka 06-5555-6666  Tokyo
GetFunctionResultを使用した場合
見つかった場所0:Yokohama 045-222-1111  Osaka 06-5555-6666  Tokyo
見つかった場所1:Yokohama
見つかった場所2:Osaka
見つかった場所3:Tokyo

Matchのテスト2
Match("(yoKoHaMa).+(oSAka).+(tOkYo)", "i",$target, 0)
見つかった場所:1
マッチした長さ:48
マッチした文字:Yokohama 045-222-1111  Osaka 06-5555-6666  Tokyo
GetFunctionResultを使用した場合
見つかった場所0:Yokohama 045-222-1111  Osaka 06-5555-6666  Tokyo
見つかった場所1:Yokohama
見つかった場所2:Osaka
見つかった場所3:Tokyo

Transのテスト
base           :abcdefghijkl
tr/bdfj/BDFJ/  :aBcDeFghiJkl
tr/bdfj/_/     :a_c_e_ghi_kl
tr/bdfj/BD/d   :aBcDeghikl
tr/abcd/_/s    :_efghijkl
tr/abcd/_/c    :abcd________
tr/abcd/_/cs   :abcd_
データ変更
tr/012/零一弐/k: Yokohama 零45-弐弐弐-一一一一  Osaka 零6-5555-6666  Tokyo 零3-一一一一-9999 

Translateのテスト
tr/012/零一弐/k: Yokohama 零45-弐弐弐-一一一一  Osaka 零6-5555-6666  Tokyo 零3-一一一一-9999 

Splitのテスト
分割文字: *\d{2,3}-\d{3,4}-\d{4} *
split戻り値:3
エラー:
分割文字(0):[ Yokohama]
分割文字(1):[Osaka]
分割文字(2):[Tokyo]

Substのテスト
s/[0-9]/x/   :01--> Yokohama x45-222-1111  Osaka 06-5555-6666  Tokyo 03-1111-9999 
s/[0-9]/x/g  :30--> Yokohama xxx-xxx-xxxx  Osaka xx-xxxx-xxxx  Tokyo xx-xxxx-xxxx 

SubstExのテスト
s/[0-9]/x/   st = 0  :01--> Yokohama x45-222-1111  Osaka 06-5555-6666  Tokyo 03-1111-9999 
s/[0-9]/x/   st = 20 :01-->x1  Osaka 06-5555-6666  Tokyo 03-1111-9999 
s/[0-9]/x/g  st = 30 :20-->xx-xxxx-xxxx  Tokyo xx-xxxx-xxxx 

SubstEx2のテスト
s/[0-9]/x/   st = 0  :01--> Yokohama x45-222-1111  Osaka 06-5555-6666  Tokyo 03-1111-9999 
s/[0-9]/x/   st = 20 :01--> Yokohama 045-222-11x1  Osaka 06-5555-6666  Tokyo 03-1111-9999 
s/[0-9]/x/g  st = 30 :20--> Yokohama 045-222-1111  Osaka xx-xxxx-xxxx  Tokyo xx-xxxx-xxxx 

Replaceのテスト
s/[0-9]/x/   -->  Yokohama x45-222-1111  Osaka 06-5555-6666  Tokyo 03-1111-9999 
s/[0-9]/x/g  -->  Yokohama xxx-xxx-xxxx  Osaka xx-xxxx-xxxx  Tokyo xx-xxxx-xxxx 

Replace2のテスト
s/[0-9]/x/   st = 10 -->  Yokohama x45-222-1111  Osaka 06-5555-6666  Tokyo 03-1111-9999 
s/[0-9]/x/g  st = 20 -->  Yokohama 045-222-11xx  Osaka xx-xxxx-xxxx  Tokyo xx-xxxx-xxxx 

目次へ

4.6 外部DLL呼び出しとunicode

基本的に、従来のdllfunc/dllfuncstrで、外部DLLに対し、unicode文字列を渡すことはできません。例外的に、hmjre.dll/Tkinfo.dllのみ、秀丸独自コードを使用し、unicode文字列を渡すことが可能です。

hmjre.dll/Tkinfo.dll以外のDLLでは、"Unicodeを取り除いた形式に変換"しているとのこと。 (秀丸エディタ本体側で処理。turukame.3:05331を参照)

Ver.8より、ワイド文字に対応した、dllfuncw/dllfuncstrwが追加されています。外部DLLで、unicode文字列を扱う場合は、dllfuncw/dllfuncstrwを使用することになりますが、 DLL側の対応が必要です。

文字変数内に、Unicode文字が含まれるかどうかの、チェック方法はマクロヘルプに記載されています。 (秀丸エディタ Ver.8 charindex_to_byteindex のページ)

目次へ

5 変換モジュール

5.1 uniq.hmf 改造版

秀丸エディタの変換モジュールライブラリ にある Uniq の改造版です。 uniq(重複行削除)だけでなく、重複行を出力する機能も追加しています。また、重複チェックを開始するフィールドを指定できます。(スペース区切り、CSV、TSV)

32bit版及び64bit版があります。

圧縮ファイルの内容

uniq.txt              変換モジュールの説明
uniq.hmf              32bit版変換モジュール
uniq.hmf64        64bit版変換モジュール
uniq_ex_src.zip   変更したソース(vcee 2010)

5.1.1 変換モジュールの機能

以下の3個の機能があります

  • ユニーク
  • 重複行出力
  • ユニーク/重複行

「ユニーク」、「重複行出力」は、そのままの機能を実行します。「ユニーク/重複行」は設定ダイアログを表示し、指定された機能を実行します。

ユニーク/重複行設定ダイアログ

設定できる内容は、以下になります。

  • 機能選択
    ユニークか重複行出力。

  • 比較開始するフィールドの位置
    比較を開始する位置を指定できます。通常は半角スペース(0x20)が、フィールドの区切り文字になりますが、 CSV用に","、TSV用にタブコード(0x09)も指定できます。フィールドの位置指定は、先頭が1で、最大255まで、指定できます。

    注)フィールドの区切りは、まじめに解析していないので、おまけ程度だと思ってください。

5.1.2 変更履歴(uniq改造版)

以下のソースをベースに以下の内容を修正。

2012/02/26
  • 重複していないのに、空行が削除されてしまうのを修正。
  • 1文字づつ合成していたのを止めて、改行文字を検索して、行単位で処理するようにした。
  • メモリ確保時に、ポインタのチェックを追加。
  • vector → String → HGLOBAL でデータを移動させていたが、vector → HGLOBAL へ変更
2012/02/27
  • 遅くなったので、元に戻す。 vector → String → HGLOBAL
  • vector、Stringで、reserveを使い、あらかじめ大きなメモリ領域を確保するようにした。これにより、動作速度が改善。
2012/03/03 Ver.1.1.0
  • 重複行を出力する関数を追加。重複している場合、後に出てくる行を出力する。
2012/03/18 Ver.1.2.0
  • 比較開始するフィールドの指定を追加。デフォルトは、スペース区切り、TSV/CSVにも対応する。先頭は1。最大は255。これ以上を指定した場合は、無視されます。
2012/07/01
  • 各関数を多少見直し。(機能的な変更はなし)

目次へ

6 COMコンポーネント

6.1 HidemaruMacroWscLib

Windows スクリプト コンポーネント で作成した、秀丸エディタマクロ用COMコンポーネントです。

COMコンポーネントといっても、XML と、VBScript、JScriptで構成されています(要はテキストファイル)。内部で .NET Framework の機能を使用しているので、.NET Framework のランタイムライブラリが必要です。 (開発環境は、 .NET Framework 4 になります。)

このCOMコンポーネントを使うには、方法か2つあります。

  • レジストリに登録しない。

    この方法ではgetobject関数を使うことで使用できます。createobject関数からは使用できません。

    #lib = getobject(@"script:C:\Users\<username>\AppData\Roaming\Hidemaruo\Hidemaru\Macro\HidemaruMacroWscLib.wsc");
    注意) "C:\\Users\\~" 部分は "HidemaruMacroWscLib.wsc"のフルパスを指定してください。

    レジストへの登録は不要ですが、"script:"以降にフルパスで指定する必要があります。

  • レジストリに登録する。
    この方法では、createobject関数を使うことで使用できます。

    #lib = createobject("HidemaruMacro.WscLib");

    登録時、Windows Vista以降では、管理者権限が必要になります。登録を行った時のパスをレジストリに登録するので、あらかじめファイルを配置してから、登録を行ってください。

  • HidemaruMacroWscLib Ver.1.03a 2021/05/05
    説明書

圧縮ファイルの内容

HidemaruMacroWscLib_setup.vbs   登録/登録解除用vbs
HidemaruMacroWscLib.html            説明書
HidemaruMacroWscLib.wsc         WSCファイル(COMコンポーネント本体)

6.1.1 バージョンアップについて

旧バージョンの登録解除が必用です。

  1. 旧バージョンを「登録解除」する。
  2. 新しいバージョンを「登録」する。

旧バージョンの「登録解除」を行わない場合、レジストリに古い情報が残されます。 (古い情報が残っていても、特に問題はありません。)

6.1.2 HidemaruMacroWscLibの機能

文字列操作用と、日付関連のオブジェクトがあり、各種メソッド、プロパティが実装されています。
  • HidemaruMacro.WscLib

    メインオブジェクト

    プロパティ
    • VersionStr バージョン情報を文字列で返します。

    • Version

      バージョン情報を数値で返します。

    メソッド
    • CreateString

      HidemaruMacro.WscLib.String オブジェクト作成

    • CreateDate

      HidemaruMacro.WscLib.Date オブジェクト作成

    • CreateWMI

      HidemaruMacro.WscLib.WMI オブジェクト作成

    • CreateInputBox

      HidemaruMacro.WscLib.InputBox オブジェクト作成

    • CreateMsgBox

      HidemaruMacro.WscLib.MsgBox オブジェクト作成

    • GetArrayListDataType

      ArrayLisyに格納されている内容を返す。

    • HidemaruMacro.WscLib.String

      文字列関連オブジェクト

      プロパティ
      • TrimDelimiter

        TrimString系関数で削除する文字

      メソッド
      • ResetDelimiter

        TrimString系関数で削除する文字を初期化する。

      • Split

        文字列の分解

      • URIDecode

        URIエンコードされた文字のデコード

      • URIDecode2

        URIエンコードされた文字のデコード

      • URIEncode

        指定された文字を、エンコードする

      • URIEncode2

        指定された文字を、エンコードする

      • TrimString

        両端にある、指定された文字列の削除

      • LTrimString

        先頭にある、指定された文字列の削除

      • RTrimString

        末尾にある、指定された文字列の削除

      • Sprintf

        引数を、書式文字列に従って変換した文字列を返す。

    • HidemaruMacro.WscLib.Date

      日時関連オブジェクト

      プロパティ
      • Locale

        ロケール設定

      メソッド
      • ResetLocale

        ロケールをデフォルトに戻す

      • Date_Add

        指定された日時から、任意間隔の日時を返す

      • WeekdayLongName

        長い曜日の名前を返す

      • WeekdayShortName

        短い曜日の名前を返す

      • MonthLongName

        長い月の名前を返す

      • MonthShortName

        短い月の名前を返す

      • StrfTime

        フォーマットに従い、日時を返す

    • HidemaruMacro.WscLib.WMI

      WMI関連オブジェクト

      プロパティ
      • ResultList

        各メソッドの戻り値を取得する。

      • ResultListMax

        各メソッドの戻り値を取得する。

      • MonitorCount

        接続されているモニターの数を返します。

      メソッド
      • GetMonitorWidth

        指定されたモニターの幅を返す。

      • GetMonitorHeight

        指定されたモニターの高さを返す。

      • GetProcessList

        実行中のプロセス一覧を取得

      • GetProcessListWithCaption

        指定されたキャプションをもつ、実行中のプロセス一覧を取得

      • ProcessTerminate

        指定されたプロセスを終了させる。

      • RegEnumKey

        レジストリのサブキーを列挙する

      • RegEnumKeyValue

        指定されたキーから、値の名前と、データの種類を列挙する。

    • HidemaruMacro.WscLib.InputBox

      InputBoxオブジェクト

      プロパティ
      • Result

        Showメソッドで入力された内容を返します。メソッド

      • Show

        インプットボックスを表示します。座標が指定された場合は、指定された座標に表示します。

    • HidemaruMacro.WscLib.MsgBox

      MsgBoxオブジェクトの作成方法

      メソッド
      • Show

        メッセージボックスを表示します。

6.1.3 HidemaruMacroWscLibの変更履歴

2013/12/21 Version 1.00
  • 初版
2013/12/26 Version 1.01
  • String クラスに ResetDelimiter メソッド追加
  • WMIクラスを追加
2013/12/29
  • 各クラスの classid を指定するようにした。
2016/04/23 Version 1.02
  • InputBox クラスを追加。
2017/01/28 Version 1.03
  • MsgBox クラスを追加。
2021/05/05 Version 1.03a
  • ドキュメントの修正のみ。

目次へ

7 WSH

7.1 HidemaruMacroInstaller

秀丸エディタ用マクロのインストール補助スクリプトです。

名前は立派ですが、たいしたことは出来ません。ZIP形式の圧縮ファイルを展開し、ファイルを秀丸エディタのマクロフォルダに移動するだけです。

マクロフォルダの位置は自動で認識ます。以下の順番で秀丸エディタの検索を行います。

  1. レジストリ
  2. 実行中のプロセス

レジストリの検索結果と、プロセス実行中のパスが異なる場合は、プロセスから取得した情報を優先します。その為、持ち出しキットで使用する場合は、無題でもいいので、秀丸エディタを起動しておく必要があります。 (常駐秀丸がいれば問題ないです。)

配布ファイルには、以下のファイルが格納されています。
HidemaruMacroInstaller.vbs                  :メインモジュール
HidemaruMacroInstallerSubModule.vbs         :サブモジュール(ファイルの移動処理)
HidemaruMacroInstaller.html                 :説明ファイル
HidemaruMacroInstaller_UAC_Dialog_Vista.png :説明ファイル用画像
HidemaruMacroInstaller_UAC_Dialog_7.png     :説明ファイル用画像
HidemaruMacroInstaller_UAC_Dialog_10.png    :説明ファイル用画像
スクリプトと同じ個所に、以下のファイルを作るので、書き込み権限のあるフォルダに展開してください。
HidemaruMacroInstaller.dat                  :秀丸エディタの各種情報を保存
HidemaruMacroInstaller.mac                  :"HidemaruMacroInstaller.dat"作成用マクロ
HidemaruMacroInstaller.log                  :動作ログを記録したファイル
HidemaruMacroInstaller.usrcmd               :アプリケーション実行用データファイル

7.1.1 HidemaruMacroInstallerの使い方

"HidemaruMacroInstaller.vbs" に ZIP形式で圧縮されたマクロファイルをドロップするだけです。 ZIPファイルの中身が、自動的にマクロフォルダに展開されます。

マクロファイルがドロップされた場合は、マクロフォルダに移動します。

7.1.2 HidemaruMacroInstaller使用時の注意

  • 移動先に、同名のファイル/フォルダがあった場合は、問い合わせなしで上書きします。

7.1.3 HidemaruMacroInstallerの特殊な使い方

ZIPファイルの展開以外にも機能があります。詳細は、説明ファイルを参照の事。

hmonig.dll Ver.0.7.4.0系がサンプルになります。 (実行環境を判定して、対象のDLLをコピーしている。)

7.1.4 HidemaruMacroInstallerの変更履歴

2015/02/15 Ver.1.0.0β1
  • 一通り動くようになったので、テスト目的で公開
2015/07/06 Ver.1.0.0β2

"HidemaruMacroInstallerSubModule.vbs"を修正

  • 引数のチェックを追加
  • "*.*"を、指定した場合、確認ダイアログを表示させないようにした。
2015/10/21 Ver.1.0.0β3

"HidemaruMacroInstaller.vbs"を修正

  • 64bit OSの場合、インストール場所の検索にレジストリのリダイレクト部分も検索するようにした。 (64bit OSに、32bitアプリケーションをインストールした場合への対応)

ちなみに、起動中の秀丸エディタを見つけた場合、レジストの検索結果より、プロセス実行中のパスを優先します。

"HidemaruMacroInstallerSubModule.vbs"を修正

  • ラベル検索時に空行でエラーになっていたので修正
2015/11/22 Ver.1.0.0β4

"HidemaruMacroInstaller.vbs"を修正

インストール場所の検索に失敗していたのを修正。

2016/08/06 Ver.1.0.0β5

"HidemaruMacroInstaller.vbs"を修正

  • 終了時にメッセージを表示するようにした。
  • マクロファイルを指定された場合は、ファイルを移動するように修正
2019/12/16 Ver.1.0.0β6
  • "HidemaruMacroInstaller.vbs" と "HidemaruMacroInstallerSubModule.vbs"を修正。 "HidemaruMacroInstallerSubModule.vbs"の起動確認をロックファイルを使って行うように修正。

目次へ


top秀丸エディタマクロ