Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Чтение/запись свойств файла через описание его класса в реестре


Davinchi ©   (2004-06-22 16:52:00) 

Пытаюсь читать и записывать из своей проги свойства зарегистрированного типа файла через 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:00) [1]

А что, если  pv.pszVal присваивать константу, т.е. pv.pszVal:='This is a test';
?
Будет работать?
Попробуй ещё отключить оптимизацию компилятора.


Наверх

Титульная страница Поиск, карта сайта Написать письмо