Вопрос, поднятый пользователем, касается ошибки STATUS_INVALID_INFO_CLASS, возникающей при попытке получить идентификатор процесса conhost.exe в 32-битном приложении на Delphi. Процесс conhost.exe (Консольный хост) является частью Windows, отвечающим за отображение консольных окон и обработку ввода/вывода для консольных приложений.
Почему возникает ошибка?
Ошибка STATUS_INVALID_INFO_CLASS указывает на то, что указанный класс информации не является допустимым для запрошенного объекта. В данном случае, это означает, что класс информации ProcessConsoleHostProcess (с номером 49) не поддерживается в 32-битных приложениях.
Как решить проблему?
Перекомпиляция программы в 64-битном режиме. Если возможно, перекомпилируйте ваше приложение в 64-битном режиме, так как данный класс информации поддерживается только в 64-битных приложениях.
Использование публичных функций. Microsoft рекомендует использовать публичные функции, упомянутые в описании параметра ProcessInformationClass, чтобы сохранить совместимость вашего приложения.
Использование функций Tool Help. Вы можете использовать функции Tool Help для получения идентификатора процесса conhost.exe. Это альтернативный путь, который не требует использования ProcessConsoleHostProcess.
Пример кода на Object Pascal (Delphi)
Ниже приведен пример кода, который использует функции Tool Help для получения списка процессов и поиска процесса conhost.exe:
program GetConsoleHostProcessID;
{$APPTYPE CONSOLE}
uses
System.SysUtils,
System.Diagnostics,
Winapi.Windows;
var
ProcessEntry32: TProcessEntry32;
SnapShot: THandle;
Result: Cardinal;
ConsoleHostProcessID: Cardinal;
begin
SnapShot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);
if SnapShot = INVALID_HANDLE_VALUE then
RaiseLastOSError;
ProcessEntry32.dwSize := SizeOf(TProcessEntry32);
Result := Process32First(SnapShot, ProcessEntry32);
while Result do
begin
if LowerCaseCopy(ProcessEntry32.szExeFile) = 'conhost.exe' then
begin
ConsoleHostProcessID := ProcessEntry32.th32ProcessID;
Break;
end;
Result := Process32Next(SnapShot, ProcessEntry32);
end;
CloseHandle(SnapShot);
if Result = FALSE then
RaiseLastOSError;
if ConsoleHostProcessID = 0 then
Writeln('Процесс conhost.exe не найден.')
else
Writeln(Format('Идентификатор процесса conhost.exe: %d', [ConsoleHostProcessID]));
Readln;
end.
Важные замечания
Убедитесь, что вы используете правильный размер данных в соответствии с разрядностью вашего приложения (32 или 64 бит).
Проверьте, что у вашего приложения есть необходимые разрешения для доступа к процессу conhost.exe.
Следуя этим рекомендациям, вы сможете избежать ошибки STATUS_INVALID_INFO_CLASS и корректно получить идентификатор процесса conhost.exe.
Пользователь столкнулся с ошибкой STATUS_INVALID_INFO_CLASS при попытке получить идентификатор процесса conhost.exe в 32-битном приложении на Delphi, что связано с несовместимостью использования класса информации в 32-битном режиме.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS