- ベストアンサー
秀丸の正規表現用DLLをDelphiから使いたい
- 秀丸に同梱されている正規表現処理用DLL、HMJRE.DLLをDelphiで使用しようとしていますが、うまくいきません。
- 実行しようとすると「エントリーポイントが見つかりません」と表示されます。
- DelphiのバージョンはXE5です。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
>実行しようとすると「エントリーポイントが見つかりません」と表示されます。 HMJRE.DLLにdllfuncstr()でエクポートされているエントリはありませんから当然でしょうね。 >秀丸のヘルプにマクロから呼び出す場合の例 が次のように記載されています。 秀丸のマクロの機能としてdllfuncstr()があるのであって、HMJRE.DLLにdllfuncstr()があるわけではありません。 「Delphi DLL 使い方」辺りで検索してみましょう。 手元にDelphi環境があるワケではないので未確認にはなりますが… function ReplaceRegularNoCaseSence(ReplaceRegular:String, Pattern:String, index:Integer, Replace:String, Action:Integer): String; stdcall; external 'HMJRE.DLL' name 'ReplaceRegularNoCaseSence'; ってな感じになるかと。
その他の回答 (1)
- 山本 隆(@tyamamoto)
- ベストアンサー率60% (12/20)
ReplaceRegularNoCaseSense関数の定義は次のようになります。 /// <summary> /// 特定の文字列から特定の正規表現パターンのマッチングをして、ヒットした場合はパラメータに従った置換を実行し、その置換した結果の文字列を返します。 /// </summary> /// <param name="pszPattern"> /// 検索したい正規表現文字列 /// </param> /// <param name="pszTarget"> /// 検索対象の文字列 /// </param> /// <param name="iStart"> /// 検索を開始する桁位置 /// </param> /// <param name="pszReplace"> /// 検索でヒットした文字列を置換する用の文字列 /// </param> /// <param name="iMode"> /// 最初にヒットした文字を置換、1.ヒットしたすべての文字を置換 /// </param> /// <returns> /// 置換した結果の文字列 /// </returns> function ReplaceRegularNoCaseSense(pszPattern: PAnsiChar; pszTarget: PAnsiChar; iStart: Integer; pszReplace: PAnsiChar; iMode: Integer): PAnsiChar; stdcall; external 'HMJRE.DLL' name 'ReplaceRegularNoCaseSense'; ReplaceRegularNoCaseSense関数の使用例です。 procedure TForm1.Button1Click(Sender: TObject); var S: AnsiString; begin S := ReplaceRegularNoCaseSense( PAnsiChar('([a-z]+)([0-9]+)'), // 検索したい正規表現文字列 PAnsiChar('--abcdefg1234567--'), // 検索対象の文字列 0, // 検索を開始する桁位置 '\2\1', // 検索でヒットした文字列を置換する用の文字列 1 // 0.最初にヒットした文字を置換、1.ヒットしたすべての文字を置換 ); Memo1.Lines.Add(S); end; 正規表現を使用したいのであれば、標準ライブラリのTRegExを使う方が簡単ですよ。
お礼
ありがとうございます。 Delphiの標準ライブラリを使うことにしました。
補足
回答ありがとうございます。 「文字列の暗黙のキャスト...」という警告は出ますがコンパイルは成功しているのに、Window画面が出ません。 unitの内容は以下の通りです。 ----- unit ProTest4Unit1; interface uses Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.StdCtrls; function ReplaceRegularNoCaseSence(ReplaceRegular:String; Pattern:String; index:Integer; Replace:String; Action:Integer): String; stdcall; external 'HMJRE.DLL' name 'ReplaceRegularNoCaseSence'; type TForm1 = class(TForm) Button1: TButton; Memo1: TMemo; procedure Button1Click(Sender: TObject); private { Private 宣言 } public { Public 宣言 } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.Button1Click(Sender: TObject); var S: AnsiString; begin S := ReplaceRegularNoCaseSence( PAnsiChar('([a-z]+)([0-9]+)'), // 検索したい正規表現文字列 PAnsiChar('--abcdefg1234567--'), // 検索対象の文字列 0, // 検索を開始する桁位置 '\2\1', // 検索でヒットした文字列を置換する用の文字列 1 // 0.最初にヒットした文字を置換、1.ヒットしたすべての文字を置換 ); Memo1.Lines.Add(S); end; end. ----- >正規表現を使用したいのであれば、標準ライブラリのTRegExを使う方が簡単ですよ。 秀丸で作った正規表現がそのまま使えて便利なのではと思ったのです。 (アプリによって正規表現が少し違うというようなことがどこかのサイトに書かれていました) もう少し、他の方の回答を待って、標準ライブラリの使用も検討してみます。
お礼
ありがとうございます。 Delphiの標準ライブラリを使うことにしました。
補足
回答ありがとうございます。 エラーは出なくなったのですが、 実行すると、Window画面を表示せず終了してしまいます。 uses ... function ReplaceRegularNoCaseSence(ReplaceRegular:String; Pattern:String; index:Integer; Replace:String; Action:Integer): String; stdcall; external 'HMJRE.DLL' name 'ReplaceRegularNoCaseSence'; (区切り文字を「,」から「;」に修正しています) ... procedure TForm1.Button1Click(Sender: TObject); var ReplaceRegular, Pattern, Replace :String; index, Action:Integer; begin ReplaceRegular := '123'; Pattern := '12'; index := 0; Replace := 'abc'; Action := 1;// Label3.Caption := ReplaceRegularNoCaseSence(ReplaceRegular, Pattern, index, Replace, Action);//ここをコメントにするとWindow画面は表示されます end;