HmJre.dllの使い方についてNo.38102
fzok4234 さん 20/04/01 18:08
 
HmJre.dllの使い方についてですが、jre32.dll互換のAPIの使い方がヘルプに載って
いないため、自作アプリなどのdll呼び出しの処理系からHmJre.dllを利用する方法が
わかりません。

現在、jre32.dllの開発元の山田和夫氏のサイト

http://www.yamada-labs.com/software/spec/jre/

が閉鎖されてしまっているため、Jre2Openなどのjre32.dll互換のAPIの使い方を調べ
ることができない状態です。当方では、C#のP/Invoke機能を使って自作のC#アプリや
PowerShellなどの.Net環境からHmJre.dllを呼び出して、正規表現の実行速度のベン
チマークをとるような運用を検討しているのですが、HmJre.dll内の関数やJRE2構造
体のバイト構成の情報がないため手の付けようがありません。

できればjre32.dll互換の関数や構造体の説明を含めたHmJre.dllの完全なAPIリファ
レンスや、C/C++でアプリ制作を行う人向けのヘッダーファイルなどを秀丸エディタ
に同梱してもらえれば助かります。


[ ]
RE:38102 HmJre.dllの使い方についてNo.38103
秀まるお2 さん 20/04/02 12:05
 
 山田和夫さんのサイトがアクセス不能になってるのですね。

 とりあえず、JREUSR.HってヘッダファイルとJreFuzzy.hをアップロードしました。

    https://hide.maruo.co.jp/software/bin3/hmjreheader507.zip

 使い方ですが・・・簡単な例だと以下のようになります。こんな感じでだいたい見
当付けて呼び出してみて欲しいです。不明な点は、とりあえず会議室で質問していた
だければお返事できると思います。


char* FindRegular( char* pszTarget, int cchTarget, char* pszFind ) {
    LoadJre();
    if( fJreLoadError ) {
        return NULL;
    }
    JRE2    jredata;
    jredata.dwSize = sizeof(jredata);
    if( !pfnJreOpen( &jredata ) ) {
        return NULL;
    }
    if( !pfnJreCompile( &jredata, pszFind ) ) {
        return NULL;
    }
    jredata.nStart = 0;
    BOOL    fHit = pfnJreGetMatchInfo_V318( &jredata, pszTarget, cchTarget,
FALSE, NULL );
    pfnJreClose( &jredata );
    if( !fHit ) {
        return NULL;
    }
    return pszTarget + jredata.nPosition;
}


HANDLE  hmodJre;
BOOL (FAR PASCAL *pfnJreOpen)( void* lpjreJre );
BOOL (FAR PASCAL *pfnJreCompile)( void* lpjreJre, LPSTR lpszRe );
BOOL (FAR PASCAL *pfnJreGetMatchInfo)( void* lpjreJre, LPSTR lpszStr );
//HmJre.dll V3.18
//BOOL (FAR PASCAL *pfnJreGetMatchInfo_HmJre)( void* lpjreJre, LPSTR lpszStr,
 int cchStr );     //V4.54
BOOL (FAR PASCAL *pfnJreGetMatchInfo_V318)( void* lpjreJre, LPSTR lpszStr, i
nt cchStr, BOOL fWordFuzzyMatch, void* pFuzzyData );        //V4.54
BOOL (FAR PASCAL *pfnJreClose)( void* lpjreJre );
static WORD (FAR PASCAL *pfnJreGetVersion)( void );
static int  (FAR PASCAL *pfnGetJreMessage)( int nMessageType, int nLanguage,
 LPSTR lpszBuff, int cbBuff );
static UINT (FAR PASCAL *pfnDecodeEscSeq)( LPSTR lpszRe, LPSTR lpszBuff, UIN
T uiSize );
BOOL (FAR PASCAL *pfnJreSetCodePage)( void* lpjre, UINT cp );
static BOOL     fJreLoadError;
static char szJrePath[MAX_PATH];
static int  xJrePathBaseName = 0;

static BOOL (FAR PASCAL *pfnFuzzy_Open)( JREFUZZYDATA* pData, UINT cp );
static BOOL (FAR PASCAL *pfnFuzzy_Close)( JREFUZZYDATA* pData );
static BOOL (FAR PASCAL *pfnFuzzy_ConvertTarget)( JREFUZZYDATA* pData, const
 char* pszSrc );
