【问题标题】:Using ReadProcess function of kernel32.dll at pascal在帕斯卡使用 kernel32.dll 的 ReadProcess 函数
【发布时间】:2013-05-15 20:10:15
【问题描述】:

我在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,但我遇到了同样的错误。谁能帮助我?) 附:它不是 delphi .. 我不知道这是什么 :) 程序调用 UOScript

【问题讨论】:

  • 如果这是 Delphi,那么这些 API 函数已经(正确)在 Windows 单元中声明。

标签: dll pascal


【解决方案1】:

OpenProcess 有声明

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

dwDesiredAccesspid 是双字,是

typedef unsigned long       DWORD;

即x86 上的 32 位,根据this 的回答。

但是 Delphi/Pascal Word 类型是 16 位的。

另外,BOOLdefined as

typedef int BOOL;

因此,您应该使用整数表示 inherit 而不是 Byte

所以,你的函数声明不正确。

看来您应该在声明中使用CardinalLongWord 而不是Word

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

【讨论】:

  • 谢谢。但是我怎样才能在帕斯卡上声明那个函数呢?我应该使用什么类型?
  • Word 是 Borland (Turbo/Delphi Pascal) 风格。原始 Pascal 只有一个有符号整数,其余部分使用子范围
猜你喜欢
  • 2021-12-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-27
相关资源
最近更新 更多