NextHE 連想配列

 秀丸エディタのマクロ用 .DLL です。
メニュー機能
 menu 文ではメニューに追加した項目に自動的に番号が付きますが、NextHE では項目毎に番号を付ける事がでます。
 状況に応じてメニュー項目を除外した表示を提供できるようになります。
 また、サブ・メニューも実装できます。
パターンマッチング(文字列比較)機能
 .NET Framework の正規表現を提供します。
 10 を超える部分取り出し(キャプチャ)を提供します。
連想配列
 連想配列(マップやハッシュとも呼ぶ)を提供します。
関数説明(C/C++) 秀丸エディタ マクロサンプル PowerShell サンプル

関数説明(C/C++)

// 呼び出し規約 #define HEAPI __cdcel // 最初に呼び出す // 連想配列ハンドルを取得する // // 戻り値 // 連想配列ハンドル // // nCapacity // 連想配列に格納する要素の最小数 // bitState // 通常は 0 を渡す // 呼び元が PowerShell 等 .NET Framework の場合は 1 を渡すと楽に使える LPVOID HEAPI AavBegin( INT_PTR nCapacity, INT_PTR bitState ); // 最後に呼び出す // 連想配列ハンドルを破棄する // // 戻り値 // 必ず TRUE // // lpContext // AavBegin で取得した連想配列ハンドル INT_PTR HEAPI AavEnd( LPVOID lpContext ); // 連想配列に要素を追加する。この要素の値は文字列型 // 事前に AavBegin で連想配列ハンドルを取得すること // // 戻り値 // 必ず TRUE // // lpContext // AavBegin で取得した連想配列ハンドル // lpszKey // 要素のキー // lpszValue // 要素の値(文字列) INT_PTR HEAPI AavSetStringW( LPVOID lpContext, wchar_t const* const lpszKey, wchar_t const* const lpszValue ); INT_PTR HEAPI AavSetStringA( LPVOID lpContext, char const* const lpszKey, char const* const lpszValue ); // 連想配列に要素を追加する。この要素の値は整数型 // 事前に AavBegin で連想配列ハンドルを取得すること // // 戻り値 // 必ず TRUE // // lpContext // AavBegin で取得した連想配列ハンドル // lpszKey // 要素のキー // nValue // 要素の値(整数) INT_PTR HEAPI AavSetIntegerW( LPVOID lpContext, wchar_t const* const lpszKey, INT_PTR nValue ); INT_PTR HEAPI AavSetIntegerA( LPVOID lpContext, char const* const lpszKey, INT_PTR nValue ); // 連想配列の要素の値の型を取得する // 事前に AavBegin で連想配列ハンドルを取得すること // // 戻り値 // 0 整数 // 1 文字列 // -1 要素が見つからない // // lpContext // AavBegin で取得した連想配列ハンドル // lpszKey // 要素のキー INT_PTR HEAPI AavGetTypeW( LPVOID lpContext, wchar_t const* const lpszKey ); INT_PTR HEAPI AavGetTypeA( LPVOID lpContext, char const* const lpszKey ); // 連想配列から値(文字列)を取得する // 事前に AavBegin で連想配列ハンドルを取得すること // // 戻り値 // 取得した要素の値(文字列) // 取得に失敗した場合は lpszDefault を返す // // lpContext // AavBegin で取得した連想配列ハンドル // lpszKey // 要素のキー // lpszDefault // 取得に失敗した場合に返す値 wchar_t const* const HEAPI AavGetStringW( LPVOID lpContext, wchar_t const* const lpszKey, wchar_t const* const lpszDefault ); char const* const HEAPI AavGetStringA( LPVOID lpContext, char const* const lpszKey, char const* const lpszDefault ); // 連想配列から値(整数)を取得する // 事前に AavBegin で連想配列ハンドルを取得すること // // 戻り値 // 取得した要素の値(整数) // 取得に失敗した場合は nDefault を返す // // lpContext // AavBegin で取得した連想配列ハンドル // lpszKey // 要素のキー // nDefault // 取得に失敗した場合に返す値 INT_PTR HEAPI AavGetIntegerW( LPVOID lpContext, wchar_t const* const lpszKey, INT_PTR nDefault ); INT_PTR HEAPI AavGetIntegerA( LPVOID lpContext, char const* const lpszKey, INT_PTR nDefault ); // 連想配列から要素を削除する // // 戻り値 // 必ず TRUE // // lpContext // AavBegin で取得した連想配列ハンドル // lpszKey // 削除する要素のキー INT_PTR HEAPI AavDelW( LPVOID lpContext, wchar_t const* const lpszKey ); INT_PTR HEAPI AavDelA( LPVOID lpContext, char const* const lpszKey ); // 連想配列の要素を全て削除する // // 戻り値 // 必ず TRUE // // lpContext // AavBegin で取得した連想配列ハンドル INT_PTR HEAPI AavClear( LPVOID lpContext );

