2017-11-13 17 views
0

このコードをコンパイルできません。助けてもらえますか?ありがとう。DelphiでWriteProcessMemoryを使用する方法

procedure ChangeOutsideDateTime(h: HWND; dt: TDateTime); 
var 
    st: TSystemTime; 
    pst: Pointer; 
    hDTP: Cardinal; 
    hProc: THandle; 
    dwWrote: DWORD; 
begin 
    DateTimeToSystemTime(dt, st); 
    pst:= VirtualAllocEx(h, nil, SizeOf(st), MEM_COMMIT, 0); 
    if pst <> nil then begin 
    if GetWindowThreadProcessId(h, hDTP) > 0 then begin 
     hProc:= OpenProcess(PROCESS_VM_OPERATION, false, hDTP); 
     if WriteProcessMemory(hProc, pst, @st, SizeOf(st), dwWrote) > 0 then begin 
     SendMessage(h, DTM_SETSYSTEMTIME, GDT_VALID, hDTP); 
     CloseHandle(hProc); 
     end; 
    end; 
    VirtualFreeEx(h, pst, 0, MEM_RELEASE); 
    end; 
end; 

それは「WriteProcessMemory」を使用している行で、「実際の正式のvarパラメータの種類が同一でなければなりません」と表示されます。実際の正式のvarパラメータの

答えて

2

あなたのコードにはいくつかの欠点があります。

  • あなたはVirtualAllocEx()HWNDを渡しているが、それは代わりに開かれたプロセスにTHandleを期待しています。また、プロセスハンドルを開く前にVirtualAllocEx()に電話しています。そして、割り当てられたメモリへの書き込みアクセスを要求していません。

  • OpenProcess()を呼び出す場合、PROCESS_VM_WRITEの許可(WriteProcessMemory()が必要です)を要求していません。

  • WriteProcessMemory()の使用が宣言と一致しません。そのため、コンパイルエラーが発生しています。

  • あなたがDTM_SETSYSTEMTIMELPARAMとしてHWNDのプロセスIDを渡しているが、それは代わりに割り当てられたTSystemTimeポインタを期待しています。

は、より多くのこのような何かを試してみてください:

procedure ChangeOutsideDateTime(h: HWND; dt: TDateTime); 
var 
    st: TSystemTime; 
    PID: DWORD; 
    hProc: THandle; 
    pst: Pointer; 
    NumWrote: SIZE_T; 
begin 
    GetWindowThreadProcessId(h, PID); 
    hProc := OpenProcess(PROCESS_VM_OPERATION or PROCESS_VM_WRITE, false, PID); 
    if hProc <> 0 then 
    try 
    pst := VirtualAllocEx(hProc, nil, SizeOf(st), MEM_COMMIT, PAGE_READWRITE); 
    if pst <> nil then 
    try 
     DateTimeToSystemTime(dt, st); 
     if WriteProcessMemory(hProc, pst, @st, SizeOf(st), NumWrote) then begin 
     SendMessage(h, DTM_SETSYSTEMTIME, GDT_VALID, LPARAM(pst)); 
     end; 
    finally 
     VirtualFreeEx(hProc, pst, 0, MEM_RELEASE); 
    end; 
    finally 
    CloseHandle(hProc); 
    end; 
end; 
6

タイプこのコンパイラエラーE2003です

同じでなければなりません。理解できないコンパイラエラーが発生した場合、最初に行うことはdocumentationです。それは言う:

可変パラメータの場合、実際の引数は、仮パラメータの正確な型でなければならない。

このエラーにつながる関数呼び出しは、WriteProcessMemoryです。

function WriteProcessMemory(hProcess: THandle; const lpBaseAddress: Pointer; 
    lpBuffer: Pointer; nSize: SIZE_T; var lpNumberOfBytesWritten: SIZE_T): BOOL; stdcall; 

ここでは、最終パラメータであるvarというパラメータが1つだけあります。渡す変数はSIZE_Tである必要がありますが、タイプDWORDの変数を渡しました。それは不一致です。

いくつかの他のコメントは:

  • VirtualAllocExへの呼び出しを使用すると、プロセスハンドルではなく、ウィンドウハンドルを渡すために失敗にバインドされています。
  • 意味的には、正のスレッドIDをテストするのは意味がありません。成功またはそれ以外の場合には、テストはゼロに等しくない。
  • OpenProcessの戻り値はチェックしないでください。それはすぐに失敗する可能性があります。
  • WriteProcessMemoryに必要なアクセス権をPROCESS_VM_WRITEにしてプロセスを開くことはありません。
  • WriteProcessMemoryへの呼び出しが失敗した場合、ハンドルがリークします。
  • 返品タイプWriteProcessMemoryBOOLです。
  • hDTPはプロセスIDの奇妙な名前です。その名前は、それが日付の時間ピッカーコントロールのハンドルだと思うことを示唆しています。そうではありません。それはプロセスIDです。
  • あなたが書いたばかりのシステム時刻のアドレスではなく、SendMessage呼び出しでそのプロセスIDを渡します。
+0

あなたのコメントとして、その手順を変更することはできますか?あなたはテストをしましたか? BOOLでは、TRUE/FALSEまたは1/0を取得できます。 SIZE_T、DWORDまたは整数については同じです。 – shinken

+0

コンパイラのエラーについては、包括的に説明しました。私は何のテストをするだろうか?私はそれを理解していないのですか? –

関連する問題