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

**Как гарантировать получение дескриптора процесса при использовании ShellExecuteEx для открытия файлов из SQL базы в Delphi**

Delphi , Синтаксис , Справочник по API-функциям

Гарантирование получения дескриптора процесса при использовании ShellExecuteEx в Delphi

При работе с файлами, сохраненными в базе данных в формате Varbinary и открываемыми через внешние приложения, важно уметь контролировать процесс их открытия и закрытия. Вопрос, поставленный пользователем, касается именно этого: как дождаться закрытия файла приложением, которое его открыло, прежде чем удалить этот файл из системы?

Проблема

Разработчик столкнулся с необходимостью открытия файла, сохраненного в базе данных SQL через TMemoryStream, в соответствующем приложении, не зная точного пути к исполняемому файлу этого приложения. Использование функции ShellExecuteEx позволило частично решить проблему, однако в некоторых случаях (например, с Windows Live Photo Gallery) не возвращается дескриптор процесса, что не позволяет дождаться закрытия приложения перед удалением файла.

Решение

Подтвержденный ответ подчеркивает, что попытки обнаружить закрытие процесса, отвечающего за просмотр файла, являются ненадежными и могут привести к проблемам. Вместо этого предлагается использовать временные файлы, которые не будут удаляться сразу после закрытия приложения. Например, можно:

  • Запоминать созданные файлы и удалять их по порядку, когда количество созданных файлов превысит определенный порог.
  • Удалять все временные файлы при старте программы.
  • Запускать отдельный поток, который будет удалять файлы, созданные более часа назад.

Также в альтернативном ответе представлен пример кода на Object Pascal, который может помочь в решении задачи:

uses SysUtils, Windows, ShellAPI, Forms, Registry, Classes, Messages, Printers,
    PSAPI, TlHelp32, SHFolder;

function IsFileInUse(fName: string): boolean;
begin
    // Проверка, используется ли файл другими процессами
    // ...
end;

function Launch(sCommandLine: string; bWait: Boolean; AppHandle: HWND): Boolean;
begin
    // Запуск внешнего приложения с ожиданием его закрытия
    // ...
end;

function WaitExec(const CmdLine:AnsiString;const DisplayMode:Integer):Integer;
begin
    // Запуск приложения и ожидание его завершения
    // ...
end;

Заключение

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

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

Описание: Разработчик в Delphi использует ShellExecuteEx для открытия файлов из базы данных и столкнулся с проблемой, что не получает дескриптор процесса, что затрудняет дожидаться закрытия приложения перед удалением файла.


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

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




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


:: Главная :: Справочник по API-функциям ::


реклама


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

Время компиляции файла: 2024-12-22 20:14:06
2024-12-26 13:57:02/0.0033681392669678/0