秀丸エディタ マクロサンプル

// NextHE 連想配列を使えるように .DLL をロードする loaddll "NextHE.dll"; // .DLL のロードの成功/失敗を確認 if( !result ) { // .DLL のロードに失敗 message ".dllのロードに失敗しました。"; // マクロ終了 endmacro; } // 連想配列開始(連想配列ハンドルを取得する) #Aav = dllfunc( "AavBegin", 1 ); // 連想配列へ要素を追加する(値は文字列) #r = dllfuncw( "AavSetStringW", #Aav, "Name", "太郎" ); // 連想配列へ要素を追加する(値は整数) #r = dllfuncw( "AavSetIntegerW", #Aav, "Age", 13 ); // 連想配列から値(文字列)を取得する $sName = dllfuncstrw( "AavGetStringW", #Aav, "Name", "----" ); // 連想配列から値(整数)を取得する #nAge = dllfuncw( "AavGetIntegerW", #Aav, "Age", 999 ); // 連想配列から値(文字列)を取得する(存在しないキーを指定) $sName9 = dllfuncstrw( "AavGetStringW", #Aav, "Name9", "----" ); // 連想配列から値(整数)を取得する(存在しないキーを指定) #nAge9 = dllfuncw( "AavGetIntegerW", #Aav, "Age9", 999 ); // 連想配列終了(連想配列ハンドルを破棄する) #r = dllfunc( "AavEnd", #Aav ); // 連想配列から取得した結果を通知する message "■名前:\n" + $sName + "\n" + $sName9 + "\n■年齢:\n" + str(#nAge) + "\n" + str(#nAge9); // .DLL を解放する freedll;

PowerShell サンプル

# PowerShell の場合、System.Collection.Hashtable を使えば簡単。 # NextHE.dll のファイル・パス $DLL = 'NextHE.dll' # NextHE クラスを定義(C# ソース) $SourceCS = " using System; using System.Runtime.InteropServices; public class NextHE { [DllImport(@`"$DLL`", CallingConvention=CallingConvention.Cdecl)] public extern static IntPtr AavBegin( IntPtr capacity, IntPtr bitState ); [DllImport(@`"$DLL`", CallingConvention=CallingConvention.Cdecl)] public extern static IntPtr AavEnd( IntPtr hContext ); [DllImport(@`"$DLL`", CallingConvention=CallingConvention.Cdecl, CharSet = CharSet.Unicode)] public extern static IntPtr AavSetString( IntPtr hContext, string sKey, string sValue ); [DllImport(@`"$DLL`", CallingConvention=CallingConvention.Cdecl, CharSet = CharSet.Unicode)] public extern static IntPtr AavSetInteger( IntPtr hContext, string sKey, IntPtr nValue ); [DllImport(@`"$DLL`", CallingConvention=CallingConvention.Cdecl, CharSet = CharSet.Unicode)] public extern static string AavGetString( IntPtr hContext, string sKey, string sDefault ); [DllImport(@`"$DLL`", CallingConvention=CallingConvention.Cdecl, CharSet = CharSet.Unicode)] public extern static IntPtr AavGetInteger( IntPtr hContext, string sKey, IntPtr nDefault ); [DllImport(@`"$DLL`", CallingConvention=CallingConvention.Cdecl, CharSet = CharSet.Unicode)] public extern static IntPtr AavDel( IntPtr hContext, string sKey ); [DllImport(@`"$DLL`", CallingConvention=CallingConvention.Cdecl)] public extern static IntPtr AavClear( IntPtr hContext ); }" # NextHE クラスを追加する Add-Type $SourceCS # 連想配列開始(連想配列ハンドルを取得する) [IntPtr] $Aav = [NextHE]::AavBegin( 0, 1 ) # 連想配列へ要素を追加する(値は文字列) [void] [NextHE]::AavSetString( $Aav, 'Name', '太郎' ) # 連想配列へ要素を追加する(値は整数) [void] [NextHE]::AavSetInteger( $Aav, 'Age', 13 ) # 連想配列から値(文字列)を取得する [NextHE]::AavGetString( $Aav, 'Name', '----' ) # 連想配列から値(整数)を取得する [NextHE]::AavGetInteger( $Aav, 'Age', 999 ) # 連想配列から値(文字列)を取得する(存在しないキーを指定) [NextHE]::AavGetString( $Aav, 'Name9', '====' ) # 連想配列から値(整数)を取得する(存在しないキーを指定) [NextHE]::AavGetInteger( $Aav, 'Age9', 888 ) # 連想配列終了(連想配列ハンドルを破棄する) [void] [NextHE]::AavEnd( $Aav )