最終更新日 2021-03-21

数値の扱い方① IntPtr型

概要

数値型はIntPtr型にするのが良いでしょう。
なぜなら、「秀丸エディタ 32bit 版」の「秀丸マクロの数値タイプの変数」は、「32bit」である一方、
「秀丸エディタ 64bit 版」の「秀丸マクロの数値タイプの変数」は、「64bit」だからです。

しかし、IntPtr型で数値計算をしようとすると、やたらとキャストが多くなってしまうという問題があります。

あなたがC#9.0以降を利用可能な環境 (Visual Studio 2019 ver 16.8以降) であれば、
IntPtr型ではなく、nint型の利用をおすすめします。
nint 型については、IntPtr より nint が便利 にて解説しています。

また、あなたが自作するdllの想定される利用シーンが「秀丸エディタ 32bit 版でも 64bit版でも」関係なく「int の数の範囲で十分だ」ということであれば、
IntPtr でも nint でもなく、intで良いでしょう。

秀丸マクロから引数として渡ってくる数値の範囲が int に収まっているのであれば、それは問題なく動作します。

数値系の基本的な関数の書き方

ClassLibrary36.cs
using System;
using System.Runtime.InteropServices;

namespace ClassLibrary36
{
    public class Class1
    {
        [DllExport]
        public static IntPtr abc(IntPtr a, IntPtr b)
        {
            int c = (int)a + (int)b;
            System.Diagnostics.Trace.WriteLine(a.ToString());
            System.Diagnostics.Trace.WriteLine(b.GetType().ToString());

            return (IntPtr)(10 + c);
        }

        // 秀丸のプロセスが閉じた時に、実行される。
        [DllExport("DllDetachFunc_After_Hm866")]
        public static IntPtr OnDestroy(IntPtr release_status)
        {
            System.Diagnostics.Trace.WriteLine(release_status);
            return (IntPtr)1;
        }
    }
}
Trace.WriteLine の確認方法は? 秀丸専用のツールや、他のいろいろな応用も含めて、
Trace.WriteLine("...")やConsole.WriteLine("...")の確認方法
にて解説しています。

DllDetachFunc_After_Hm866 とは

DllDetachFunc_After_Hm866 とは 秀丸の「該当プロセス」が終了した時に呼ばれる呼ばれるメソッドです。
秀丸エディタ 8.66 以上で実行されます。
もし8.66未満だった場合は、「このメソッドは呼ばれない」だけでエラーにはなりません。

プロセスが閉じるとは、秀丸をタブ表示しているならばタブがなくなれば呼ばれるということになります。
ファイルを閉じた時とは異なることに注意してください。
特に勘違いしやすいのが、「タブが1つだけ」だった時
です。

以下のように元々タブが一つだった時は、このタブを「閉じた」としても、「開いていたファイル名」→「無題」となるだけで、
該当の秀丸プロセスは閉じていません。

PICTURE

    ↓

PICTURE

呼び出し側

ClassLibrary36.mac
#DLL = loaddll( currentmacrodirectory + @"\ClassLibrary36.dll");
#num = dllfuncw( #DLL, "abc", 1000);
message(str(#num));