【问题标题】:How do I fix "E2033 Types of actual and formal var parameters must be identical" compiler errors?如何修复“E2033 实际和形式 var 参数的类型必须相同”编译器错误?
【发布时间】:2016-04-19 09:57:51
【问题描述】:

我使用了 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 时

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

【问题讨论】:

    标签: delphi


    【解决方案1】:

    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,您将解决问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-09
      • 1970-01-01
      相关资源
      最近更新 更多