秀丸本体から提供されている関数

概要

秀丸本体からいくつかの関数が提供されています。
(DLL側から秀丸エディタの関数呼び出し)
「hm.NET」ではこれらはすべて「C#から使いやすい形」で提供されていますが、
hm.NET を利用しない場合は、ご自身で利用できるように整える必要があります。

[DllImport("Hidemaru.exe", CallingConvention = CallingConvention.Winapi)]

不特定多数者に配布するような丁寧に実装するライブラリであれば、
秀丸本体のファイル名や、秀丸のバージョンが特定できないため、関数を遅延ロードして関数のあるなしを判定するべきですが、
あなたがご自身のみ使用する(あるいは、小集団で秀丸のバージョンを一定以上にできるなど、状況をコントロールできる中で使用する)ならば、
「秀丸本体のファイル名は、Hidemaru.exeだし、その関数は存在する」という前提で記述しても良いでしょう。


秀丸から呼び出されるdllを作成しているわけですから、「秀丸本体(Hidemaru.exe)」は「dllがロードされているプロセスにロード済み」という前提が100%成立します。
Hidemaru.exe のファイル名を変更していない限り、そのモジュール(Hidemaru.exe)はすでにカレントプロセスにロードされているため、
秀丸本体がどのディレクトリにあるか、などは無関係にC#から普通にDllImportできます。

NET4COMServer.cs
using System;
using System.Diagnostics;
using System.Runtime.InteropServices;

namespace NET4COMServer
{
    [Guid("BD55F2A6-9ED0-4F4F-9D37-E6B84BE63272")]
    public class NET4COMServer
    {
        public string get_cursor_pos()
        {
            int lineno = 0;
            int column = 0;

            int success = Hidemaru_GetCursorPosUnicode(out lineno, out column);
            if (success != 0)
            {
                return (lineno.ToString() + "," + column.ToString());
            }

            return "(-1,-1)";
        }

        [DllImport("Hidemaru.exe", CallingConvention = CallingConvention.Winapi)]
        extern static int Hidemaru_GetCursorPosUnicode(out int pnLineNo, out int pnColumn);
    }
}

繰り返しとなりますが、使用者の秀丸のバージョンの管理が効く簡易な実装方法となります。(その分見通しが良い)

より汎用的で、不特定多数者に配布するならば、遅延ロードするべきです。
(Hidemaru.exe のファイル名が変更されていても大丈夫、関数が存在しないバージョンでもフリーズしないような作り)

.NETでのネイティブdllの遅延ロードの仕方は、一般的な話となります。
秀丸マクロのヘルプを開き「検索」のところで「GetProcAddress」として検索すると、遅延ロードのサンプルが出てきます。

呼び出し側

NET4COMServer.mac
#obj = createobject( currentmacrodirectory + @"\NET4COMServer.dll", "NET4COMServer.NET4COMServer");

$pos = member(#obj, "get_cursor_pos");
message($pos);

releaseobject(#obj); // dllは解放されないが、dll内の関数が呼ばれるので意味がある

hm.NETと同じようなメソッド群関数が使えるようになるHmNetCOM

HmNetCOMとして用意しています。