Memory リファレンス

api.Memory() で作る、ネイティブメモリ(構造体・バッファ)を扱うオブジェクトのリファレンスです。

記法: P=プロパティ、M=メソッド。メンバー名・フィールド名の照合は大文字小文字を区別しません(rc.left と rc.Left は同じ)。ただし、実際のスクリプトでは構造体の定義どおりの表記(rc.left、pt.x、mii.fMask など)が使われています。

目次

  1. 取得方法
  2. 共通メンバー
  3. Read / Write と VT 定数
  4. 構造体のフィールド
  5. プリミティブ型の Memory
  6. 注意点
  7. 使用例

1. 取得方法

api.Memory(type [, count [, ptr]])

呼び出し 説明
api.Memory("RECT") 構造体名から、そのサイズのメモリを作る(ゼロ初期化)
api.Memory("WCHAR", 260) 要素型と個数を指定して作る(WCHAR なら 260 文字のバッファ)
api.Memory("WCHAR", "文字列") 文字列を終端の NUL 付きでコピーした WCHAR バッファを作る
api.Memory(size) 数値を渡すと、そのバイト数のバッファを作る(型名なし)
api.Memory(size, count) size * count バイトのバッファを作る
api.Memory(size, count, ptr) 確保せず、既存のポインタ ptr が指すメモリをそのまま参照する(size * count バイト分。所有権は持たない)
api.Memory(SafeArray) SafeArray(VT_UI1 \| VT_ARRAY など)の内容をコピーして作る
api.Memory(IStream, size) ストリームの先頭から最大 size バイトを読み込んで作る

2. 共通メンバー

名前 種別 説明
P P(読み) メモリの先頭アドレス(ポインタ値)。api.xxx(…, mem.P) のようにポインタを渡すときに使う
Size P(読み) 全体のバイト数
Count / length P(読み) 要素数
Item(i [, value]) M i 番目(0始まり)の要素を読む。第2引数を渡すと書き込む(要素が1/2/4/8バイトの場合)。mem[i] でも同じ
_NewEnum P 列挙用(for...in / Enumerator)
Read(offset, vt [, len]) M offset(バイト)から vt 型の値を読む(3章)
Write(offset, vt, value [, len]) M offset(バイト)に vt 型で値を書く
Clone() M 内容を複製した新しい Memory を返す(サイズ0のときは空)
Free() M 確保したメモリと保持した文字列を解放する。以後このオブジェクトは使えない(P が 0)
_BLOB P 確保済みのバッファをバイナリ文字列(BSTR)として読み書きする。代入時にサイズが変わる場合は再確保される。外部ポインタを参照する Memory では何も返さない

Item の動作


3. Read / Write と VT 定数

Read(offset, vt [, len]) / Write(offset, vt, value [, len]) の vt には、consts.js の VT_* 定数、または下表の数値を使います。

vt 値 Read の戻り値 Write の入力
VT_BOOL 11 bool 数値
VT_I1 / VT_UI1 16 / 17 整数(1バイト) 整数
VT_I2 / VT_UI2 2 / 18 整数(2バイト) 整数
VT_I4 / VT_UI4 3 / 19 整数(4バイト) 整数
VT_I8 / VT_UI8 20 / 21 64bit整数 64bit整数
VT_R4 / VT_R8 4 / 5 浮動小数 (書き込み非対応)
VT_PTR / VT_BSTR 26 / 8 ポインタ値(ポインタ幅) ポインタ値
VT_LPWSTR 31 文字列(NUL終端)。len 指定時は先頭 len 文字 文字列(NUL含めてコピー。バッファを超えない範囲に切り詰め)
VT_LPSTR 30 ANSI文字列 ANSI文字列
VT_USERDEFINED / VT_UTF8 29 UTF-8文字列 UTF-8文字列
VT_FILETIME 64 UNIX時刻(ms, 数値) 日付/日時
VT_CY 6 {x, y}(POINT として扱える値) POINT/{x,y}
VT_CARRAY 28 RECT(新しい Memory にコピー) RECT(Memory)
VT_CLSID 72 GUID 文字列({xxxxxxxx-…}) GUID 文字列
VT_VARIANT 12 VARIANT VARIANT
vt \| VT_ARRAY(0x2000) - SafeArray(要素型 vt、len 個。省略時は残り全部) SafeArray(len 個)

