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 )