ли это или нет, зависит от компилирует от установки type-checked pointers option. Вы явно включили этот вариант, который является отличным решением. Это приводит к более строгой проверке типов.
С отключенными указателями с проверкой кода ваш код компилируется. С включенными указателями, отмеченными типом, ваш код не компилируется, что вам нужно, потому что ваш код недействителен.
Теперь, о типах, о которых идет речь. Они определены в Windows
блока, как это:
type
PRgnData = ^TRgnData;
{$EXTERNALSYM _RGNDATA}
_RGNDATA = record
rdh: TRgnDataHeader;
Buffer: array[0..0] of Byte;
Reserved: array[0..2] of Byte;
end;
TRgnData = _RGNDATA;
{$EXTERNALSYM RGNDATA}
RGNDATA = _RGNDATA;
Преимущество использования указателей типа проверено, что компилятор может сказать вам, что вы делаете, это не действует. Он знает, что lpRgnData^.Buffer[0]
имеет тип Byte
и поэтому @(lpRgnData^.Buffer[0])
имеет тип ^Byte
. И он знает, что не совместим с PChar
, который является псевдонимом для PWideChar
, то есть ^WideChar
.
Исправить ваш код, изменив тип PC
на ^Byte
или PByte
.
Похоже, вам нужно изменить 'PChar' на' PAnsiChar'. Однако может быть неправильно. –
Буфер представляет собой массив байтов. Поэтому измените PChar на PByte. –
@JerryDodge с использованием (pre-unicode) 'PChar' для вещей, которые должны были использовать' PByte', - это то, что во многих случаях привело к большому количеству устаревшего кода (например, этого). Если вам нужны байты, лучше использовать 'PByte', imo. –