要望jre32とbreglf(bregexp)判別No.08109
安久津 さん 01/03/23 12:04
 
こんにちは秀丸担当さん、安久津といいます。
arimac さんの breglf.dll と Baba さんの bregexp.dll 関連で要望です。

●要望
(1)オリジナルの jre32.dll と breglf.dll のどちらを使っているのかを、
   マクロから判別できるようなコマンドが欲しいです。
   検索ダイアログで出てくる jre32.dll のバージョン をマクロから
   取得できるだけでも良いです。

(2)オリジナルの jre32.dll と 名前を変えない breglf.dll を、
   メニューやマクロから、切り替えられるようにして欲しいです。

(3)秀丸が直接 bregexp.dll を使うようになったら良いなと思います。

●詳細
(2)や(3)はともかくとして、(1)の判別コマンドが欲しいです。
私は breglf.dll(bregexp.dll)を検索における標準的な環境にしたいです。
ところが検索や置換を含む既存のマクロが目的の動作をしません。
既存のマクロはほったらかしにしておいてもかまわないのですが、
今後、マクロを作るのなら jre32 と breglf の両方を考慮した作りにしたいです。

例     jre32.dll   breglf.dll(bregexp.dll)
単語の境界 \< or \>  \b
\w+ の意味 [A-Za-z_]+  [0-9A-Za-z_]+

今のままだと処理の分岐ができません。
if( regexpdll == "JRE32.DLL V1.1a" ) $$searchbuf = "\\bprefix\\w+";
else $$searchbuf = "\\<prefix[0-9A-Za-z_]+";

どうかよろしくお願いいたします。m(__)m
では。

[ ]
RE:08109 要望jre32とbreglf(bregexp)判別No.08110
Arimac さん 01/03/23 12:46
 
>例     jre32.dll   breglf.dll(bregexp.dll)
>単語の境界 \< or \>  \b
>\w+ の意味 [A-Za-z_]+  [0-9A-Za-z_]+