4. 構造体のフィールド

構造体名で作った Memory は、フィールド名のプロパティで読み書きできます(例: rc.left、pt.x = 10)。フィールド名は構造体定義の名前そのままで、大文字小文字は区別されません。

型の読み方: 無印=int(4バイト整数)、(ptr)=ポインタ値、(string)=構造体内の固定長文字列(WCHAR 配列)の読み書き、(string*)=文字列ポインタ(代入すると Memory が文字列のコピーを保持してそのポインタを格納)、(RECT)/(POINT)=構造体を値として返す(RECT は新しい Memory のコピー、POINT は {x,y})、(WORD)=2バイト、(BYTE)=1バイト、(bool)=BOOL。

構造体 cbSize自動 フィールド
BITMAP bmBits(ptr), bmBitsPixel(WORD), bmHeight, bmPlanes(WORD), bmType, bmWidth, bmWidthBytes
CHOOSECOLOR ○ Flags, hInstance(ptr), hwndOwner(ptr), lCustData(ptr), lpCustColors(ptr), lpfnHook(ptr), lpTemplateName(string*), lStructSize, rgbResult
CHOOSEFONT ○ ___MISSING_ALIGNMENT__(WORD), Flags, hDC(ptr), hInstance(ptr), hwndOwner(ptr), iPointSize, lCustData(ptr), lpfnHook(ptr), lpLogFont(ptr), lpszStyle(string), lpTemplateName(string), lStructSize, nFontType(WORD), nSizeMax, nSizeMin, rgbColors
COPYDATASTRUCT cbData, dwData(ptr), lpData(ptr)
DIBSECTION dsBitfields0, dsBitfields1, dsBitfields2, dsBm(ptr), dsBmih(ptr), dshSection(ptr), dsOffset
DRAWITEMSTRUCT CtlID, CtlType, hDC(ptr), hwndItem(ptr), itemAction, itemData(ptr), itemID, itemState, rcItem(RECT)
EXCEPINFO bstrDescription(string), bstrHelpFile(string), bstrSource(string*), dwHelpContext, pfnDeferredFillIn(ptr), pvReserved(ptr), scode, wCode(WORD), wReserved(WORD)
FINDREPLACE ○ Flags, hInstance(ptr), hwndOwner(ptr), lCustData(ptr), lpfnHook(ptr), lpstrFindWhat(string), lpstrReplaceWith(string), lpTemplateName(string*), lStructSize, wFindWhatLen(WORD), wReplaceWithLen(WORD)
FOLDERSETTINGS fFlags, ImageSize, Options, ViewFlags, ViewMode
GUITHREADINFO ○ cbSize, flags, hwndActive(ptr), hwndCapture(ptr), hwndCaret(ptr), hwndFocus(ptr), hwndMenuOwner(ptr), hwndMoveSize(ptr), rcCaret(RECT)
HDITEM cchTextMax, cxy, fmt, hbm(ptr), iImage, iOrder, lParam, mask, pszText(string*), pvFilter(ptr), state, type
ICONINFO fIcon(bool), hbmColor(ptr), hbmMask(ptr), xHotspot, yHotspot
ICONMETRICS iHorzSpacing, iTitleWrap, iVertSpacing, lfFont(ptr)
KEYBDINPUT dwExtraInfo(ptr), dwFlags, time, type, wScan, wVk
LOGFONT lfCharSet(BYTE), lfClipPrecision(BYTE), lfEscapement, lfFaceName(string), lfHeight, lfItalic(BYTE), lfOrientation, lfOutPrecision(BYTE), lfPitchAndFamily(BYTE), lfQuality(BYTE), lfStrikeOut(BYTE), lfUnderline(BYTE), lfWeight, lfWidth
LVBKIMAGE cchImageMax, hbm(ptr), pszImage(string*), ulFlags, xOffsetPercent, yOffsetPercent
LVCOLUMN cchTextMax, cx, cxDefault, cxIdeal, cxMin, fmt, iImage, iOrder, iSubItem, mask, pszText(string*)
LVFINDINFO flags, lParam, psz(string*), pt(POINT), vkDirection
LVGROUP ○ cbSize, cchDescriptionBottom, cchDescriptionTop, cchFooter, cchHeader, cchSubsetTitle, cchSubtitle, cchTask, cItems, iExtendedImage, iFirstItem, iGroupId, iTitleImage, mask, pszDescriptionBottom(string), pszDescriptionTop(string), pszFooter(string), pszHeader(string), pszSubsetTitle(string), pszSubtitle(string), pszTask(string*), state, stateMask, uAlign
LVHITTESTINFO flags, iGroup, iItem, iSubItem, pt(POINT)
LVITEM cchTextMax, cColumns, iGroup, iGroupId, iImage, iIndent, iItem, iSubItem, lParam, mask, piColFmt(ptr), pszText(string*), puColumns(ptr), state, stateMask
MEASUREITEMSTRUCT CtlID, CtlType, itemData(ptr), itemHeight, itemID, itemWidth
MENUINFO ○ cbSize, cyMax, dwContextHelpID, dwMenuData(ptr), dwStyle, fMask, hbrBack(ptr)
MENUITEMINFO ○ cbSize, cch, dwItemData(ptr), dwTypeData(string*), fMask, fState, fType, hbmpChecked(ptr), hbmpItem(ptr), hbmpUnchecked(ptr), hSubMenu(ptr), wID
MONITORINFOEX ○ cbSize, dwFlags, rcMonitor(RECT), rcWork(RECT), szDevice(string)
MOUSEINPUT dwExtraInfo(ptr), dwFlags, dx, dy, mouseData, time, type
MSG hwnd(ptr), lParam(ptr), message, pt(POINT), time, wParam(ptr)
NMCUSTOMDRAW dwDrawStage, dwItemSpec(ptr), hdc(ptr), hdr(ptr), lItemlParam(ptr), rc(RECT), uItemState
NMHDR code, hwndFrom(ptr), idFrom
NMLVCUSTOMDRAW clrFace, clrText, clrTextBk, dwItemType, iIconEffect, iIconPhase, iPartId, iStateId, iSubItem, nmcd(ptr), rcText(RECT), uAlign
NMTVCUSTOMDRAW clrText, clrTextBk, iLevel, nmcd(ptr)
NONCLIENTMETRICS ○ cbSize, iBorderWidth, iCaptionHeight, iCaptionWidth, iMenuHeight, iMenuWidth, iPaddedBorderWidth, iScrollHeight, iScrollWidth, iSmCaptionHeight, iSmCaptionWidth, lfCaptionFont(ptr), lfMenuFont(ptr), lfMessageFont(ptr), lfSmCaptionFont(ptr), lfStatusFont(ptr)
NOTIFYICONDATA ○ cbSize, dwInfoFlags, dwState, dwStateMask, guidItem(ptr), hBalloonIcon(ptr), hIcon(ptr), hWnd(ptr), szInfo(string), szInfoTitle(string), szTip(string), uCallbackMessage, uFlags, uID, uTimeout, uVersion
OSVERSIONINFO ○ dwBuildNumber, dwMajorVersion, dwMinorVersion, dwOSVersionInfoSize, dwPlatformId, szCSDVersion(string), wProductType(BYTE), wReserved(BYTE), wServicePackMajor(WORD), wServicePackMinor(WORD), wSuiteMask(WORD)
OSVERSIONINFOEX ○ dwBuildNumber, dwMajorVersion, dwMinorVersion, dwOSVersionInfoSize, dwPlatformId, szCSDVersion(string), wProductType(BYTE), wReserved(BYTE), wServicePackMajor(WORD), wServicePackMinor(WORD), wSuiteMask(WORD)
PAINTSTRUCT fErase(bool), fIncUpdate(bool), fRestore(bool), hdc(ptr), rcPaint(RECT), rgbReserved(BYTE)
POINT x, y
RECT bottom, left, right, top
SECURITY_ATTRIBUTES bInheritHandle(bool), lpSecurityDescriptor(ptr), nLength
SHELLEXECUTEINFO ○ cbSize, dwHotKey, fMask, hIcon(ptr), hInstApp(ptr), hkeyClass(ptr), hMonitor(ptr), hProcess(ptr), hwnd(ptr), lpClass(string), lpDirectory(string), lpFile(string), lpIDList(ptr), lpParameters(string), lpVerb(string*), nShow
SHFILEINFO dwAttributes, hIcon(ptr), iIcon, szDisplayName(string), szTypeName(string)
SHFILEOPSTRUCT fAnyOperationsAborted(bool), fFlags(WORD), hNameMappings(ptr), hwnd(ptr), lpszProgressTitle(string), pFrom(string), pTo(string*), wFunc
SIZE cx, cy
TCHITTESTINFO flags, pt(POINT)
TCITEM cchTextMax, dwState, dwStateMask, iImage, lParam(ptr), mask, pszText(string*)
TOOLINFO ○ cbSize, hinst(ptr), hwnd(ptr), lParam(ptr), lpReserved(ptr), lpszText(string*), rect(RECT), uFlags, uId(ptr)
TVHITTESTINFO flags, hItem(ptr), pt(POINT)
TVITEM cChildren, cchTextMax, hItem(ptr), iImage, iSelectedImage, lParam(ptr), mask, pszText(string*), state, stateMask
WIN32_FIND_DATA cAlternateFileName(string), cFileName(string), dwFileAttributes, dwReserved0, dwReserved1, ftCreationTime(FILETIME), ftLastAccessTime(FILETIME), ftLastWriteTime(FILETIME), nFileSizeHigh, nFileSizeLow

