2015-07-16 2 views
1

У меня есть этот кусок кода из Delphi 7:Как решить Delphi Ошибка: Несовместимые типы: 'PWideChar' и 'Pointer'

var 
    lpRgnData: PRgnData; 
    PC: PChar; 
    PR: PRect; 
    ... 

    PC := @(lpRgnData^.Buffer[0]); 

В Delphi xe4 он дает следующую компиляции ошибка:

Incompatible types: 'PWideChar' and 'Pointer' 

Как этот код должен быть обновлен для правильной работы в XE4?

Благодаря

+1

Похоже, вам нужно изменить 'PChar' на' PAnsiChar'. Однако может быть неправильно. –

+3

Буфер представляет собой массив байтов. Поэтому измените PChar на PByte. –

+2

@JerryDodge с использованием (pre-unicode) 'PChar' для вещей, которые должны были использовать' PByte', - это то, что во многих случаях привело к большому количеству устаревшего кода (например, этого). Если вам нужны байты, лучше использовать 'PByte', imo. –

ответ

4

ли это или нет, зависит от компилирует от установки 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.

+0

@J ... thx, исправлено –

Смежные вопросы