Memory リファレンス
api.Memory() で作る、ネイティブメモリ(構造体・バッファ)を扱うオブジェクトのリファレンスです。
- Win32 API に渡す構造体(
RECT、POINT、LOGFONTなど)や、ポインタで受け渡すバッファを JavaScript から読み書きするためのオブジェクトです。 - 関連: te リファレンス、api リファレンス(
api.Memoryほか)、FolderItems リファレンス
記法: P=プロパティ、M=メソッド。メンバー名・フィールド名の照合は大文字小文字を区別しません(
rc.leftとrc.Leftは同じ)。ただし、実際のスクリプトでは構造体の定義どおりの表記(rc.left、pt.x、mii.fMaskなど)が使われています。
目次
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 バイトを読み込んで作る |
- 生成に失敗する(未知の型名で数値も指定されていない場合など)と、空(
undefined)が返ります。 - 構造体のうち先頭が
cbSize系のものは、作成時に先頭の4バイトへ構造体サイズが自動設定されます(4章の「cbSize自動」列が○のもの)。 - 構造体名の照合は大文字小文字を区別しません。使える型名は 4章 と 5章 を参照してください。
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 の動作
- 要素サイズ(
Size / Count)が 1・2・4バイト: 整数を返す(符号付き。BYTEもcharとして符号付きで読まれる点に注意)。 - 8バイト:
POINT以外は64bit整数(int64)を返す。POINTのときは Memory(下の要素へのビュー)を返す。 - それ以外: その要素を指す Memory(同じメモリへのビュー。コピーではない)を返す。構造体の配列に使える。
- 書き込みは要素サイズが1〜8バイトの場合のみ有効。
BSTR/LPWSTR型に文字列を書くと、Memory が内部コピーを保持して、そのポインタを格納する。
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 個) |
consts.jsに定義があるのはVT_EMPTYVT_NULLVT_I1VT_I2VT_I4VT_I8VT_UI1VT_UI2VT_UI4VT_UI8VT_R4VT_R8VT_BSTRVT_UTF8VT_LPSTRVT_LPWSTRVT_PTRVT_VARIANTVT_RECORDVT_USERDEFINEDVT_ARRAYです。VT_BOOLVT_FILETIMEVT_CYVT_CARRAYVT_CLSIDは未定義なので、数値(11 / 64 / 6 / 28 / 72)で指定してください。offsetは先頭からのバイト数です。範囲の検査は行われないため、バッファのサイズを超えないようにしてください。- 非対応の
vtをReadに指定すると空が返ります。Writeでは何も起こりません。
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. 注意点
- 文字列ポインタ(
BSTR/LPWSTR型)に文字列を代入すると、Memory が内部コピーを保持します。 Memory をFree()するか破棄するまで有効です。API に渡している間は、Memory を変数に保持しておいてください。 Memory(size, count, ptr)は、既存のメモリを参照するだけで所有しません。 元のメモリが解放されたあとにアクセスしないでください。Free()後の Memory はPが 0 になり、読み書きできません。- 構造体の配列を作るときは
api.Memory("POINT", n)のように要素数を指定し、mem[i].xのように使います(要素は同じメモリへのビュー)。
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();