我使用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时
据我所知,类型是相同的.任何人都可以告诉我什么'需要改变?
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您将解决问题.
| 归档时间: |
|
| 查看次数: |
890 次 |
| 最近记录: |