BRegIfが正規表現を変換するという手も・・・(^^;
でも、あいまい検索はできないなぁ。

[ ]
RE:08110 要望jre32とbreglf(bregexp)判別No.08111
ENCODINGSHIFTJIS さん 01/03/23 13:52
 

// 正規表現DLL のバージョン 282=0x11A  279=0x117
loaddll "JRE32.dll";
if(!result){menu "load error"; endmacro}
#v=dllfunc("JreGetVersion");
freedll
menu str(#v);

//LIBRARY     JRE32.DLL
//EXPORTS
//    DecodeEscSeq                   @1   ; DecodeEscSeq
//    DllEntryPoint                  @2   ; DllEntryPoint
//    GetJreMessage                  @3   ; GetJreMessage
//    IsMatch                        @4   ; IsMatch
//    Jre2Close                      @5   ; Jre2Close
//    Jre2Compile                    @6   ; Jre2Compile
//    Jre2GetMatchInfo               @7   ; Jre2GetMatchInfo
//    Jre2Open                       @8   ; Jre2Open
//    JreClose                       @9   ; JreClose
//    JreCompile                     @10  ; JreCompile
//    JreGetCopyright                @11  ; JreGetCopyright
//    JreGetMatchInfo                @12  ; JreGetMatchInfo
//    JreGetMinorD                   @13  ; JreGetMinorD
//    JreGetMinorT                   @14  ; JreGetMinorT
//    JreGetVersion                  @15  ; JreGetVersion
//    JreOpen                        @16  ; JreOpen
//    ReLoadExtTable                 @17  ; ReLoadExtTable

正しいcall方法かどうかはわからないが、結果は出ます。


[ ]
RE:08109 要望jre32とbreglf(bregexp)判別No.08121
秀丸担当 さん 01/03/23 18:03
 
>●要望
>(1)オリジナルの jre32.dll と breglf.dll のどちらを使っているのかを、
>&nbsp; &nbsp;マクロから判別できるようなコマンドが欲しいです。
>&nbsp; &nbsp;検索ダイアログで出てくる jre32.dll のバージョン をマクロから
>&nbsp; &nbsp;取得できるだけでも良いです。
>
>(2)オリジナルの jre32.dll と 名前を変えない breglf.dll を、
>&nbsp; &nbsp;メニューやマクロから、切り替えられるようにして欲しいです。
>
>(3)秀丸が直接 bregexp.dll を使うようになったら良いなと思います。

(2)(3)はともかくとして、(1)は検討しておきます。

[ ]
RE:08111 要望jre32とbreglf(bregexp)判別No.08124
安久津 さん 01/03/23 18:16
 
こんにちは ENCODINGSHIFTJIS さん、安久津です。

>// 正規表現DLL のバージョン 282=0x11A  279=0x117
>loaddll "JRE32.dll";
>if(!result){menu "load error"; endmacro}
>#v=dllfunc("JreGetVersion");
>freedll
>menu str(#v);
>正しいcall方法かどうかはわからないが、結果は出ます。
マクロからロードして平気だったですね。分かりませんでした。

さっき気づいたんですけど、これができても強調表示は
どうすることもできないんですね。#こっちはしょうがないか。(^^;)

全部(常駐含む)の秀丸終了して、copy /y breglf.dll jre32.dll して
秀丸立ち上げたら、エラーダイアログが連続して出た。
その時に開いたファイル(ファイルタイプ)の設定で、以下のような
強調表示を指定していました。

[\xA1-\xDF\x87\x40-\x87\x9C\xED\x40-\xEE\xFC]+
[\xF0\x40-\xF9\xFC\xFA\x40-\xFC\x4B]+

#二兎負う者は一兎も得ず。
では。

[ ]
RE:08110 要望jre32とbreglf(bregexp)判別No.08125
安久津 さん 01/03/23 18:16
 
こんにちは arimac さん、安久津です。
 breglf 使っています。Perl/Ruby を使う人は、秀丸でちょっとした正規表現の
テストができます。秀丸ウインドウがデバッグウインドウになります。
大変重宝しています。m(__)m

>BRegIfが正規表現を変換するという手も・・・(^^;
>でも、あいまい検索はできないなぁ。
「jre32 の機能 < bregexp の機能」なので、全く同じようにするには、
 bregexp の活用の範囲を jre32 の方へ近づけることになってしまいそうです。
あっ、私はあいまい検索は使ったことありません。(^^;)
では。

[ ]
RE:08121 要望jre32とbreglf(bregexp)判別No.08127
安久津 さん 01/03/23 18:22
 
>(2)(3)はともかくとして、(1)は検討しておきます。
よろしくお願いいたします。
では。

[ ]
RE:08111 要望jre32とbreglf(bregexp)判別No.08128
える さん 01/03/23 18:32
 
>#v=dllfunc("JreGetVersion");
>正しいcall方法かどうかはわからないが、結果は出ます。

しつこいようですが、スタックが壊れます。
秀丸のマクロヘルプに

> 今回追加したDLL呼び出し機能は、あくまで秀丸エディタ用に作成された形式のDLL
>のための機能であり、一般的なDLLの呼び出しや、WindowsAPIの呼び出しにはほとん
>ど使えません。特に、WindowsAPIは呼び出し規約が_stdcallとなっているので呼び
>出せません。
> そういうDLLを呼び出したい場合には、パイパス用のDLLを作成してください。

とあるように、直接 DLL の関数を呼び出すのは禁止事項だと思っていたほうがいい
です。
いま、改めて見たのですが、

> パラメータの数が足りなかったり多かったりする場合もDLL側の動作がおかしくな
>りますが、DLL側が特に何もしない場合には秀丸側が異常になる(例えばスタックが
>壊れる)ことはありません。

という一文もありますが、これは

C-Declare で宣言している関数を呼び出したのだから、スタック操作は秀丸だけがや
っているから秀丸のスタックは壊れない
Standard Call で宣言している関数を呼び出してしまうと、DLL 側の関数がスタック
を操作してしまうので、秀丸のスタックは壊れる

ということですか?それとも、

DLL 呼び出し前に新しいスタックを作成してそのスタックで DLL 関数の呼び出しを
行ってから作成したスタックを破棄する

ため間違った呼び出し手続きでも安全に呼び出すことができるのでしょうか?
軽くテストした限りは前者で、スタックが壊れて秀丸が異常終了するようです。

[ ]