一番最初のインストラクション

C++側のソース

  • 数値

    THmNumber

    intptr_t と直接記述するよりも、THmNumber と記述しておくと、ソースの変更なしで 整数版秀丸、浮動小数版秀丸、両方に対応できる。
    浮動小数版は利用しないという場合、intptr_tと記述しても同じです。

    文字列

    wchar_t* と wstring

    export関数まわりのみ wchar_t*、それ以外の場所では原則 wstring で。

    export関数の先頭行

    Hm.funcDllExport()

    extern "C" __declspec(dllexport) している関数の先頭行で、Hm.funcDllExport() を呼び出す。
    秀丸マクロ上のdll番号がdll内へと伝達され、bindされます。
    秀丸マクロとC++の相互情報伝達のためにこのbindが必要となっています。

    dll1.dllとしてコンパイル
    #include "HmCppInvoke.h"
    
    using namespace Hidemaru;
    using namespace std;
    
    // 数値は「THmNumber」型を可能な限り利用すること。
    extern "C" __declspec(dllexport) THmNumber num_add(THmNumber arg1, wchar_t* arg2) {
        // 秀丸マクロから呼び出す export 関数では先頭に「Hm.funcDllExport()」を呼び出すこと。
        // この呼び出しがdll内で1回でも呼び出した後で、はじめて、Hm.***の各種メソッドが機能するようになります。
        Hm.funcDllExport();
    
        THmNumber add = arg1 + stol(arg2);
        Hm.OutputPane.output(L"arg1 + arg2:" + to_wstring(add) + L"\r\n");
        Hm.OutputPane.output(L"\r\n");
    
        return add;
    }
    
    // 文字列は秀丸マクロから呼び出すextern関数は「wchar_t」ベースで考えること。
    wstring return_of_str_add = L"";
    extern "C" __declspec(dllexport) wchar_t* str_add(wchar_t* arg1, wchar_t* arg2) {
        // 秀丸マクロから呼び出す export 関数では先頭に「Hm.funcDllExport()」を呼び出すこと。
        // この呼び出しがdll内で1回でも呼び出した後で、はじめて、Hm.***の各種メソッドが機能するようになります。
        Hm.funcDllExport();
    
        wstring add = wstring(arg1) + wstring(arg2);
        Hm.OutputPane.output(L"arg1 + arg2:" + add + L"\r\n");
    
        return_of_str_add = add;
        return return_of_str_add.data();
    }
    
    BOOL WINAPI DllMain( HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpReserved)
    {
        switch (fdwReason)
        {
        case DLL_PROCESS_ATTACH:
            break;
    
        case DLL_THREAD_ATTACH:
            break;
    
        case DLL_THREAD_DETACH:
            break;
    
        case DLL_PROCESS_DETACH:
            break;
        }
        return TRUE;
    }
    

秀丸マクロ側の呼び出しのソース

  • 「数値」が返ってくる関数

    dllfuncw

    「文字列」が返ってくる関数

    dllfuncstrw
    test.mac
    // dllの呼び出し。dll1.dllのところは実際にコンパイルされたdll名に置き換えること。
    #dll = loaddll(currentmacrodirectory + @"\dll1.dll");
    
    // 途中でマクロの文法や型の致命的エラーが発生した場合でもdllを解放する。
    if (version >= 898) { eval "keepdll #dll, 0"; }
    
    // 返り値が数値型なら、「dllfuncw」。引数の型が文字列の際はwchar_tで渡っていることを示す「w」を忘れないこと。
    #r = dllfuncw(#dll, "num_add", 3000, "-2000");
    message(str(#r));
    
    // 返り値が文字列型jなら「dllfuncstrw」と「str」と「w」付きで呼び出す。
    $r = dllfuncstrw(#dll, "str_add", "あいうえお", "★");
    message($r);
    
    freedll(#dll);