..::StrukturovanΘ ·lo₧iÜt∞::..

Je to vlastn∞ soubor, kter² se dß p°irovnat k disku. M∙₧ete v n∞m mφt adresß°e a podadresß°e a soubory. (Tady se jim ovÜem °φkß jinak.)
Pracuje se s nimi pomocφ rozhranφ COM, ale pokud s nφm nechcete pracovat m∙₧ete pou₧φt mnou naprogramovanou t°φdu COleStorage (pro ·lo₧iÜt∞) a MFC t°φdu COleStreamFile (pro proudy).

Nßzvoslovφ:

┌lo₧iÜt∞ - (anglicky Storage) je obdoba adresß°e.
Proud - (anglicky Stream) je obdoba souboru.

Pot°ebnΘ hlaviΦkovΘ soubory:

afxole.h - pro strukturovanß ·lo₧iÜt∞
afxpriv.h - pro p°evod na ÜirokΘ znaky (tento hlaviΦkov² soubor nenφ t°eba pokud pou₧φvßte pro p°evod jin² postup ne₧ v uveden²ch p°φkladech)
Podle uΦebnice je t°eba ve funkci InitInstance volat funkci AfxOleInit() aby Ülo zφskat rozhranφ IMalloc, kterΘ je pot°eba p°i zjiÜ¥ovßnφ obsahu ·lo₧iÜt∞ (viz. dßle), ale mn∞ to fungovalo i bez toho.

Prßce se strukturovan²mi ·lo₧iÜti:

Pracuje se s nimi pomocφ COM rozhranφ IStorage (pro ·lo₧iÜt∞) a IStream (pro proudy). Jako u ka₧dΘho objektu COM musφme nejd°φve zφskat ukazatel na zßkladnφ rozhranφ (IStorage) a pomocφ n∞j potΘ zφskßvßme ukazatele na dalÜφ rozhranφ (IStream).

Zφskßnφ rozhranφ IStorage: 

Rozhranφ IStorage zφskßme pomocφ jednΘ z funkcφ StgCreateDocfile (pro vytvo°enφ ·lo₧iÜt∞) nebo StgOpenStorage (otev°enφ existujφcφho). 
Nap°φklad takto:

Vytvo°enφ novΘho:

IStorage* pStg;

USES_CONVERSION;    // Vy₧adovßno makrem T2COLE

StgCreateDocfile(T2COLE("uloziste.stg"),STGM_READWRITE|STGM_SHARE_EXCLUSIVE|STGM_CREATE,0,&pStg);

Otev°enφ existujφcφho:

IStorage* pStg;

USES_CONVERSION;    // Vy₧adovßno makrem T2COLE

StgCreateDocfile(T2COLE("uloziste.stg"),STGM_READWRITE|STGM_SHARE_EXCLUSIVE,0,&pStg);

Zφskßnφ rozhranφ IStorage pro pod·lo₧iÜt∞:

(p°edstavte si podadresß°)

Vytvo°enφ:

// pStg je ukazatel na ·lo₧iÜt∞ (IStorage) zφskan² d°ive.

IStorage* pSubStg;

USES_CONVERSION;    // Vy₧adovßno makrem T2COLE

pStg->CreateStorage(T2COLE("jmeno_poduloziste"),STGM_CREATE|STGM_READWRITE|STGM_SHARE_EXCLUSIVE,0,0,&pSubStg)

// a nynφ m∙₧ete pracovat s pod·lo₧iÜt∞m pSubStg.

Zφskßnφ existujφcφho:

// pStg je ukazatel na ·lo₧iÜt∞ (IStorage) zφskan² d°ive.

IStorage* pSubStg;

USES_CONVERSION;    // Vy₧adovßno makrem T2COLE

pStg->OpenStorage(T2COLE("jmeno_poduloziste"),NULL,STGM_READWRITE|STGM_SHARE_EXCLUSIVE,NULL,0,&pSubStg);

// a nynφ m∙₧ete pracovat s pod·lo₧iÜt∞m pSubStg.

ZjiÜtenφ obsahu ·lo₧iÜt∞:

ZjiÜt∞nφ obsahu ·lo₧iÜt∞ je trochu slo₧it∞jÜφ postup hlavn∞ dφky tomu, ₧e je t°eba uvolnit pam∞¥ se jmΘnem prvku v zφskanΘ struktu°e, kterß obsahuje informace o danΘm prvku. Tuto pam∞¥ musφte uvolnit pomocφ rozhranφ IMalloc. Dßle je uveden k≤d s popisem. (Bez kontroly chyb.)

// pStg je ukazatel na ·lo₧iÜt∞ (IStorage) zφskan² d°φve

IEnumSTATSTG *pEnum;

IMalloc* pMalloc;

STATSTG statstg;

:CoGetMalloc(MEMCTX_TASK,&pMalloc);    //Zφskßnφ rozhranφ IMalloc

pStrg->EnumElements(0,NULL,0,&pEnum);    //Zφskßnφ rozhranφ IEnumSTATSTG

while (pEnum->Next(1,&statstg,NULL)==NOERROR)    //ZjiÜt∞nφ informacφ o prvku

{

if (statstg.type==STGTY_STORAGE)

{

// Prvek je ·lo₧iÜt∞

// statstg.pwcsName je jeho jmΘno v Üirok²ch znacφch

// m∙₧ete jej pou₧φt pro otev°enφ pod·lo₧iÜt∞

}

else if (statstg.type==STGTY_STREAM)

{

// Prvek je proud

// statstg.pwcsName je jeho jmΘno v Üirok²ch znacφch

// m∙₧ete jej pou₧φt pro otev°enφ proudu

}

pMalloc->Free(statstg.pwcsName);    // Uvoln∞nφ pam∞ti jmΘna

// Je nutnΘ. Jinak dojde k ·niku pam∞ti.

}

pMalloc->Release();

Otev°enφ proudu:

Vytvo°enφ novΘho:

// pStg je ukazatel na ·lo₧iÜt∞ (IStorage) zφskan² d°φve

IStream* pStream;

USES_CONVERSION;    // Vy₧adovßno makrem T2COLE

pStg->CreateStream(T2COLE("jmeno_proudu"),STGM_CREATE | STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, 0, &pStream);

Otev°enφ existujφcφho:

// pStg je ukazatel na ·lo₧iÜt∞ (IStorage) zφskan² d°φve

IStream* pStream;

USES_CONVERSION;    // Vy₧adovßno makrem T2COLE

pStg->OpenStream(T2COLE("jmeno_proudu"), NULL,  STGM_READWRITE | STGM_SHARE_EXCLUSIVE, 0, &pStream);

DalÜφ funkce:

Jejich popis najdete v MSDN. Umo₧≥ujφ kopφrovnßnφ mezi ·lo₧iÜti, mazßnφ obsahu ·lo₧iÜt∞ a podobn∞.