我使用了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
时据我所知,类型是相同的。谁能告诉我什么'需要改变?
答案 0 :(得分: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;
唯一的var
参数是每个函数的最终参数,可以立即查明问题。但更一般地说,如果一个函数有多个var
参数,那么你必须依次考虑每个参数。
这两个函数的最终参数现在具有类型SIZE_T
。您引用的代码使用DWORD
。更改传递给SIZE_T
的变量的类型,您将解决问题。