在pascal上使用kernel32.dll的ReadProcess函数

时间:2013-05-15 20:10:15

标签: dll pascal

我在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,但我有同样的错误..谁可以帮助我?) 附:它不是德尔福..我不知道这是什么:)程序调用UOScript

1 个答案:

答案 0 :(得分:2)

OpenProcess有声明

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

dwDesiredAccesspid是双字

typedef unsigned long       DWORD;

即。根据{{​​3}}回答,x86上为32位。

但是Delphi / Pascal this类型是16位。

此外,BOOLWord

typedef int BOOL;

因此,您应该使用Integer作为inherit而不是Byte

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

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

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