В данной статье рассмотрим проблему, связанную с использованием функции ShellExecuteEx в среде разработки Delphi, которая приводит к ошибке COMADMIN_E_REGDB_SYSTEMERR при запуске программы из IDE. Также будут затронуты связанные с этим проблемы в работе диалогов открытия и сохранения файлов (TOpenDialog.Execute и TSaveDialog.Execute). Проблема проявляется только при запуске программы из среды Delphi, будь то запуск в отладке или без отладки.
Описание Проблемы
При использовании ShellExecuteEx для запуска другой программы из приложения, созданного в Delphi, возникают ошибки, когда приложение запускается непосредственно из среды разработки. Ошибка проявляется в виде сообщения о системной ошибке с кодом -2146368396, указывающим на проблему в COM+ реестре.
Кроме того, наблюдается проблема с диалогами открытия и сохранения файлов, которые не отображаются и возвращают False, что также работает корректно при запуске приложения вне среды Delphi.
Контекст Проблемы
Программа не содержит явного кода, связанного с COM, и использует только функции RTL/VCL, автоматически вызываемые Delphi. В коде, вызывающем ShellExecuteEx, нет явных признаков ошибок:
function ShellExecEx(const Filename: string; const Parameters: string;
const Verb: string; CmdShow: Integer; _ShowAssociateDialog: Boolean = False): boolean;
var
Sei: TShellExecuteInfo;
begin
// Инициализация структуры TShellExecuteInfo
// ...
Result := ShellExecuteEx(@Sei);
end;
Программа - 32-битное приложение, созданное в Delphi XE2, запущенное на 64-битной версии Windows 8.1.
Подтвержденный Ответ
Проблема была решена после удаления переменной окружения lang=de, добавленной в диалог запуска среды Delphi для тестирования локализации. Удаление этой переменной окружения устранило описанные проблемы, и программа начала работать корректно.
Альтернативный Ответ
В качестве альтернативного решения можно рассмотреть использование функции CreateProcess вместо ShellExecuteEx, что может избежать зависимости от COM и связанных с ним проблем.
Пример Кода с CreateProcess
var
StartupInfo: TStartupInfo;
ProcessInfo: TProcessInformation;
begin
// Инициализация структур TStartupInfo и TProcessInformation
// ...
if CreateProcess(nil, // Используем командную строку
PChar(CommandLine),
nil, nil, False,
CREATE_NO_WINDOW,
nil, nil,
@StartupInfo, ProcessInfo) then
begin
// Ожидание завершения процесса
// ...
end;
end;
Заключение
Важно учитывать, что использование переменных окружения в среде разработки может приводить к непредсказуемому поведению программы. В случае возникновения подобных проблем рекомендуется тщательно проверять настройки среды и использовать альтернативные методы, такие как CreateProcess, для запуска внешних программ.
Проблема заключается в ошибках, возникающих при использовании функции `ShellExecuteEx` в среде Delphi, которые проявляются при запуске программы из IDE и связаны с проблемами в COM+ реестре, а также с работой диалогов открытия и сохранения файлов, и реше
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS