1

我在 Pascal 中覆盖了函数库 kernel32.dll,OpenProcess 函数返回 0。函数 GetLastError() 返回 87 错误,这意味着

ERROR_INVALID_PARAMETER 87 (0x57) 参数不正确。

有什么问题?

Program UODll;
const search_window = 'Ultima Online - xxx (The Abyss)';
function FindWindow(C1, C2: PChar): Longint; external 'FindWindowA@user32.dll stdcall';
function GetWindowThreadProcessId(hWnd: Longint; opt: Word): Word; external 'GetWindowThreadProcessId@user32.dll stdcall';
function OpenProcess(dwDesiredAccess: Word; inherit: Byte; pid: Word): Longint; external 'OpenProcess@kernel32.dll stdcall';
function GetProcessId(proc: Longint): Word; external 'GetProcessId@kernel32.dll stdcall';
function GetLastError(): Word; external 'GetLastError@kernel32.dll stdcall';
var
res, err: Word;
wnd, proc: Longint;
Begin
wnd := Findwindow('', search_window);
if (wnd > 0) then
begin
res := GetWindowThreadProcessId(wnd, res);
proc := OpenProcess($0400,0,res);
err := GetLastError();
writeln(IntToStr(proc));
writeln(IntToStr(err));
end;
End.

我试图使用 LongWord 和 Cardinal,但我有同样的错误。谁能帮助我?) PS 它不是 delphi .. 我不知道这是什么 :) Programm 调用 UOScript

4

1 回答 1

2

OpenProcess 有声明

HANDLE WINAPI OpenProcess(
  _In_  DWORD dwDesiredAccess,
  _In_  BOOL bInheritHandle,
  _In_  DWORD dwProcessId
);

dwDesiredAccess并且pid是双字

typedef unsigned long       DWORD;

根据这个答案,即 x86 上的 32 位。

但是 Delphi/PascalWord类型是 16 位的。

另外,BOOL定义

typedef int BOOL;

所以,你应该使用 Integerinherit代替Byte

因此,您的函数声明不正确。

似乎您应该在声明中使用CardinalorLongWord而不是。Word

如果你使用 Delphi,你可以导入Windows定义了所有 Win API 函数的模块。

于 2013-05-15T20:19:33.320 回答