2016-04-19 3 views
1

Ich habe RRUZ solution verwendet, um das Aussehen von deaktivierten Bildern zu verbessern. Der Ausschnitt unten, als Beispiel, aber:Wie behebe ich "E2033 Arten von tatsächlichen und formalen var-Parameter müssen identisch sein" Compiler-Fehler?

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; 

hat gut funktioniert mit Delphi 2007, aber wenn ich es in Delphi XE10 verwende ich bekommen

E2033 Typen der tatsächlichen und formalen var Parameter müssen identisch sein

beim Aufruf von Readprocessmemory und Write

Soweit ich eine sehen, sind die Typen gleich. Kann mir jemand raten, was muss geändert werden?

Antwort

5

E2033 Typen der tatsächlichen und formalen var Parameter müssen

Die documentation sagt identisch sein:

Für einen variablen Parameter, die eigentliche Argument muss von der genauen Art der formalen Parameter.

Mit anderen Worten, begegnen Sie diesen Fehler, wenn ein Argument, das Sie zu einem var Parametern übergeben werden eine Art hat, die nicht identisch mit dem in der Funktion der Erklärung.

Um das Problem zu lösen, ist der erste Schritt, die Deklaration der Funktion zu finden, die Sie aufrufen. Dann müssen Sie seine Argumentliste mit den Argumenten vergleichen, die Sie übergeben.

In Ihrem Fall sind diese beiden Funktionen in Winapi.Windows.pas (die IDE schweben Hinweise Ihnen sagen, dass) und wie folgt aussehen:

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; 

Die einzige var Parameter sind der letzte Parameter jeder Funktion, die sofort die lokalisiert Problem. Aber im Allgemeinen, wenn eine Funktion mehrere var Parameter hat, dann müssten Sie jede der Reihe nach berücksichtigen.

Der letzte Parameter für diese beiden Funktionen hat jetzt den Typ SIZE_T. Der Code, auf den Sie verweisen, verwendet DWORD. Ändern Sie den Typ der Variablen, die an SIZE_T übergeben wird, und Sie werden das Problem lösen.

Verwandte Themen