尝试解读之前程序员的意图会带来另一种可能性...似乎对于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
,则应该编译正确的行。您可能需要修改适当的包含文件,或在项目文件中设置条件选项(具体取决于您的环境设置)。
然而,该条件符号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}
StrCopy(pSerialNumber, @Buf[pDevDesc.SerialNumberOffset + 1]);
{$ELSE}
StrPCopy(pSerialNumber,
FlipAndCodeBytes(StrPas(@Buf[pDevDesc.SerialNumberOffset + 1])));
{$IFEND}
{$ELSE}
StrPCopy(pSerialNumber,
FlipAndCodeBytes(StrPas(@Buf[pDevDesc.SerialNumberOffset + 1])));
{$ENDIF}
System.SysUtils
之后包含System.AnsiStrings
,这样你就可以使用System.AnsiStrings.StrCopy
而不是System.SysUtils.StrCopy
。或者更好的方法是明确地使用完全限定名称。 - David Heffernan