Пытаясь расшифровать намерения предыдущего программиста приводит к другой возможности ....
Кажется, было исправление применяется для Delphi 2009 из-за изменения в строке типа. Я уверен, что вы не хотите изобретать все исправления, которые уже сделал другой программист.
Глядя на код, Delphi 2009 предназначен для компиляции следующей строки (которая не использует StrPas
):
StrCopy(pSerialNumber, @Buf[pDevDesc.SerialNumberOffset + 1]);
И старые версии Delphi предназначены для компиляции следующей строки (который делает использование StrPas
):
StrPCopy(pSerialNumber,
FlipAndCodeBytes(StrPas(@Buf[pDevDesc.SerialNumberOffset + 1])));
Delphi XE-6 будет не в этом случае может быть классифицирован как «более старая версия», поэтому ошибка заключается в том, что вы компилируете неправильную ветвь условного кода.
условный код будет компилироваться первым утверждением, если NEWVER
определен. Поэтому, если вы убедитесь, что определено значение NEWVER
, вы должны составить правильную строку. Возможно, вам потребуется изменить соответствующий файл include или установить условие в качестве опции в файле проекта. (Это зависит от того, как настроена ваша среда.)
Однако название этого условного символа NEWVER
несколько неуместно. Очевидно, что 2009 год больше не является «новой версией» - на самом деле даже XE6 теперь является «старой версией».
Таким образом, вы можете переписать ваш условный следующим образом:
{$IF CompilerVersion >= 20.0} //>= Delphi 2009
StrCopy(pSerialNumber, @Buf[pDevDesc.SerialNumberOffset + 1]);
{$ELSE}
StrPCopy(pSerialNumber,
FlipAndCodeBytes(StrPas(@Buf[pDevDesc.SerialNumberOffset + 1])));
{$IFEND}
Смотрите следующие ссылки для получения дополнительной информации об условных устанавливает:
http://docwiki.embarcadero.com/RADStudio/XE7/en/Conditional_compilation_(Delphi) http://docwiki.embarcadero.com/RADStudio/XE7/en/Compiler_Versions
Если вам необходимо поддерживать много более старые версии Delphi (старше Delphi 6, если я не ошибаюсь), вам может потребоваться написать вышеуказанный код:
{$IFDEF CONDITIONALEXPRESSIONS}
{$IF CompilerVersion >= 20.0} //>= Delphi 2009
StrCopy(pSerialNumber, @Buf[pDevDesc.SerialNumberOffset + 1]);
{$ELSE} //< Delphi 2009
StrPCopy(pSerialNumber,
FlipAndCodeBytes(StrPas(@Buf[pDevDesc.SerialNumberOffset + 1])));
{$IFEND}
{$ELSE} //< Delphi 6
StrPCopy(pSerialNumber,
FlipAndCodeBytes(StrPas(@Buf[pDevDesc.SerialNumberOffset + 1])));
{$ENDIF}
Это кажется очень правдоподобным, я не заметил этого, +1 –
@jim Я бы действительно пошел дальше, чем здесь сделал Крейг. Спросите себя, почему вы поддерживаете код, который вы никогда не компилируете? Вы не вернетесь в ANSI Delphi, не так ли? Поэтому разделите весь условный код ANSI/Unicode и напишите его следующим образом: 'StrCopy (pSerialNumber, @Buf [pDevDesc.SerialNumberOffset + 1]);' Все. Сделайте это на всей базе кода. –