Карта сайта Kansoftware
НОВОСТИУСЛУГИРЕШЕНИЯКОНТАКТЫ
KANSoftWare

Устранение ошибки при переопределении OpenProcess в Pascal: доступ к чужим процессам

Delphi , Файловая система , DLL и PlugIns

Устранение ошибки при переопределении функции OpenProcess в Pascal

При работе с функциями операционной системы Windows, важно точно следовать их декларации, чтобы избежать ошибок. В случае с функцией OpenProcess из библиотеки kernel32.dll, важно правильно определить типы параметров и возвращаемого значения.

Описание проблемы

При попытке переопределения функции OpenProcess в коде на Pascal, разработчик столкнулся с ошибкой ERROR_INVALID_PARAMETER (код ошибки 87), что указывает на неправильный параметр. Это произошло из-за несоответствия типов параметров, используемых в коде, и требований функции OpenProcess.

Подробности функции OpenProcess

Функция OpenProcess имеет следующий прототип:

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

Здесь DWORD - это тип данных, эквивалентный неотрицательному 32-битному целому числу. В среде разработки Delphi, тип Word является 16-битным, что не соответствует типу DWORD.

Исправление кода

Для исправления кода необходимо использовать тип Cardinal или LongWord вместо Word. Также, параметр bInheritHandle должен быть определен как Integer, а не как Byte.

Вот исправленный код:

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: Cardinal): Cardinal; external 'GetWindowThreadProcessId@user32.dll stdcall';
function OpenProcess(dwDesiredAccess: Cardinal; inherit: Integer; pid: Cardinal): Longint; external 'OpenProcess@kernel32.dll stdcall';
function GetLastError(): Cardinal; external 'GetLastError@kernel32.dll stdcall';
var
  res, err: Cardinal;
  wnd, proc: Longint;
begin
  wnd := FindWindow('', search_window);
  if (wnd > 0) then
  begin
    res := GetWindowThreadProcessId(wnd, res);
    proc := OpenProcess($001F, 0, res); // Используйте правильный код доступа
    err := GetLastError();
    writeln(IntToStr(proc));
    writeln(IntToStr(err));
  end;
end.

Альтернативный подход

В случае использования Delphi, можно импортировать модуль Windows, который содержит декларации всех функций WinAPI. Это позволит избежать необходимости самостоятельно определять типы функций.

Заключение

При работе с функциями операционной системы важно правильно понимать и использовать типы данных, которые они ожидают. Исправление типов параметров и возвращаемого значения функции OpenProcess на Cardinal или LongWord для DWORD и на Integer для BOOL решит проблему с ошибкой ERROR_INVALID_PARAMETER.

Создано по материалам из источника по ссылке.

Устранение ошибки `ERROR_INVALID_PARAMETER` при переопределении функции `OpenProcess` в Pascal из-за несоответствия типов данных параметров.


Комментарии и вопросы

Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS




Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.


:: Главная :: DLL и PlugIns ::


реклама


©KANSoftWare (разработка программного обеспечения, создание программ, создание интерактивных сайтов), 2007
Top.Mail.Ru

Время компиляции файла: 2024-12-22 20:14:06
2025-02-05 10:45:59/0.003328800201416/0