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
);

dwDesiredAccesspidはダブルワードです。

typedef unsigned long       DWORD;

つまり、この回答によると、x86 では 32 ビットです。

ただし、Delphi/PascalWord型は 16bit です。

また、BOOLは次のように定義されます。

typedef int BOOL;

inheritしたがって、代わりにInteger for を使用する必要がありますByte

したがって、関数宣言が正しくありません。

宣言の代わりにCardinalorを使用する必要があるようです。LongWordWord

WindowsDelphi を使用すると、すべての Win API 関数が定義されたモジュールをインポートできます。

于 2013-05-15T20:19:33.320 に答える