Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Delphi “我该如何解决?”;E2033实际和形式var参数类型必须相同;编译器错误?_Delphi - Fatal编程技术网

Delphi “我该如何解决?”;E2033实际和形式var参数类型必须相同;编译器错误?

Delphi “我该如何解决?”;E2033实际和形式var参数类型必须相同;编译器错误?,delphi,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, Pro

我使用了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;
procedure HookProc(Proc,Dest:Pointer;var BackupCode:TXRedirCode);
变量
n:德沃德;
代码:TXRedirCode;
开始
Proc:=getactualadr(Proc);
断言(Proc nil);
如果ReadProcessMemory(GetCurrentProcess,Proc,@BackupCode,SizeOf(BackupCode),n),则
开始
代码.跳转:=$E9;
代码偏移量:=PAnsiChar(目的地)-PAnsiChar(过程)-尺寸(代码);
WriteProcessMemory(GetCurrentProcess,Proc,@Code,SizeOf(Code),n);
结束;
结束;
在Delphi2007中工作得很好,但是当我在Delphi XE10中使用它时

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

调用ReadProcessMemory和WriteProcessMemory时

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

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;
唯一的
var
参数是每个函数的最终参数,可立即确定问题。但是更一般地,如果函数具有多个<代码> var 参数,那么就必须依次考虑每一个。 这两个函数的最后一个参数现在的类型为
SIZE\u T
。您引用的代码使用DWORD。将要传递的变量类型更改为
SIZE\T
,您将解决此问题

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;
唯一的
var
参数是每个函数的最终参数,可立即确定问题。但是更一般地,如果函数具有多个<代码> var 参数,那么就必须依次考虑每一个。 这两个函数的最后一个参数现在的类型为
SIZE\u T
。您引用的代码使用DWORD。将要传递的变量类型更改为
SIZE\T
,您将解决此问题