Files
ewsdr/test/platform/win_stub/Windows.pas
T
ew8bakandClaude Opus 5 f2ecd63fe1 fix(platform): win64-сборка падала на GetEnvironmentVariable
Модуль Windows стоит в uses ПОСЛЕ SysUtils, поэтому его трёхпараметрический
GetEnvironmentVariable(PChar;PChar;DWORD) перекрывает однопараметрический из
SysUtils, и три вызова в PlatformUtils падали с «wrong number of parameters».
Лечение — явная квалификация SysUtils.GetEnvironmentVariable.

★Сломалось это не сейчас: unit Windows появился в uses ещё в d209697 (вместе с
QueryPerformanceCounter для монотонных часов), и с тех пор под win64 не
собиралось вовсе — просто сборочная машина туда не заходила. GetAppCfgDir с
%APPDATA% живёт с e9f4bf1 и до d209697 работал.

Новый стенд test/platform. Кросс-RTL обычно не установлен, поэтому ветки
{$IFDEF WINDOWS} и {$IFDEF DARWIN} на Linux не компилируются ВООБЩЕ, и ошибка в
них всплывает только на сборочной машине. Стенд переписывает копию
PlatformUtils.pas так, чтобы платформенные условия читались как свои
(-dSIMWIN / -dSIMMAC), и компилирует без линковки (-Cn): системных функций тут
нет, но синтаксис, типы и — главное — разрешение имён проверяются
по-настоящему. Для Windows подкладывается заглушка unit Windows, объявляющая
ровно те имена, которыми настоящий перекрывает SysUtils; на ней и держится вся
проверка.

★Негативный контроль: на коде до правки стенд выдаёт РОВНО те же три ошибки
(строки 210, 271, 273), что и сборочная машина.

Чего он не делает: живых вызовов системных счётчиков — их правильность
доказывает только прогон на самой платформе.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_01Bkwwyj7xVRrqnSVEseTRfV
2026-08-24 21:31:59 +03:00

33 lines
1.5 KiB
ObjectPascal
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
unit Windows;
{
Заглушка модуля Windows для проверки WINDOWS-ветки на Linux.
Объявляет РОВНО те имена, которыми настоящий Windows перекрывает SysUtils —
само перекрытие и ловит ошибки, невидимые на Linux: unit Windows стоит в uses
ПОСЛЕ SysUtils, поэтому его трёхпараметрический GetEnvironmentVariable
выигрывает у однопараметрического из SysUtils, и вызов падает с «wrong number
of parameters». Ровно так win64-сборка и легла.
}
{$MODE Delphi}
interface
type
DWORD = LongWord;
function GetEnvironmentVariable(lpName, lpBuffer: PChar; nSize: DWORD): DWORD; stdcall;
function QueryPerformanceCounter(var lpPerformanceCount: Int64): LongBool; stdcall;
function QueryPerformanceFrequency(var lpFrequency: Int64): LongBool; stdcall;
function GetTickCount64: QWord; stdcall;
implementation
function GetEnvironmentVariable(lpName, lpBuffer: PChar; nSize: DWORD): DWORD; stdcall;
begin Result := 0; end;
function QueryPerformanceCounter(var lpPerformanceCount: Int64): LongBool; stdcall;
begin lpPerformanceCount := 123456789; Result := True; end;
function QueryPerformanceFrequency(var lpFrequency: Int64): LongBool; stdcall;
begin lpFrequency := 10000000; Result := True; end;
function GetTickCount64: QWord; stdcall;
begin Result := 42; end;
end.