static BOOL (FAR PASCAL *pfnFuzzy_ConvertFindString)( JREFUZZYDATA* pData, c
onst char* pszSrc, BOOL fRegular );
static int (FAR PASCAL *pfnFuzzy_FindArea2RealArea)( JREFUZZYDATA* pData, in
t x, int* pcchMatch );      //V4.00β5
static int (FAR PASCAL *pfnFuzzy_RealPos2FindPos)( JREFUZZYDATA* pData, int
x );
static BOOL (FAR _cdecl *pfnFuzzy_OptionDialog)( HWND hwndParent, BOOL fEnab
leNoReturn );
static JREFUZZYDATA* (WINAPI *pfnFuzzy_GetFuzzyDataInJre)( void* pJre );



LoadJre関数・・・こんな感じの処理

        hmodJre = LoadLibrary( szJrePath ); // LoadとFreeは対になっていない
ので注意
        if( hmodJre == NULL ) {
#ifdef _DEBUG
            int nError = GetLastError();
#endif
            fJreLoadError = 1 /*IDS_JRE_DLL_CANNOT_LOAD*/;
            return FALSE;
        }
        static struct FARPROCANDLABEL aProcLabel[] = {
            { (FARPROC*)&pfnJreOpen, "Jre2Open" },
            { (FARPROC*)&pfnJreCompile, "Jre2Compile" },
            { (FARPROC*)&pfnJreGetMatchInfo, "Jre2GetMatchInfo" },
//          { (FARPROC*)&pfnJreGetMatchInfo_HmJre, "Jre2GetMatchInfo_HmJre" },
            { (FARPROC*)&pfnJreGetMatchInfo_V318, "Jre2GetMatchInfo_V318" },
            { (FARPROC*)&pfnJreClose, "Jre2Close" },
            { (FARPROC*)&pfnJreGetVersion, "JreGetVersion" },
            { (FARPROC*)&pfnGetJreMessage, "GetJreMessage" },
            { (FARPROC*)&pfnDecodeEscSeq, "DecodeEscSeq" },
            { (FARPROC*)&pfnJreSetCodePage, "Jre2SetCodePage" },
            { (FARPROC*)&pfnFuzzy_Open, "Fuzzy_Open" },
            { (FARPROC*)&pfnFuzzy_Close, "Fuzzy_Close" },
            { (FARPROC*)&pfnFuzzy_ConvertTarget, "Fuzzy_ConvertTarget" },
            { (FARPROC*)&pfnFuzzy_ConvertFindString, "Fuzzy_ConvertFindStrin
g" },
            { (FARPROC*)&pfnFuzzy_FindArea2RealArea, "Fuzzy_FindArea2RealAre
a" },       //V4.00β5
            { (FARPROC*)&pfnFuzzy_RealPos2FindPos, "Fuzzy_RealPos2FindPos" },
       //V4.00β5
            { (FARPROC*)&pfnFuzzy_OptionDialog, "Fuzzy_OptionDialog" },
            { (FARPROC*)&pfnFuzzy_GetFuzzyDataInJre, "Fuzzy_GetFuzzyDataInJr
e" },
            { NULL, NULL },
        };
        GetProcAddressMulti( (HINSTANCE)hmodJre, aProcLabel );
        if( pfnJreGetMatchInfo_V318 == NULL ) {
            pfnJreGetMatchInfo_V318 = JreGetMatchInfo_V318_Local;
            pfnJreSetCodePage = NULL;       //V6.15final 鬼車の場合になぜか
これを呼ぶと後でGetMatchInfoの時に落ちてしまう。
        }
        if( pfnJreSetCodePage == NULL ) {
            pfnJreSetCodePage = JreSetCodePage_Dummy;
        }

[ ]
RE:38103 HmJre.dllの使い方についてNo.38104
fzok4234 さん 20/04/02 16:08
 
わざわざサンプルコードまでご提示いただいてありがとうございます。一応、ヘルプ
ファイル HmJre.chm の「JRE32.DLL互換API」のページの内容は修正が必要みたいで
すね。


[ ]
RE:38103 HmJre.dllの使い方についてNo.38105
h-tom さん 20/04/02 22:09
 
h-tom です。

>        GetProcAddressMulti( (HINSTANCE)hmodJre, aProcLabel );
>        if( pfnJreGetMatchInfo_V318 == NULL ) {
>            pfnJreGetMatchInfo_V318 = JreGetMatchInfo_V318_Local;
>            pfnJreSetCodePage = NULL;       //V6.15final 鬼車の場合になぜかこ
>れを呼ぶと後でGetMatchInfoの時に落ちてしまう。
>        }
hmonig.dllの事かな?
「JreSetCodePage」で色々初期化してて、「Jre2Compile」でチェックしているつも
りでしたが、どこかチェックが抜けてたかな?
チョット見直してみます。

hmonig.dllは「JreGetMatchInfo_HmJre」は対応していますが、「JreGetMatchInfo_V
318」や「Jre2GetMatchInfo_V500」は未対応です。
引数をみると、追加されているのはあいまい検索関連ですかね?(V500はリミット
値?も追加)
この追加された引数を無視して、普通に(?)検索結果を返しても大丈夫でしょうか?
(fWordFuzzyMatch が false なら大丈夫そうですけど)

でも、JREFUZZYDATAをよく見ると、codepage とか追加されてますね。ここは見ない
と駄目とか?

[ ]
RE:38104 HmJre.dllの使い方についてNo.38107
秀まるお2 さん 20/04/03 08:31
 
 ヘルプはぼちぼち直そうと思います。

[ ]
RE:38105 HmJre.dllの使い方についてNo.38108
秀まるお2 さん 20/04/03 08:36
 
 JreGetMatchInfo_V318などを追加した経緯はちょっとコースコードとか過去の記録
を見直さないと分からないんですけども、hmonig.dllさんが同じように対応しなくて
も大丈夫なはずではあります。

 コードページについては、たぶん秀丸エディタでのエンコードを欧文や中国語にし
た時に問題があって追加したはずなんだと思いますが、hmonig.dllの場合はこれを呼
んでないということは、欧文や中国語でhmonig.dllを使った場合は問題が出る可能性
はあるかと思います。これも当時の経緯を調べてみないとなんとも分かりません。

[ ]
RE:38105 HmJre.dllの使い方についてNo.38109
秀まるお2 さん 20/04/03 08:59
 
 ちょっとソースコード見直してみました。

 _V318については、たしかにあいまい検索のパラメータを渡すバージョンというこ
とのようです。

 _V500の方は、当時の議事録(?)に以下の記録がありました。秀丸エディタのVer
sion 8.66β1で対応してるようです。

 経緯としては・・・検索で「指定した範囲内のみ」をONにしてて、さらに「検索文
字列を強調」もONにしてる時に、指定した範囲外についても色が付いてしまう問題に
対応するためのようです。xEndHitableを指定するのはそういう場合(範囲選択指定
ありで、しかも検索文字列の強調の時)だけです。

-----------------------------------------------------------------
BOOL EXTAPI Jre2GetMatchInfo_V500(
                LPJRE2 pJre,
                LPSTR pszTarget,
                int xEnd,
                BOOL fWordFuzzyMatch,
                JREFUZZYDATA* pFuzzyData,
                int xEndHitable );

 って関数を追加してます。

 Jre2GetMatchInfo_V318に、xEndHitableパラメータが追加になってます。

 xEndHitableには、普通はxEndと同じ値を指定します。xEndよりも小さい値を
指定すると、その範囲だけで検索して、ヒットする長さ的にもxEndまでとなりま
す。

 マクロでテストする用の関数も用意しました。


INT_PTR _cdecl FindRegularLimited( char* pszPattern, char* pszTarget, int xS
tart, int xEndLimit );

 って関数を追加してます。(あくまでテスト用なので将来無くすかもしれない
けど)

    loaddll "hmjre.dll";
    #n = dllfunc("FindRegularLimited", "(?<!ab).*", "abcdefg", 2, 2);
    message "x = " + str(#n) + "   len=" + str(dllfunc("GetLastMatchLength"));
    #n = dllfunc("FindRegularLimited", ".?", "abcdefg", 4, 4);
    message "x = " + str(#n) + "   len=" + str(dllfunc("GetLastMatchLength"));

 ってな具合でテストできます。そこそこいろんなパターンでテストしたので大丈夫
だと思います。

[ ]
RE:38107 HmJre.dllの使い方についてNo.38111
秀まるお2 さん 20/04/03 09:44
 
 ヘルプを直す前に、とりあえず山田和夫さんに連絡メールを出してみました。

 山田和夫さんのサイトに掲載されてた「jresdk.lzh」ってファイル(ヘッダファイ
ル&説明ファイル)はうちの会社にもありましたので、許可が得られればうちのサイ
トにも転載しようと思います。

[ ]
RE:38109 HmJre.dllの使い方についてNo.38119
h-tom さん 20/04/05 23:35
 
h-tom です。

> ちょっとソースコード見直してみました。
>
> _V318については、たしかにあいまい検索のパラメータを渡すバージョンということ
>のようです。
>
> _V500の方は、当時の議事録(?)に以下の記録がありました。秀丸エディタの
>Version 8.66β1で対応してるようです。
>
> 経緯としては・・・検索で「指定した範囲内のみ」をONにしてて、さらに「検索文
>字列を強調」もONにしてる時に、指定した範囲外についても色が付いてしまう問題に
>対応するためのようです。xEndHitableを指定するのはそういう場合(範囲選択指定あ
>りで、しかも検索文字列の強調の時)だけです。

情報ありがとうございます。
hmonig.dllは「JreSetCodePage」に一応対応しています。

サンプルが、

> if( pfnJreGetMatchInfo_V318 == NULL ) {
>     pfnJreGetMatchInfo_V318 = JreGetMatchInfo_V318_Local;
>     pfnJreSetCodePage = NULL;
> }

となっていたので、「JreGetMatchInfo_V318」がないと、「JreSetCodePage」が
呼ばれないのかと思いましたが、デバッグ用DLLで確認すると、ちゃんと
「JreSetCodePage」は呼ばれているので、現状でも問題なさそうです。

あと、あいまい検索を無視すれば、「JreGetMatchInfo_V318」や「Jre2GetMatchInfo
_V500」
にも対応可能なので、いろいろ試してみます。

あいまい検索以外の引数の意味は、こんな感じでしょうか?
xEnd       :対象の長さ
xEndHitable:マッチ範囲の長さ(xEndHitable <= xEnd、先頭は pJre->nStart?)

[ ]
RE:38111 HmJre.dllの使い方についてNo.38121
fzok4234 さん 20/04/06 13:43
 

> 山田和夫さんのサイトに掲載されてた「jresdk.lzh」ってファイル(ヘッダファ
>イル&説明ファイル)はうちの会社にもありましたので、許可が得られればうちの
>サイトにも転載しようと思います。

縁起の悪い話ですが、もし仮に山田和夫氏が他界されていたり刑事施設に収監されて
いたりなどで半永久的に使用許可が下りない状態の場合の想定は御社でされているの
でしょうか。たとえフリーソフトといえどGitHubなどのオープンソースコミュニティ
で共有されていない場合は第三者が再利用できなくなるリスクが付きまとっています。


[ ]
RE:38119 HmJre.dllの使い方についてNo.38122
秀まるお2 さん 20/04/06 14:25
 
> あいまい検索以外の引数の意味は、こんな感じでしょうか?
> xEnd       :対象の長さ
> xEndHitable:マッチ範囲の長さ(xEndHitable <= xEnd、先頭は pJre->nStart?)

 そうなってます。

 _V318を追加した理由として、秀丸エディタの方で検索対象文字列の長さを持って
いるにもかかわらずHmJre.dll側にそれを渡すパラメータが無いために、HmJre.dll側
が毎回strlen()で長さ計算するのが多少性能的に良くなくて、長さパラメータを追加
したってことになります。

 xEndHitableもご想像の通りです。

[ ]
RE:38121 HmJre.dllの使い方についてNo.38123
秀まるお2 さん 20/04/06 14:41
 
 今のところ山田さんからメールの返事は無いのですが、とりあえずHmJre.dllの呼
び出し方はそんなに難しい所は無いので、jresdk.lzhが公開できなくてもそんなに大
した問題は無いんじゃないかと思います。

 というか、もし不明な点があれば僕に聞いてくれればお返事できると思います。

[ ]
RE:38123 HmJre.dllの使い方についてNo.38151
秀まるお2 さん 20/04/10 14:01
 
 遅ればせながら、山田和夫さんからお返事がありました。jresdk.lzhはうちのホー
ムページに掲載してもいいとのことです。(ファイルはいじらずにそのまま、または
zip形式に変換するだけならいいとの話)

 zip形式にせすにそのまま掲載しました。

 あと、ファイル名間違えてました。jresdk.lzhじゃなくて、jredoc.lzhでした。

  https://hide.maruo.co.jp/software/bin3/jredoc.lzh

 lzh形式なので、セキュリティソフトが警告を出す可能性はあります。その辺ご注
意ください。

[ ]
RE:38151 HmJre.dllの使い方についてNo.38152
fzok4234 さん 20/04/10 18:58
 
ありがとうございます。


[ ]