uses ActiveX, ComObj, SysUtils;
function GetSummaryInfAuthor(FileName: TFileName): string;
var
PFileName: PWideChar;
Storage: IStorage;
PropSetStg: IPropertySetStorage;
PropStg: IPropertyStorage;
ps: PROPSPEC;
pv: PROPVARIANT;
const
FMTID_SummaryInformation: TGUID = '{F29F85E0-4FF9-1068-AB91-08002B27B3D9}';
begin
PFileName := StringToOleStr(FileName);
try// Open compound storage
OleCheck(StgOpenStorage(PFileName, nil,
STGM_DIRECT or STGM_READ or STGM_SHARE_EXCLUSIVE, nil, 0, Storage));
finally
SysFreeString(PFileName);
end;
// Summary information is in a stream under the root storage
PropSetStg := Storage as IPropertySetStorage;
// Get the IPropertyStorage
OleCheck(PropSetStg.Open(FMTID_SummaryInformation,
STGM_DIRECT or STGM_READ or STGM_SHARE_EXCLUSIVE, PropStg));
// We want the author property value
ps.ulKind := PRSPEC_PROPID;
ps.propid := PIDSI_AUTHOR;
// Read this property
PropStg.ReadMultiple(1, @ps, @pv);
Result := pv.pszVal;
end;
Код, который вы предоставили, - это функция Delphi, которая извлекает автора файла с помощью потока информационных данных в Windows. Автор может быть найден в свойстве "SummaryInformation" в свойствах.
Следующий шаги:
Он открывает указанный файл как объект хранения.
Он получает хранение свойств из открытого хранения.
Он открывает хранение свойств для свойства "SummaryInformation".
Он читает значение свойства автора с помощью флагов PROPID и PRSPEC_PROPID.
Обратите внимание, что эта функция требует, чтобы файл был Microsoft Office документом (doc, docx, ppt, pptx, xls, xlsx), потому что она использует свойство "SummaryInformation", которое является специфичным для этих типов файлов.
Также это код может не работать для всех документов, потому что не все документы содержат информацию о авторе. Кроме того, некоторые документы могут иметь null или пустое значение автора.
Вы можете также проверить расширение файла перед вызовом функции, чтобы убедиться, что это поддерживаемый тип файла:
functionIsSupportedFileExtension(FileName:string):boolean;begin// Список поддерживаемых расширенийconstSupportedExtensions:array['doc','docx','ppt','pptx','xls','xlsx']ofBoolean=(True,True,True,True,True,True);// Проверка расширения файлаResult:=False;fori:=Low(SupportedExtensions)toHigh(SupportedExtensions)doifUpperCase(ExtractFileExt(FileName))=UpperCase(SupportedExtensions[i])thenbeginResult:=True;Break;end;end;procedureTForm1.Button1Click(Sender:TObject);varAuthor:string;beginifIsSupportedFileExtension('C:\Path\To\Your\File.docx')thenAuthor:=GetSummaryInfAuthor('C:\Path\To\Your\File.docx')elseAuthor:='Unsupported file type';ShowMessage(Author);end;
В этом примере функция IsSupportedFileExtension проверяет, является ли файл поддерживаемым типом. Если файл не является поддерживаемым типом, то функция возвращает сообщение "Unsupported file type".
Автор файла документа можно узнать с помощью функции GetSummaryInfAuthor из ActiveX-библиотеки, которая использует интерфейсы IStorage и IPropertyStorage для чтения свойства автора.
Комментарии и вопросы
Получайте свежие новости и обновления по Object Pascal, Delphi и Lazarus прямо в свой смартфон. Подпишитесь на наш Telegram-канал delphi_kansoftware и будьте в курсе последних тенденций в разработке под Linux, Windows, Android и iOS
Материалы статей собраны из открытых источников, владелец сайта не претендует на авторство. Там где авторство установить не удалось, материал подаётся без имени автора. В случае если Вы считаете, что Ваши права нарушены, пожалуйста, свяжитесь с владельцем сайта.