Delphi “我该如何解决?”;E2033实际和形式var参数类型必须相同;编译器错误?
我使用了RRUZ来改善残障图像的外观。然而,以下摘录作为示例: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
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
,您将解决此问题