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

### Устранение Проблем с ShellExecuteEx в Delphi и COM+ ###

Delphi , Технологии , COM и DCOM

Устранение Проблем с ShellExecuteEx в Delphi и COM+

В данной статье рассмотрим проблему, связанную с использованием функции 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




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


:: Главная :: COM и DCOM ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2024-12-27 01:44:50/0.0033578872680664/0