LOGFONT.lfFaceName、SHFILEINFO.szDisplayName、WIN32_FIND_DATA.cFileName、NOTIFYICONDATA.szTip などの固定長文字列フィールドは、文字列として読み書きします。WIN32_FIND_DATA の ftCreationTime / ftLastAccessTime / ftLastWriteTime は UNIX 時刻(ms)で読み取れます。 CHOOSEFONT には、内部の位置調整用の予約フィールド(___MISSING_ALIGNMENT__)も見えますが、通常は使いません。 PAINTSTRUCT.rgbReserved は先頭の1バイトのみ参照されます。


5. プリミティブ型の Memory

構造体ではない型名でも api.Memory() に指定できます。要素単位の読み書きには Item(i) / mem[i] を使います。

型名 要素サイズ 備考
BYTE / char 1 BYTE は型名のプロパティ(mem.BYTE)で先頭要素を読み書きできる
WORD / WCHAR 2 WCHAR は文字列バッファとして使い、Read(0, VT_LPWSTR) で文字列にできる
DWORD / int 4 mem.DWORD / mem.int で先頭要素を読み書きできる
HANDLE / LPWSTR / BSTR ポインタ幅 mem.HANDLE / mem.LPWSTR で先頭要素を読み書きできる
GUID 16 Read(0, VT_CLSID) で GUID 文字列を読む
KEYSTATE 256 GetKeyboardState / SetKeyboardState 用の256バイト
VARIANT VARIANT のサイズ Read(0, VT_VARIANT) / Write(…, VT_VARIANT, v) で出し入れする

