「秀丸マクロ」のスコープと「hmLoadCLR」のスコープとの値のやり取り

  • 概要

    秀丸マクロでは直接は「マネージdll」を取り扱うことが出来ません、
    「秀丸マクロ」⇔「hmLoadCLR」で値のやりとりをし、
    hmLoadCLRがマネージdllを処理し、結果を秀丸マクロで受け取るといった手順が多くなります。

    スコープ間の値のやりとり

    「秀丸マクロ」のスコープと「hmLoadCLR」のスコープとの値のやり取りをみてみましょう。

    hmLoadCLRの内部スクリプトとして用意されているLuaの配列はindexが「1」から始まる点にも注意してください。

    #MNG = loaddll( hidemarudir + "\\" + "hmLoadCLR.dll" );
    
    // テーブル{1,2,3}をbbbに代入
    #_ = dllfuncw(#MNG, "DoString", "bbb = {1,2,3}\n");
    
    #_ = dllfuncw(#MNG, "SetNumVar", "var1", 100);
    #num = dllfuncw(#MNG, "GetNumVar", "var1");
    message(str(#num));
    
    #_ = dllfuncw(#MNG, "DoString", "bbb[2] = var1\n" );
    
    // テーブルbbbの[2]をresult_numという変数に代入
    #_ = dllfuncw(#MNG, "DoString", "result_num = bbb[2]" );
    
    // result_numの値を秀丸マクロ側に得る
    #result_num = dllfuncw(#MNG, "GetNumVar", "result_num");
    
    // 表示
    message(str(#result_num));
    
    // hmLoadCLRのスコープにグローバル変数nameとして「武田信玄」という文字列を代入
    #_ = dllfuncw(#MNG, "SetStrVar", "name", "武田信玄");
    
    // 今設定した値を秀丸マクロ側に取得
    $name = dllfuncstrw(#MNG, "GetStrVar", "name");
    message($name);
    
    // bbb[1]の値と-200の絶対値を足しこんで、result_numという変数に代入
    #_ = dllfuncw(#MNG, "DoString", "result_num = bbb[1] + clr.System.Math.Abs(-200)" );
    
    // それを秀丸マクロ側に得る
    #result_num = dllfuncw(#MNG, "GetNumVar", "result_num");
    
    // 文字列として表示
    message(str(#result_num));
    
    freedll(#MNG);