Если вы покопаетесь внутри
user32
, вы увидите там некоторые, казалось бы, тривиальные функции - такие как CopyRect
и EqualRect
. Зачем нам вообще нужны целые функции для того, что можно сделать с помощью операторов :=
и =
?...when altering one's mind becomes as easy as programming a computer, what does it mean to be human?..
user32
, вы увидите там некоторые, казалось бы, тривиальные функции - такие как CopyRect
и EqualRect
. Зачем нам вообще нужны целые функции для того, что можно сделать с помощью операторов :=
и =
?FlushInstructionCache
, когда вы генерируете или модифицируете исполняемый код в run-time - чтобы процессор при выполнении вашего сгенерированного/модифицированного кода читал бы написанные вами инструкции, а не старые инструкции, которые могут остаться в кеше команд процессора.FlushInstructionCache
не делает ничего, кроме возврата. Это потому, что простого вызова функции было достаточно, чтобы очистить кэш команд.FlushInstructionCache
выполняет реальную работу, поскольку ей необходимо уведомить все остальные процессоры о необходимости очищать их кэши.FlushInstructionCache
выглядит как версия для Windows 95: она ничего не делает.GetVersion
. Надо же делать наоборот: нужно возвращать основную версию в старшем байте и младшую версию в младшем байте, чтобы вы могли делать такое:
if ГипотетическаяУлучшеннаяGetVersion >= $030A then begin // версия минимум 3.10 end;Вместо этого сейчас основная версия возвращается в младшем байте, а младшая версия - в старшем байте, поэтому версия 3.10 возвращается как значение
$0A03
, что приводит к таким ошибкам:
if GetVersion >= $0A03 then begin // неверная проверка на версию ≥ 3.10 end;Почему номер версии возвращается таким странным образом?
xor dword ptr [variable], 80000000hвместо более компактного:
xor byte ptr [variable + 3], 80hЭти две операции функционально эквивалентны: установка верхнего бита в четырёхбайтовом значении эквивалентна установке верхнего бита в однобайтовом значении - потому что младшие биты не зависят от операции.
;
; Сбрасывает кэш процессора, чтобы все побочные гамма-лучи (я не шучу),
; которые могли изменить биты кэша S1, игнорировались бы.
;
; Это не шутка. Это просили производители процессора.
; Я серьёзно.
;
invd
ERROR_NOT_ALL_ASSIGNED
("Вызывающая сторона не обладает всеми необходимыми правами доступа.") при вызове AdjustTokenPrivileges
. В чём проблема?В 1975 году Гейтс и Аллен создают компанию с названием Microsoft. Как и большинство вновь создаваемых предприятий, Microsoft начинает свою историю с небольших масштабов, но имеет глобальную цель — компьютер на каждый рабочий стол и в каждый дом.
typeЕсли бы Longint расширился с 32-х бит до 64-х, то для 64-х разрядных программ стало бы невозможным чтение bitmap-файлов (прим.пер.: напомню, пост идёт о Windows; в Delphi мы пока не имеем 64-х разрядного компилятора, хотя всё идёт к тому, что в Delphi будет так же).
PBitmapInfoHeader = ^TBitmapInfoHeader;
{$EXTERNALSYM tagBITMAPINFOHEADER}
tagBITMAPINFOHEADER = packed record
biSize: DWORD;
biWidth: Longint;
biHeight: Longint;
biPlanes: Word;
biBitCount: Word;
biCompression: DWORD;
biSizeImage: DWORD;
biXPelsPerMeter: Longint;
biYPelsPerMeter: Longint;
biClrUsed: DWORD;
biClrImportant: DWORD;
end;
TBitmapInfoHeader = tagBITMAPINFOHEADER;
{$EXTERNALSYM BITMAPINFOHEADER}
BITMAPINFOHEADER = tagBITMAPINFOHEADER;