6. 注意点


7. 使用例

// RECT を取得
const rc = api.Memory("RECT");
api.GetWindowRect(te.hwnd, rc);
const w = rc.right - rc.left;
const h = rc.bottom - rc.top;

// POINT
const pt = api.Memory("POINT");
api.GetCursorPos(pt);
const x = pt.x, y = pt.y;

// 文字列バッファ(WCHAR)
const s = api.Memory("WCHAR", "Hello");
const text = s.Read(0, VT_LPWSTR);        // "Hello"
s.Write(0, VT_LPWSTR, "World");           // バッファの範囲内で上書き

// 構造体のフィールドを設定 (cbSize は自動設定される)
const mii = api.Memory("MENUITEMINFO");
mii.fMask = MIIM_STRING | MIIM_ID;
mii.wID = 1;
mii.dwTypeData = "Item";                    // 文字列は Memory が保持する
api.InsertMenuItem(hMenu, 0, true, mii);

// バイナリ文字列(BSTR)との変換
const mem = api.Memory(4);
mem.Write(0, VT_I4, 0x12345678);
const n = mem.Read(0, VT_I4);                   // 0x12345678
const bytes = mem.Read(0, VT_UI1 | VT_ARRAY);   // SafeArray(4バイト)

// 日付(FILETIME)
const fd = api.Memory("WIN32_FIND_DATA");
const hFind = api.FindFirstFile("C:\\Windows\\notepad.exe", fd);
const modified = new Date(fd.ftLastWriteTime);   // UNIX時刻(ms)

// 複製と解放
const copy = rc.Clone();
copy.Free();

関連