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

Joh*_*rat 1 delphi

我使用RRUZ的解决方案来改善禁用图像的外观.以下摘录,例如:

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;
Run Code Online (Sandbox Code Playgroud)

与Delphi 2007一起工作得很好,但是当我在Delphi XE10中使用它时,我得到了

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

在调用ReadProcessMemory和WriteProcessMemory时

据我所知,类型是相同的.任何人都可以告诉我什么'需要改变?

Dav*_*nan 5

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

文件说:

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

换句话说,当您传递给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;
Run Code Online (Sandbox Code Playgroud)

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

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