&引用&引用;DELPHI:E2033类型的实际和正式var参数必须相同&引用;
所以我收到了这个错误信息,有人能帮我吗,已经尝试了很多谷歌答案:p什么都没用 ReadProcessMemory上的ctrl+shift+空格结果&引用&引用;DELPHI:E2033类型的实际和正式var参数必须相同&引用;,delphi,Delphi,所以我收到了这个错误信息,有人能帮我吗,已经尝试了很多谷歌答案:p什么都没用 ReadProcessMemory上的ctrl+shift+空格结果 **Parameters** hProcess System.Cardinal IpBaseAddress System.Pointer IpBuffer System.Pointer nSize System.Cardinal IpNumberOfBytesRead System.Cardinal **Returns** System
**Parameters**
hProcess System.Cardinal
IpBaseAddress System.Pointer
IpBuffer System.Pointer
nSize System.Cardinal
IpNumberOfBytesRead System.Cardinal
**Returns**
System.Boolean
Ptr功能:
Ptr Function: function Ptr(Value: Integer): Pointer;
变量
var
Form1: TForm1;
PH : THandle;
PID, ThID: DWORD;
H : THandle;
function Ptr(Value: Integer): Pointer;
功能
function LerInt(Address: Integer): Integer;
var
value:integer;
ler:dword;
begin
H := FindWindow(nil, 'Something Here :)');
ThID := GetWindowThreadProcessID(H, @PID);
PH := OpenProcess(PROCESS_ALL_ACCESS, FALSE, PID);
ReadProcessMemory(PH, Ptr(Address), @value, 4, ler); // THIS LINE
Result:=value;
end;
变量
ler
的类型错误。它必须是大小\u T
其他意见:
指针(地址)
进行强制转换即可。但是请注意,如果您将此代码传递给64位编译器,您将遇到指针截断问题这意味着您将错误类型的参数放在了这里的一个函数中(编译器指向的那个函数)。要点是:若你们有一个过程(i:Integer),你们可以调用它来传递byte,shortint,Word,Integer,毕竟编译器会把你们的参数转换成过程需要的类型。但若您有一个过程(var i:Integer),那个么必须严格地传递Integer,仅此而已。所以,看一看具体类型的参数,并与你在这里写的进行比较。如果你给我们提供了这个错误产生的确切路线和我们不知道的变量类型,比如H,ThID,PH,那么很容易回答这里到底什么参数是错的。当然,心灵感应正在进行中,但请不要过分依赖它们。编译器会准确地告诉您是哪一行导致了问题,并使用代码洞察(Ctrl+Shift+函数参数参数之间的空格)准确地告诉您每个参数的预期数据类型。由于您不必费心包含错误的行号,也不必指出问题出在哪一行,所以请使用我刚才提供的信息自己解决问题。:-)瞧,你绝对没有理由不为我们确定具体的问题区域,因为它就在你面前的屏幕上。你也没有费心指出你正在使用的一些变量类型(例如,H,ThID,PH,PID)。如果您需要我们的帮助,请提供您已有的信息。您要求我们提供免费帮助以解决您遇到的问题-您应该让我们尽可能容易地这样做。另一个重要的缺失是什么是
Ptr
。你缺乏错误检查,这会再次困扰你。Win32 API调用不会引发异常。你必须检查错误。我一天至少说10次。天哪,我有多蠢啊:p谢谢它奏效了!谢谢大家的帮助和提示。出于好奇,哪个Delphi版本将最后一个参数声明为ReadProcessMemory
作为SIZE\u T
?(对你的答案投赞成票;只是问问而已。)@ken。这是为了与64位编译器兼容,我认为.XE有DWORD,所以是的,它一定是XE2@LURD:Seatlle将其声明为NativeUInt
;2007将其声明为Cardinal
。它看起来是XE2(在RAD Studio\12.0\Source\Rtl\Win\Windows.pas中)还是XE3?不管怎样,现在没关系。谢谢