秀丸に同梱されている正規表現処理用DLL、HMJRE.DLLをDelphiで使用しようとしているのですが、
うまくいきません。
実行しようとすると「エントリーポイントが見つかりません」と表示されます。
----------------------
function dllfuncstr(func:String;find_str:String;target_str:String;start_pos:Integer;replace_str:String;kind:Integer):String; external 'HMJRE.DLL';
...
procedure TForm1.Button1Click(Sender: TObject);
var
find_str, target_str, replace_str:String;
start_pos, kind:Integer;
begin
find_str := '123';
target_str := Memo1.Lines[0];
start_pos := 0;
replace_str := 'abc';
kind := 1;//
Memo2.Lines[0]:= dllfuncstr('ReplaceRegularNoCaseSence',find_str,target_str,start_pos,replace_str,1);
end;
-----
秀丸のヘルプにマクロから呼び出す場合の例 が次のように記載されています。
$s = dllfuncstr( "ReplaceRegular", "([a-z]+)([0-9]+)", "--abcdefg1234567--", 0, "\\2\\1" );
message $s;
DelphiのバージョンはXE5です。
No.2
- 回答日時:
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を使う方が簡単ですよ。
この回答への補足
回答ありがとうございます。
「文字列の暗黙のキャスト...」という警告は出ますがコンパイルは成功しているのに、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を使う方が簡単ですよ。
秀丸で作った正規表現がそのまま使えて便利なのではと思ったのです。
(アプリによって正規表現が少し違うというようなことがどこかのサイトに書かれていました)
もう少し、他の方の回答を待って、標準ライブラリの使用も検討してみます。
No.1ベストアンサー
- 回答日時:
>実行しようとすると「エントリーポイントが見つかりません」と表示されます。
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';
ってな感じになるかと。
この回答への補足
回答ありがとうございます。
エラーは出なくなったのですが、
実行すると、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;
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・人生のプチ美学を教えてください!!
- ・10秒目をつむったら…
- ・あなたの習慣について教えてください!!
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・【大喜利】【投稿~9/18】 おとぎ話『桃太郎』の知られざるエピソード
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
正規表現で、特定の文字列を含...
-
VBA 置換文字がみつからない時
-
csvデータのダブルクォーテーシ...
-
各項目がダブルクォーテーショ...
-
【Excel VBA】文字列の置換作業...
-
vbs 連続した8タブを空白に変換...
-
EXCEL警告「置換対象のデータが...
-
正規表現でテキストの中身を置...
-
置換文字列の中に"?"があると置...
-
VBAでの文字列置換
-
パワーポイントの一括置換:複...
-
秀丸マクロ ファイル名変更
-
複数のパワーポイントファイル...
-
数百個のhtmlファイルの任意の...
-
csvデータ ダブルクォーテ...
-
○文字目に文字挿入
-
正規表現 特定の文字列を含む行...
-
C#で空白行を削除する方法
-
SQL IIF と REPLACE のやりかた
-
Eclipse 改行後のタブ
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
VBA 置換文字がみつからない時
-
各項目がダブルクォーテーショ...
-
正規表現で、特定の文字列を含...
-
csvデータ ダブルクォーテ...
-
スペースで区切られた氏名から...
-
正規表現 特定の文字列を含む行...
-
○文字目に文字挿入
-
C#で空白行を削除する方法
-
EXCEL警告「置換対象のデータが...
-
Excel・ユーザーフォームの情報...
-
ハングルを日本語に置換
-
秀丸エディタで、「-」や「ー」...
-
EXCEL VBA でCTRL+Fのダイア...
-
xmlファイル内の文字列置換
-
csvデータのダブルクォーテーシ...
-
C言語でテキストファイルの内容...
-
テキストボックスの文字列を置...
-
Eclipse 改行後のタブ
-
特定の列のみ置換を行いたい
-
パワーポイントの一括置換:複...
おすすめ情報