|
こんにちは。でるもんた・いいじまです。
> 最近、秀丸マクロを作成していて、あったらいいなぁ~という機能が2点あります、
> ご検討いただけますとうれしいです\(^O^)/
>
> ①ファイルとフォルダを列挙する関数。(※1)
> ②DLL側で秀丸エディタのファイル読み込み機能を使いたい。(※2)
前者はcreateobject関数で "Scripting.FileSystemObject" オブジェクトを
呼び出せば今でもできるはずです。
個人的な推測ですが、現状でこの機能が秀丸の組込関数になっていないのは
・技術的には既に可能。仮に自前で作っても「車輪の再発明」になる。
・エディタ上でそこまでやろうという人は、一応存在はするがごく少数。
という2点が理由だと思います。
後者は、文字コードの自動判別をどうするのかの処理が必要ですから、
まずは非表示状態の秀丸プロセスをひとつ生成して、それを読み込むとのが
現実的だと思います。読み込んだ後で自作のDLLからは、秀丸がエクスポート
している関数を呼ぶのがいいでしょう。マクロヘルプ→DLL呼び出し機能→
DLL側から秀丸エディタの関数呼び出し、に一通りの説明があります。
☆ ☆ ☆
以下余談。
> -例2- ファイルの一部を読み込む関数
> *(FARPROC*)&pfnHidemaru_openfilepart = GetProcAddress( hinstExe, "Hidemaru
>_OpenfilePart" );
> WCHAR*text=pfnHidemaru_openfile("c:\\project\\readme_ch.txt", 読込み位置,
>サイズ);
> GlobalFree(text);
この関数の場合、「読み込み位置」「サイズ」の数え方が問題になりますかね。
バイト数なのか、UTF-16でのワード数なのか、それとも文字数なのか。
結合文字や合字の類は全体で1つとするのか、コードポイントごとに1つとするのか。
また、文字コードの自動判別をさせる場合には、どのコードを前提に位置やサイズを
指定するのか。
あと、関数のパラメータの型は今の時代、(const WCHAR[], int64_t, uint64_t) が
順当ですね。特に第一パラメータを const char[] にしちゃうと、ファイル名の中に
CP932の範囲外の文字が入っていた場合に no such file or directory になります。
#さらに余談になりますが、秀丸本体はいまだにWindows98でも動きます。
#これはつまり、コンパイラのビルド設定ではANSIアプリだということです。
#なので本来なら、WinMain()のlpszCmdLine()ではUnicodeの文字は受け取れない
#はずなのです。にもかかわらず、秀丸はUnicodeのファイル名を平然と扱います。
#きちんと GetCommandLineW() を使って丁寧に処理しているのでしょうね。
|
|