Вопрос пользователя заключается в том, что при использовании функции StgOpenStorageEx для получения сводной информации о файле в среде Delphi XE возникает ошибка EOleSysError "%1 could not be found". Функция возвращает код ошибки -2147287038, что соответствует STG_E_FILENOTFOUND. Пользователь пытается получить сводную информацию из файлов различных типов, включая .doc, и сталкивается с этой проблемой.
Решение проблемы
Проблема заключается в неправильном использовании констант STGFMT, которые определяют формат хранения. Для файлов, имеющих встроенные свойства, такие как .doc, .xls, .msc, следует использовать STGFMT_STORAGE, а для файлов, которые могут быть обернуты в внешние свойства NTFS-5 в Windows Vista и выше, использовать STGFMT_FILE. Однако, согласно документации MSDN, для файлов .doc не следует использовать STGFMT_FILE, так как они являются составными файлами.
Шаги для решения ошибки:
Используйте правильную константу STGFMT:
Для файлов с встроенными свойствами используйте STGFMT_STORAGE, а для файлов без внутренних свойств, которые могут быть обернуты в NTFS-5 свойства, используйте STGFMT_DOCFILE вместо STGFMT_FILE.
Проверьте тип файла:
Убедитесь, что вы используете правильный тип константы STGFMT в соответствии с типом файла, с которым вы работаете.
Проверьте имя файла:
Убедитесь, что путь к файлу корректен и что файл существует в указанном пути.
Проверьте кодировку строк:
В Delphi XE и выше лучше использовать UnicodeString для работы со строками, особенно при работе с OLE функциями.
Используйте функцию StringToOleStr:
Вместо явного приведения типа строки используйте функцию StringToOleStr, которая может быть более надежной в различных средах.
Проверьте файл на наличие свойств:
Прежде чем пытаться получить свойства, убедитесь, что файл действительно содержит их.
Обработка ошибок:
Разделите вызов функции StgOpenStorageEx и вызов OleCheck на отдельные шаги, чтобы лучше отслеживать возможные ошибки.
Пример кода:
var
res, open: HResult;
stg: IStorage;
PropSetStg: IPropertySetStorage;
PropStg: IPropertyStorage;
FileName: UnicodeString;
// ... другие константы и объявления ...
begin
FileName := ExtractFilePath(Application.ExeName) + 'testfile.doc';
// Проверка на корректность использования STGFMT, например для .doc файла:
// res := StgOpenStorageEx(PWideChar(FileName), ..., STGFMT_STORAGE, ...);
// ... остальной код ...
end;
Следуя этим шагам, вы сможете устранить ошибку EOleSysError "%1 could not be found" и корректно получить сводную информацию о файле в Delphi XE.
Пользователь столкнулся с ошибкой при попытке получить сводную информацию о файле в среде Delphi XE с использованием функции `StgOpenStorageEx`, из-за неправильного использования констант `STGFMT` и возможных проблем с путем к файлу или его наличием.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.