void SampleCreateDoc() { ::CoInitialize(NULL); // COM 初始化 // 假如是MFC程序,可以使用AfxOleInit()替代 HRESULT hr; // 函數執行返回值 IStorage *pStg = NULL; // 根存儲接口指針 IStorage *pSub = NULL; // 子存儲接口指針 IStream *pStm = NULL; // 流接口指針 hr = ::StgCreateDocfile( // 建立復合文件 L"c://a.stg", // 文件名稱 STGM_CREATE STGM_WRITE STGM_SHARE_EXCLUSIVE, // 打開方式 0, // 保留參數 &pStg); // 取得根存儲接口指針 ASSERT( SUCCEEDED(hr) ); // 為了突出重點,簡化程序結構,所以使用了斷言。 // 在實際的程序中則要使用條件判定和異常處理 hr = pStg->CreateStorage( // 建立子存儲 L"SubStg", // 子存儲名稱 STGM_CREATE STGM_WRITE STGM_SHARE_EXCLUSIVE, 0,0, &pSub); // 取得子存儲接口指針 ASSERT( SUCCEEDED(hr) ); hr = pSub->CreateStream( // 建立流 L"Stm", // 流名稱 STGM_CREATE STGM_WRITE STGM_SHARE_EXCLUSIVE, 0,0, &pStm); // 取得流接口指針 ASSERT( SUCCEEDED(hr) ); hr = pStm->Write( // 向流中寫入數據 "Hello", // 數據地址 5, // 字節長度(注重,沒有寫入字符串結尾的/0) NULL); // 不需要得到實際寫入的字節長度 ASSERT( SUCCEEDED(hr) ); if( pStm ) pStm->Release();// 釋放流指針 if( pSub ) pSub->Release();// 釋放子存儲指針 if( pStg ) pStg->Release();// 釋放根存儲指針 ::CoUninitialize() // COM 釋放 // 假如使用 AfxOleInit(),則不調用該函數 }
#include // ANSI、MBCS、UNICODE 轉換 void SampleEnum() { // 假設你已經做過 COM 初始化了 LPCTSTR lpFileName = _T( "c://a.stg" ); HRESULT hr; IStorage *pStg = NULL; USES_CONVERSION; // (注6) LPCOLESTR lpwFileName = T2COLE( lpFileName ); // 轉換T類型為寬字符 hr = ::StgIsStorageFile( lpwFileName ); // 是復合文件嗎? if( FAILED(hr) ) return; hr = ::StgOpenStorage( // 打開復合文件 lpwFileName, // 文件名稱 NULL, STGM_READ STGM_SHARE_DENY_WRITE, 0, 0, &pStg); // 得到根存儲接口指針 IEnumSTATSTG *pEnum=NULL; // 枚舉器 hr = pStg->EnumElements( 0, NULL, 0, &pEnum ); ASSERT( SUCCEEDED(hr) ); STATSTG statstg; while( NOERROR == pEnum->Next( 1, &statstg, NULL) ) { // statstg.type 保存著對象類型 STGTY_STREAM 或 STGTY_STORAGE // statstg.pwcsName 保存著對象名稱 // ...... 還有時間,長度等很多信息。請查看 MSDN ::CoTaskMemFree( statstg.pwcsName ); // 釋放名稱所使用的內存(注6) } if( pEnum ) pEnum->Release(); if( pStg ) pStg->Release(); }
新聞熱點
疑難解答