2016-01-28 59 views
1

所以我得到這個錯誤信息,有人可以幫助我,已經嘗試了很多谷歌的答案:P沒有工作。」「DELPHI:E2033類型的實際和正式的變量參數必須相同」「

CTRL + SHIFT +空間結果上ReadProcessMemory

**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; 
+1

這意味着你把錯誤類型的參數放在這裏的函數之一(編譯器指向你的那個函數)。要點是:如果你有程序(i:Integer),你可以稱它爲傳遞字節,shortint,Word,Integer,編譯器會將你的參數轉換爲類型過程需要的參數。但是如果你有程序(var i:Integer),你必須傳遞STRICTLY Integer,而不是更多。所以,看看確切類型的參數並與你在這裏寫的內容進行比較。 –

+3

如果您向我們提供了出現此錯誤的確切行以及我們不知道的變量類型H,ThID,PH,那麼很容易準確地回答這裏出現的錯誤。 Telepaths當然是在他們的路上,但請不要太依賴他們。 –

+0

編譯器告訴你**完全**導致該問題的線,並且使用Code Insight(Ctrl + Shift +功能參數parens之間的空格)準確告訴您** **每個參數所需的數據類型。由於您不打算將錯誤的行號包含在內,或者指出哪一行是問題,請使用我剛剛給您提供的信息自行解決。 :-) IOW,你絕對沒有理由不爲我們確定具體的問題區域,因爲它正好在你面前的屏幕上。 –

回答

3

可變ler是錯誤的類型。它必須是SIZE_T

其他評論:

  1. 你不需要的功能整數轉換爲指針。只需使用Pointer(address)即可投射。請注意,如果您通過64位編譯器傳遞此代碼,您將遇到指針截斷問題。
  2. 您不檢查任何API調用中的錯誤。請檢查錯誤。
+0

Omg,我多麼愚蠢:p感謝它的工作!並感謝所有的幫助和提示。 –

+0

出於好奇,哪個Delphi版本將'ReadProcessMemory'的最後一個參數聲明爲'SIZE_T'? (Upvoting你的答案,只是問。) –

+0

@ken。這與我認爲的64位編譯器兼容。 –

相關問題