update : 2024/11/03 (Sun)
マクロを使用するに場合には、32bit/64bit の違いを気にする必要はありませんが、外部DLLを使用する場合は注意が必要です。
基本的には 64bit アプリケーションで 32bit DLL を使用する事はできませんが、 64bit版秀丸エディタには 32bit DLL 使用するためのオプションが存在します。
このオプションを 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を読込に失敗した」等のメッセージが表示される。)
解決方法としては、
等があります。
説明追加
ヘルプ(動作環境- 64bit版) にも説明がありますが、64bit秀丸上で32bitDLL使うには、かなり強引な方法をとっています。その為、オプションを有効にしても、DLL によっては正常に動作しない場合もあります。
C/C++など、プログラミング言語から、64bit hmjre.dllを使う場合の注意点。
64bit対応で、JRE2構造体の定義が一部変更されているため、配布されている JREUSR.H を変更する必要があります。詳細はturukame.2:02359を、参照してください。変更しない場合は、 "Jre2Open" が、失敗します。
JREUSR.Hが含まれる開発関連資料はこちら:jredoc
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からの変更点
旧 版(祝鳥 1.01):macrodll.dll(x64)Ver.1.01 2018/10/06版
「田楽DLL」のx64版です。作者 杉浦まさき氏 の許可を得て公開しています。
上記URLで公開されているソースを元に、VCEE2010SP1+Windows SDKでコンパイルしています。
田楽DLL(x64)Ver.3.22.1 2017/12/02
動作確認は 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 には対応していません。
x64版をコンパイルする場合には、bregonig.dll のソースに含まれる "BREGEXP.H" が必要です。
Susie Plug-inに関しては、一応 "*.sph"に対応しています。 "*.sph"に関しては以下のURLを参照して下さい。
UNBYPASS.DLLに含まれる、 "ZBYPASSI.SPH" を使用すると、64bit田楽DLLから、32bit Susie Plug-in を使用することが出来ます。
この DLL を使用して損害が生じても、損害に対する保証は出来かねますのであらかじめご了承ください。また、この DLL 使用時に不具合があった場合は、「h-tom」まで連絡してください。連絡先はトップページか添付文書を参照してください。送信フォーム もあります。
秀丸エディタ/秀丸メールで使用するマクロ拡張用DLLです。マクロで(簡単には)実現できない(事もない?)各種機能(?)を提供します。
動作環境
詳細な説明はDLLの解説(Version 1.29.00)をみて下さい。
正式版
圧縮ファイルの内容
ht_tools.dll :32bit DLL
ht_tools.html :説明ファイル
HidemaruMacroInstaller.lst:HidemaruMacroInstaller用スクリプト
ht_tools_dictionary.txt :単語補完用辞書ファイル
x64 :フォルダ
└ht_tools.dll :64bit DLL
hunspell関連に関数の実行には、ライブラリ(libhunspell.dll)と辞書ファイルが必要です。
ライブラリlibhunspell.dll改造版 Version 1.7.2
付属の文書(2024/11/02)
(改造版は、標準DLLから、バージョン情報取得関数を追加しただけ)
辞書ファイルの入手先
EditorConfig に関してはEditorConfigを参照してください。
機能追加
[DebugOut]関数を追加。
修正
その他
機能追加
FileOpenW関数、WrFileW関数、WrFileLineW関数、RdFileW関数、RdFileLineW関数、RdFileLine関数、AnalyzeEncoding関数を追加。
修正
IsUTF16LE関数の仕様を変更し、UTF-8のBOMも認識可能にした。関数名と機能が一致しないので、エイリアスとしてIsBOM関数を追加。
その他
機能追加
DwmGetWindowRect_Top関数、DwmGetWindowRect_Bottom関数、DwmGetWindowRect_Left関数、DwmGetWindowRect_Right関数、 DwmGetWindowRectAll関数、GetWindowRectAll関数を追加。
修正
その他
機能追加
EditorConfigExecuteW関数を追加。(EditorConfigExecuteのユニコード版)
修正
その他
機能追加
修正
その他
ドキュメント修正。 editorconfig-core-c のバージョンが間違っていたのを修正。
機能追加
修正
editorconfig-core-c を更新(0.12.4)
editorconfig-core-c で使用しているPCREを更新(PCRE2 10.32 --> 10.36)
ExistSection/ExistSectionW関数で、誤検出する場合があったのを修正。
その他
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対応版のみになります。
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以降用)
秀丸エディタから呼び出された場合、「Jre2Compile」で false を返しているのに、 Jre2GetMatchInfo 系関数が呼び出される場合があったので対処。
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文字にマッチする。
GetLast~の関数は、直前に実行した関数により、戻り値の単位が異なるので注意してください。
ワイド文字を扱う場合は、wcs系の関数を使用してください。
開発終了
BRegIf.dll+bregonig.dll(Shift_JIS専用)相当です。
ヒットした扱いにするタグ指定が正常に動作していないバグの修正。
通常の検索 :最後のタグが指定できない。
マクロ用関数:指定が有効にならない。
バージョン番号が間違っていたので修正。
(x64のみ) 鬼車Ver.5.9.2を更新。
x64で、「fail to memory allocation」が出る場合があるので対処 (OnigStackIndex long → LONG_PTR へ変更)
マクロ用関数の修正
GetLastMatchLength、GetLastMatchTagLengthで、文字列の先頭にマッチした場合、戻り値が-2になってしまうバグの修正(colder氏からの連絡による。)
エラーメッセージ取得時に、クラッシュする場合があるので対処。
鬼車API呼び出し時に、エラーコードだけでなく、onig_new() の err_info が、必要な場合がある。秀丸側からはエラーコードのみで、JRE構造体が指定されないため、識別ができない。多少メッセージが不親切になるが、鬼車APIを修正。
(エラーメッセージ取得時に err_info を使用しない関数を追加し対応。エラー発生時にメッセージを取得し保存しておく方法も考えたが、エラーの発生順とエラーメッセージ取得順が同じになるとは限らないので、メッセージの保存は行わない。)
"\f"使用時に正常に動作しないので対処。
Jre2SetCodePage が呼ばれない場合があり、その場合はShift_JISとして、動作するように修正。
パッチ適応後に、\d、\w、\sが、誤判定する件に対処。
鬼車はアスキーコード範囲内のデータに対して、属性をテーブルで保持している。
\w等は、ビット割り付け (ONIGENC_CTYPE_W) をおこなっていて、その属性を持つ範囲に、ビットを立てたテーブルを作成。マッチ時にテーブルにアクセスし、ビットをチェックし、判定を行っている。その為、UTF-16LEの下位ビットが、アスキーコード範囲内だと、誤判定していた。コードポイント値を取得して、ASCIIコード範囲内であることを確認後、チェックするように修正。
マクロ用関数で、"\uxxxx"を扱えるようにした。
検索ダイアログを開いたまま、ウィンドウの切替を行うと、エラーとなる場合があるので対処。
検索ダイアログを開いたまま、ウィンドウの切替を行うと、
JreGetVersion、Jre2Open、Jre2Compile、Jre2Close
が呼び出される。
hmonig.dllでは、正規表現文字列がない場合、エラーにしていたが、チェックをしないようにした。(単純に、検索ダイアログを表示させると空文字がセットされるので、エラーチェックで引っかかっていた。)
(?\tag-number) ヒットした扱いにするタグ指定の動作が、おかしかったので修正。
(マクロ関数も修正)
タグ指定ありでタグに対するマッチ範囲がない場合、Trueを返していたので修正。
(falseを返す。)
正規表現:(.+)\\t|$(?\\1)
対象文字:\\n
上記場合だと、正規表現にはマッチするが、\1には、マッチしていない状態もある。
鬼車(Unicode)
http://redmine.ruby-lang.org/issues/show/3568
Bug #3568: /(?<=a).*b/ =~ "aab" doesn't match
鬼車(Unicode)
http://redmine.ruby-lang.org/issues/show/4088
Case Sensitivity in Regular Expressions with Lookbehind
Unicode版の関数を追加 char を WCHAR に変更しただけ。
hmjre.dllが対応していないので、Unicodeでの、あいまい検索は出来ません。ほとんどテストしていない状態です。
JreGetVersionW
Jre2OpenW
Jre2SetCodePageW
Jre2CompileW
Jre2GetMatchInfoW
Jre2GetMatchInfo_HmJreW
Jre2CloseW
JreGetTagPositionW
GetJreMessageW
GetDllVersionStrW
通常版API UTF-8 対応のコードを整理。
ついでに、現状は UTF-8 以外は、全て UTF-16LE へ変換しているが、変換対象をShift_JIS のみに、切替可能にした。
Shift_JIS 以外で、異常動作した場合の対処
#define で切り替えるので、コンパイルが必要
正規表現エンジンを更新。
2011/12/01: [bug] /a{2}/i doesn't match 'AA'.
通常検索では、ほぼ影響なし。マクロ関数に影響あり。 (通常の検索は、大文字小文字を無視する処理は、秀丸エディタ本体側で行っている為、関係ないが、正規表現にオプションを埋め込んでいる場合は関係あり)
マクロ用関数の追加
サロゲートペアも一文字扱いするunicode用関数
正規表現エンジンを更新。鬼雲(Ver.5.13.2) + Ruby r35724へ変更
エラーメッセージが取得できない場合があったのを修正。
Jre2Compile / Jre2CompileW で 正規表現文字列が空かどうかのチェックを有効にした。
以前は、検索ダイアログを開いたまま、ウィンドウの切替を行うと、検索文字列がなくても、 JreGetVersion、Jre2Open、Jre2Compile、Jre2Close が呼び出された。 hmonig.dllでは、正規表現文字列が空だとエラーにしていた為、ウィンドウを切り替えるたびにエラーダイアログが表示されてしまうので、チェックを無効化していた。秀丸エディタVer.8.32では、正規表現文字列が空の場合、JreGetVersion のみ呼び出されるように変更になっていた為、チェックを有効にした。
正規表現エンジンを更新。鬼雲(Ver.5.15.0) + Oniguruma 5.9.6更新分
マクロ用関数の追加
unicodeの正規化関連関数を追加
Windows XP用DLLでは動作しません。
バッファの初期化が抜けていた箇所があったので修正。
デバッグ用関数を修正
秀丸エディタから呼び出された場合、「Jre2Compile」で false を返しているのに、 Jre2GetMatchInfo 系関数が呼び出される場合があったので対処。
公開されているdllの使い方などの紹介です。
あべのりゆき氏が公開されているDLLです。秀丸エディタのTex用マクロである「祝鳥」に含まれています。リストボックスの表示や各種ファイル操作が可能です。
DLL単体でも公開もされています。単体で入手する場合は、「macrodll.dll関数一覧」もダウンロードしましょう。
ここのサンプルを動かす場合は、DLLを秀丸エディタ本体と同じ場所に置いてください。
2010/03/18 6項を追加。
macrodll.dllにある"文字列回収"機能の説明です。("COLLECTSTR~"関数の使い方になります。)文字列回収とは、ほぼGREPと同じ機能です。特徴的なのは、正規表現のグルーピングを使い、マッチした行全体ではなく、必要な部分を切り出せることです。
使い方
正規表現を使用するので、SETHMJREDLL関数を呼びだす。 SETHMJREDLL関数を呼びさないと、正規表現を使った検索がうまくいかないので注意。
#ret = dllfunc("SETHMJREDLL", hidemarudir + "\\hmjre.dll");
COLLECTSTR_SET関数で、出力先を設定。結果をファイルに出力するか、COLLECTSTR_GETSTR関数を使って取り出すかを選択します。
COLLECTSTR_SETOPT関数で、検索オプションを設定。
以上のオプションが設定できるので、必要なら、"true"をセットします。
COLLECTSTR_COLLECT関数で検索実行(出力先がファイルなら結果はファイルへ出力)
切り出す文字列は、正規表現でグルーピングを行い、タグ番号で指定します。
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;
}
COLLECTSTR_CLEARSTR関数で、文字列をクリアする。 COLLECTSTR_COLLECT関数を続けて行う場合は、実行前にCOLLECTSTR_CLEARSTR関数を実行し、文字列をクリアすること。
秀丸パイプは、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";
この、"秀丸パイプ"を使うことで何が出来るかというと、秀丸のマクロでは出来ないことを、他のプログラムを使用して行う事が可能になります。
他のプログラムと連携するには、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
2010/03/22 マクロ関数を追加
hmjre.dllは、秀丸エディタVer.4.00から使用されている正規表現検索用のDLLです。秀丸エディタの検索・置換で使用されています。このDLLには、マクロから呼び出せる関数があります。
Hmjre.dll側での文字コードインデックス自動変換をON/OFFする関数。関数にユニコード文字を含む文字変数を渡す場合、ユニコード文字1文字が4バイトのデータとして渡される形となります。その為、通常の文字操作関数で、Hmjre.dllの戻り値を、そのまま使用すると、通常の文字インデックスの値とずれることになります。この関数を使用することにより、通常の文字操作関数で使用するのに問題のない値に、自動的に変換することが可能です。
(秀丸エディタ V8.00β45以上、および秀丸メール V5.34β9以上で対応)
実際の使い方は、turukame.3:05320を参照してください。
関数の詳細は、hmjre.dllのヘルプを参照してください。
マクロ作成時に、文字列変数に対して、正規表現を使った検索を行うには、
を使用します。
置換を行うには、
を使用します。
"FindRegular"は見つけた位置(先頭は0)を、"GetLastMatchLength"はマッチした文字列の長さを返す為、 midstr関数を使えば、マッチした文字列を取得できます。
"^"は検索文字列の先頭を示します。検索文字が"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 --> 検索対象の末尾にマッチ
ファイル名をドライブ、各フォルダ、ファイル名に分割します。
$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の替わりになるかな?
変数に格納されたファイルパスから、フォルダ名、ファイル名、拡張子を取得します。
$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
入力されたファイル名に、使用できない文字があるかどうかをチェックします。
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;
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;
2024/04/17:ダウンロード先に64bit版を追加
田楽DLLは、杉浦方紀氏が作成した秀丸エディタ/秀丸メールのマクロから呼び出せる機能拡張DLLで、以下の機能があります。
田楽DLLのダウンロード先
関連項目
どんな、ダイアログが作成可能か知りたい場合は、配布ファイル内にある"dgdll.mac"を実行して下さい。使用できるコントロールが全て使用されているので、サンプルとしても役に立ちます。
作成例として、「検索ボックス向け検索オプション変更マクロ」を使います。チェックボックスと、ボタンを並べただけの、簡単なダイアログです。
マクロの構成としては、以下の3つから構成されています。
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のロードする場所を、
に順次切り換えて、ロードを試みます。それでも失敗した場合は、エラーで終了します。
使用する部品の配置や、表示内容などの設定を行います。
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| }
簡単な各命令の説明です。
次に、部品を"NEWCONTROL"で配置して、各種設定(通知コードの設定と、検索フラグの状態をセット)を行います。
部品の配置を行います。部品の種類と、部品名を設定します。ここでは、
を、行ってます。
部品の状態の設定を行います。部品の識別名と、設定したい状態を指示します。ここでは、チェックボックスなので、チェックの有無を指定します。
部品を操作した場合の、通知コードを設定します。通知コードとは、そのコントロールを操作した事を通知する為のコードです。(ボタンを押した場合、エディットボックスで入力した場合など)
田楽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| }
通知コードの待ち受け処理です。
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");
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
基本的に、従来の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 のページ)
秀丸エディタの変換モジュールライブラリ にある Uniq の改造版です。 uniq(重複行削除)だけでなく、重複行を出力する機能も追加しています。また、重複チェックを開始するフィールドを指定できます。(スペース区切り、CSV、TSV)
32bit版及び64bit版があります。
圧縮ファイルの内容
uniq.txt 変換モジュールの説明
uniq.hmf 32bit版変換モジュール
uniq.hmf64 64bit版変換モジュール
uniq_ex_src.zip 変更したソース(vcee 2010)
以下の3個の機能があります
「ユニーク」、「重複行出力」は、そのままの機能を実行します。「ユニーク/重複行」は設定ダイアログを表示し、指定された機能を実行します。
設定できる内容は、以下になります。
機能選択
ユニークか重複行出力。
比較開始するフィールドの位置
比較を開始する位置を指定できます。通常は半角スペース(0x20)が、フィールドの区切り文字になりますが、
CSV用に","、TSV用にタブコード(0x09)も指定できます。フィールドの位置指定は、先頭が1で、最大255まで、指定できます。
注)フィールドの区切りは、まじめに解析していないので、おまけ程度だと思ってください。
以下のソースをベースに以下の内容を修正。
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_setup.vbs 登録/登録解除用vbs
HidemaruMacroWscLib.html 説明書
HidemaruMacroWscLib.wsc WSCファイル(COMコンポーネント本体)
旧バージョンの登録解除が必用です。
旧バージョンの「登録解除」を行わない場合、レジストリに古い情報が残されます。 (古い情報が残っていても、特に問題はありません。)
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
メッセージボックスを表示します。
秀丸エディタ用マクロのインストール補助スクリプトです。
名前は立派ですが、たいしたことは出来ません。ZIP形式の圧縮ファイルを展開し、ファイルを秀丸エディタのマクロフォルダに移動するだけです。
マクロフォルダの位置は自動で認識ます。以下の順番で秀丸エディタの検索を行います。
レジストリの検索結果と、プロセス実行中のパスが異なる場合は、プロセスから取得した情報を優先します。その為、持ち出しキットで使用する場合は、無題でもいいので、秀丸エディタを起動しておく必要があります。 (常駐秀丸がいれば問題ないです。)
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 :アプリケーション実行用データファイル
"HidemaruMacroInstaller.vbs" に ZIP形式で圧縮されたマクロファイルをドロップするだけです。 ZIPファイルの中身が、自動的にマクロフォルダに展開されます。
マクロファイルがドロップされた場合は、マクロフォルダに移動します。
ZIPファイルの展開以外にも機能があります。詳細は、説明ファイルを参照の事。
hmonig.dll Ver.0.7.4.0系がサンプルになります。 (実行環境を判定して、対象のDLLをコピーしている。)
"HidemaruMacroInstallerSubModule.vbs"を修正
"HidemaruMacroInstaller.vbs"を修正
ちなみに、起動中の秀丸エディタを見つけた場合、レジストの検索結果より、プロセス実行中のパスを優先します。
"HidemaruMacroInstallerSubModule.vbs"を修正
"HidemaruMacroInstaller.vbs"を修正
インストール場所の検索に失敗していたのを修正。
"HidemaruMacroInstaller.vbs"を修正
4.1.1 COM/OLEの操作
macrodll.dllのVersion.0.81より、COM/OLEを操作する関数が追加されました。これまでは、DDE通信や起動オプションでしか、他のアプリケーションと連携する方法がありませんでしたが、(アプリケーションが対応していれば) COM/OLEを使った連携が可能になります。
例えば、
等が可能です。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の記述例
秀丸マクロ+macrodll.dllの記述例
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
変更前
変更後 "Sleipnir.API" -> "Lunascape2.LunascapeAPI"
目次へ