Форум: "WinAPI";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];
ВнизЧтение/запись свойств файла через описание его класса в реестре Найти похожие ветки
← →
Davinchi (2004-06-22 16:52) [0]Пытаюсь читать и записывать из своей проги свойства зарегистрированного типа файла через OLE по его классу. Речь идет о *.doc (WordDocument) и о его свойствах, т.е. Автор, Тема... Прочитать любое свойство не представляет сложностей - работает, но запись проходит не савсем корректно - записывается пустая строка. Очень прошу попробывать у себя код, может кто-нить разберется:
uses ActiveX, ComObj, SysUtils;
function GetDocInf(FileName: TFileName): String;
const
FMTID_SummaryInformation: TGUID = "{F29F85E0-4FF9-1068-AB91-08002B27B3D9}";
var
PFileName: PWideChar;
Storage: IStorage;
PropSetStg: IPropertySetStorage;
PropStg: IPropertyStorage;
ps: PROPSPEC;
pv: PROPVARIANT;
begin
PFileName := StringToOleStr(FileName);
try
OleCheck(StgOpenStorage(PFileName, nil, STGM_DIRECT or STGM_READWRITE or STGM_SHARE_EXCLUSIVE, nil, 0, Storage));
finally
SysFreeString(PFileName);
end;
PropSetStg := Storage as IPropertySetStorage;
OleCheck(PropSetStg.Open(FMTID_SummaryInformation, STGM_DIRECT or STGM_READWRITE or STGM_SHARE_EXCLUSIVE, PropStg));
ps.ulKind := PRSPEC_PROPID;
ps.propid := PIDSI_AUTHOR;
PropStg.ReadMultiple(1, @ps, @pv);
Result := pv.pszVal;
end;
procedure SetDocInf(FileName: TFileName; Value: String);
const
FMTID_SummaryInformation: TGUID = "{F29F85E0-4FF9-1068-AB91-08002B27B3D9}";
var
PFileName: PWideChar;
Storage: IStorage;
PropSetStg: IPropertySetStorage;
PropStg: IPropertyStorage;
ps: PROPSPEC;
pv: PROPVARIANT;
begin
PFileName := StringToOleStr(FileName);
try
OleCheck(StgOpenStorage(PFileName, nil, STGM_DIRECT or STGM_READWRITE or STGM_SHARE_EXCLUSIVE, nil, 0, Storage));
finally
SysFreeString(PFileName);
end;
PropSetStg := Storage as IPropertySetStorage;
OleCheck(PropSetStg.Open(FMTID_SummaryInformation, STGM_DIRECT or STGM_READWRITE or STGM_SHARE_EXCLUSIVE, PropStg));
ps.ulKind := PRSPEC_PROPID;
ps.propid := PIDSI_AUTHOR;
pv.pszVal := PChar(Value);
PropStg.WriteMultiple(1, @ps, @pv, PIDSI_AUTHOR);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
Edit1.Text := GetDocInf(Filename.FileName);
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
SetDocInf(Filename.FileName, Edit1.Text);
end;
← →
Cobalt © (2004-06-22 21:33) [1]А что, если pv.pszVal присваивать константу, т.е. pv.pszVal:="This is a test";
?
Будет работать?
Попробуй ещё отключить оптимизацию компилятора.
Страницы: 1 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.08.01;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.032 c