-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathStructTest.js
More file actions
176 lines (170 loc) · 12.5 KB
/
Copy pathStructTest.js
File metadata and controls
176 lines (170 loc) · 12.5 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
// Модуль StructTest.js (AkelPad-WSH-JScript)
// (c) testuser2 2026
// Описание: пример работы со C-структурами в AkelPad-JScript, используя объектные оболочки структур
// https://github.com/LAcoder2/AkelPadScripts/blob/main/StructTest.js
AkelPad.Include("log.js")
AkelPad.Include("MemHelp.js")
try{
var nstp = -1
var sTCBuf = Space(/*oTC.size()*/128 / 2) // выделяем память для основной структуры AENTEXTCHANGE
var sLDTBuf = Space(/*oLDt.size()*/48 / 2) // выделяем память для ссылочной структуры AELINEDATA,
// заполненную символом пробела, чтобы имитировать заполненность
var oTC = AENTEXTCHANGEwrp(StrPtr(sTCBuf), 0, 2)
nstp = 1
//WScript.Quit()
//PrintLog(oTC.crRichSel().pStruct() + ' ' + oTC.crRichSelPtr()); WScript.Quit()
PrintLog(oTC.crRichSel.cpMaxPtr() - oTC.pStruct()) // получаем смещение последнего элемента структуры
oTC.crSel.ciMax.nCharInLineSet(752) // пишем простое значение в поле структуры
PrintLog(oTC.crSel.ciMax.nCharInLine()) // читаем это значение
var s = "Привет Ворлд!"
oTC.crSel.ciMax.lpLineSet(StrPtr(sLDTBuf))
oTC.crSel.ciMax.lpLineRef().wpLineSet(StrPtr(s)) // пишем значение (указатель) в ссылочную структуру
// имитируя доступ к заполненной структуре
PrintLog(oTC.crSel.ciMax.lpLineRef.wpLineRef()) // считываем ссылочное значение (строку wchar_t) из ссылочной структуры
}catch(e){
PrintLog(e.message + " " + nstp)
}
// Функции инициализации врапперов структур
/*typedef struct { // смещения (x64/x86)
struct _AELINEDATA *next; // 0/0 Указатель на следующую структуру AELINEDATA.
struct _AELINEDATA *prev; // 8/4 Указатель на предыдущую структуру AELINEDATA.
wchar_t *wpLine; // 16/8 Текст строки, заканчивающийся NULL‑символом.
int nLineLen; // 24/12 Длина wpLine, не включая завершающий NULL‑символ.
BYTE nLineBreak; // 28/16 Новая строка: AELB_EOF, AELB_R, AELB_N, AELB_RN, AELB_RRN или AELB_WRAP.
BYTE nLineFlags; // 29/17 Зарезервировано.
WORD nReserved; // 30/18 Зарезервировано.
int nLineWidth; // 32/20 Ширина строки в пикселях.
int nSelStart; // 36/24 Начальная позиция символа выделения в строке.
int nSelEnd; // 40/28 Конечная позиция символа выделения в строке.
} AELINEDATA; // 48/32 Общий размер.*/
//function makeAELINEDATAwrp(pStruct, oStruct, fullInit){
// return oStruct = makeStructWrapper(pStruct, oStruct, (_X64 ? 48 : 32), fullInit,
// "next", 0, 9, makeAELINEDATAwrp,
// "prev", (_X64 ? 8 : 4), 9, makeAELINEDATAwrp,
// "wpLine", (_X64 ? 16 : 8), 8,
// "nLineLen", (_X64 ? 24 : 12), 3,
// "nLineBreak", (_X64 ? 28 : 16), 5,
// "nLineFlags", (_X64 ? 29 : 17), 5,
// "nReserved", (_X64 ? 30 : 18), 4,
// "nLineWidth", (_X64 ? 32 : 20), 3,
// "nSelStart", (_X64 ? 36 : 24), 3,
// "nSelEnd", (_X64 ? 40 : 28), 3
// )
//}
/*typedef struct { // смещения (x64/x86)
int nLine; // 0/0 Номер строки в документе, начиная с нуля.
AELINEDATA *lpLine; // 8/4 Указатель на структуру AELINEDATA.
int nCharInLine; // 16/8 Позиция символа в строке.
} AECHARINDEX; // 24/12 Общий размер.*/
//function makeAECHARINDEXwrp(pStruct, oStruct, fullInit){
// return oStruct = makeStructWrapper(pStruct, oStruct, (_X64 ? 24 : 12), fullInit,
// "nLine", 0, 3,
// "lpLine", (_X64 ? 8 : 4), 9, makeAELINEDATAwrp,
// "nCharInLine", (_X64 ? 16 : 8), 3
// )
//}
/*typedef struct { // смещения (x64/x86)
AECHARINDEX ciMin; // 0/0 Индекс первого символа в диапазоне.
AECHARINDEX ciMax; // 24/12 Индекс последнего символа в диапазоне.
} AECHARRANGE; // 48/24 Общий размер.*/
//function makeAECHARRANGEwrp(pStruct, oStruct, fullInit){
// return oStruct = makeStructWrapper(pStruct, oStruct, (_X64 ? 48 : 24), fullInit,
// "ciMin", 0, 6, makeAECHARINDEXwrp,
// "ciMax", (_X64 ? 24 : 12), 6, makeAECHARINDEXwrp
// )
//}
/*typedef struct { // смещения (x64/x86)
HWND hwndFrom; // 0/0 Дескриптор окна‑источника.
UINT_PTR idFrom; // 8/4 Идентификатор источника.
UINT code; // 16/8 Код уведомления.
AEHDOC docFrom; // 24/12 Дескриптор документа. См. сообщение AEM_CREATEDOCUMENT.
} AENMHDR; // 32/16 Общий размер.*/
//function makeAENMHDRwrp(pStruct, oStruct){
// return oStruct = makeStructWrapper(pStruct, oStruct, (_X64 ? 32 : 16), undefined,
// "hwndFrom", 0, 2,
// "idFrom", (_X64 ? 8 : 4), 2,
// "code", (_X64 ? 16 : 8), 3,
// "docFrom", (_X64 ? 24 : 12), 2
// )
//}
/*typedef struct { // смещения (x64/x86)
INT_PTR cpMin; // 0/0 Минимальное смещение.
INT_PTR cpMax; // 8/4 Максимальное смещение.
} CHARRANGE64; // 16/8 Общий размер.*/
//function makeCHARRANGE64wrp(pStruct, oStruct){
// return oStruct = makeStructWrapper(pStruct, oStruct, (_X64 ? 16 : 8)/*size*/, undefined,
// "cpMin", 0, 2,
// "cpMax", (_X64 ? 8 : 4), 2
// )
//}
/*typedef struct { // смещения (x64/x86)
AENMHDR hdr; // 0/0 Стандартный NMHDR.
AECHARRANGE crSel; // 32/16 Текущее выделение.
AECHARINDEX ciCaret; // 80/40 Позиция индекса символа курсора.
DWORD dwType; // 104/52 См. определения AETCT_*.
BOOL bColumnSel; // 108/56 Колоночное выделение.
CHARRANGE64 crRichSel; // 112/60 Текущее выделение (смещение RichEdit).
} AENTEXTCHANGE; // 128/68 Общий размер.
*/
//function makeAENTEXTCHANGEwrp(pStruct, oStruct, fullInit){
// return oStruct = makeStructWrapper(pStruct, oStruct, (_X64 ? 128 : 68)/*size*/, fullInit,
// "hdr", 0, 6, makeAENMHDRwrp,
// "crSel", (_X64 ? 32 : 16), 6, makeAECHARRANGEwrp,
// "ciCaret", (_X64 ? 80 : 40), 6, makeAECHARRANGEwrp,
// "dwType", (_X64 ? 104 : 52), 3,
// "bColumnSel", (_X64 ? 108 : 56), 3,
// "crRichSel", (_X64 ? 112 : 60), 6, makeCHARRANGE64wrp
// )
//}
//function makeAENTEXTCHANGEwrp(pStruct, oStruct, fullInit){
// var aOffsets = (_X64) ? [128,32,80,104,108,112] : [68,16,40,52,56,60]
// var aDataFields = ["hdr", 6, makeAENMHDRwrp,
// "crSel", 6, makeAECHARRANGEwrp,
// "ciCaret", 6, makeAECHARRANGEwrp,
// "dwType", 3,
// "bColumnSel", 3,
// "crRichSel", 6, makeCHARRANGE64wrp]
// return (makeAENTEXTCHANGEwrp = function (pStruct, oStruct, fullInit){
// return makeStructWrapper(pStruct, oStruct, fullInit, aOffsets, aDataFields)
// })(pStruct, oStruct, fullInit)
//}
/*typedef struct { // смещения (x64/x86)
struct _AELINEDATA *next; // 0/0 Указатель на следующую структуру AELINEDATA.
struct _AELINEDATA *prev; // 8/4 Указатель на предыдущую структуру AELINEDATA.
wchar_t *wpLine; // 16/8 Текст строки, заканчивающийся NULL‑символом.
int nLineLen; // 24/12 Длина wpLine, не включая завершающий NULL‑символ.
BYTE nLineBreak; // 28/16 Новая строка: AELB_EOF, AELB_R, AELB_N, AELB_RN, AELB_RRN или AELB_WRAP.
BYTE nLineFlags; // 29/17 Зарезервировано.
WORD nReserved; // 30/18 Зарезервировано.
int nLineWidth; // 32/20 Ширина строки в пикселях.
int nSelStart; // 36/24 Начальная позиция символа выделения в строке.
int nSelEnd; // 40/28 Конечная позиция символа выделения в строке.
} AELINEDATA; // 48/32 Общий размер.*/
/*typedef struct { // смещения (x64/x86)
int nLine; // 0/0 Номер строки в документе, начиная с нуля.
AELINEDATA *lpLine; // 8/4 Указатель на структуру AELINEDATA.
int nCharInLine; // 16/8 Позиция символа в строке.
} AECHARINDEX; // 24/12 Общий размер.*/
/*typedef struct { // смещения (x64/x86)
AECHARINDEX ciMin; // 0/0 Индекс первого символа в диапазоне.
AECHARINDEX ciMax; // 24/12 Индекс последнего символа в диапазоне.
} AECHARRANGE; // 48/24 Общий размер.*/
/*typedef struct { // смещения (x64/x86)
HWND hwndFrom; // 0/0 Дескриптор окна‑источника.
UINT_PTR idFrom; // 8/4 Идентификатор источника.
UINT code; // 16/8 Код уведомления.
AEHDOC docFrom; // 24/12 Дескриптор документа. См. сообщение AEM_CREATEDOCUMENT.
} AENMHDR; // 32/16 Общий размер.*/
/*typedef struct { // смещения (x64/x86)
INT_PTR cpMin; // 0/0 Минимальное смещение.
INT_PTR cpMax; // 8/4 Максимальное смещение.
} CHARRANGE64; // 16/8 Общий размер.*/
/*typedef struct { // смещения (x64/x86)
AENMHDR hdr; // 0/0 Стандартный NMHDR.
AECHARRANGE crSel; // 32/16 Текущее выделение.
AECHARINDEX ciCaret; // 80/40 Позиция индекса символа курсора.
DWORD dwType; // 104/52 См. определения AETCT_*.
BOOL bColumnSel; // 108/56 Колоночное выделение.
CHARRANGE64 crRichSel; // 112/60 Текущее выделение (смещение RichEdit).
} AENTEXTCHANGE; // 128/68 Общий размер.
*/