如何修复“E2033实际和正式var参数的类型必须相同”的编译器错误?

时间:2016-04-19 09:57:52

标签: delphi

我使用了RRUZ的solution来改善禁用图像的外观。以下摘录,例如:

procedure HookProc(Proc, Dest: Pointer; var BackupCode: TXRedirCode);
var
  n: DWORD;
  Code: TXRedirCode;
begin
  Proc := GetActualAddr(Proc);
  Assert(Proc <> nil);
  if ReadProcessMemory(GetCurrentProcess, Proc, @BackupCode, SizeOf(BackupCode), n) then
  begin
    Code.Jump := $E9;
    Code.Offset := PAnsiChar(Dest) - PAnsiChar(Proc) - SizeOf(Code);
    WriteProcessMemory(GetCurrentProcess, Proc, @Code, SizeOf(Code), n);
  end;
end;

在Delphi 2007中运行良好,但是当我在Delphi XE10中使用它时,我得到了

  

E2033实际和正式var参数的类型必须相同

调用ReadProcessMemory和WriteProcessMemory

据我所知,类型是相同的。谁能告诉我什么'需要改变?

1 个答案:

答案 0 :(得分:5)

  

E2033实际和正式var参数的类型必须相同

documentation说:

  

对于变量参数,实际参数必须是形式参数的确切类型。

换句话说,当您传递给var参数的参数的类型与函数声明中的类型不同时,会遇到此错误。

要解决此问题,第一步是找到要调用的函数的声明。然后,您需要将其参数列表与您传递的参数进行比较。

在您的情况下,这两个函数位于Winapi.Windows.pas(IDE悬停提示告诉您),如下所示:

function ReadProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer; 
  lpBuffer: Pointer; nSize: SIZE_T; var lpNumberOfBytesRead: SIZE_T): BOOL; stdcall;
function WriteProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer; 
  lpBuffer: Pointer; nSize: SIZE_T; var lpNumberOfBytesWritten: SIZE_T): BOOL; stdcall;

唯一的var参数是每个函数的最终参数,可以立即查明问题。但更一般地说,如果一个函数有多个var参数,那么你必须依次考虑每个参数。

这两个函数的最终参数现在具有类型SIZE_T。您引用的代码使用DWORD。更改传递给SIZE_T的变量的类型,您将解决问题。