描述:
那位兄弟用过微软的IStorage接口,并用该接口读取过compound file format,能否给小弟一些指导,最好能够提供源码,先谢过了。
解决方案1:
StgOpenStorage 打开文件 返回IStorage接口
然后IStorage就像目录,IStream就像文件,和操作目录一样操作
void CCompDocDlg::OnWriteCompDoc()
{
// TODO: Add your control notification handler code here
UpdateData(true);
m_nLevel = 0;
LPSTORAGE pStgRoot = NULL;
m_szCompFile = "d:\\comp.dem";
m_szDir = "d:\\code\\";
// CLSID clsid;
// ::CLSIDFromProgID(OLESTR("ATLTest.TextObject"), &clsid);
OLECHAR dir[MAX_PATH * 2];
mbstowcs(dir, m_szCompFile, m_szCompFile.GetLength()+1);
if (FAILED(::StgCreateDocfile(dir,
STGM_READWRITE | STGM_SHARE_EXCLUSIVE | STGM_CREATE,
0,
&pStgRoot)))
{
MessageBox("create docfile failed!");
return;
}
ReadDirectory(m_szDir, pStgRoot);
pStgRoot->Release();
MessageBox("create docfile complete!");
return;
// HMODULE hDllModule = ::LoadLibrary(_T("C:\\Program Files\\Microsoft Visual Studio\\MyProjects"
// "\\persist01\\Debug\\persist01.dll"));
//
// int (_stdcall *pRegSvr)() = ::GetProcAddress(hDllModule, _T("DllRegisterServer"));
// HRESULT hr = pRegSvr();
}
VOID CCompDocDlg::ReadDirectory(const char* szDir, IStorage *pStgRoot)
{
m_nLevel++;
char szNewPath[MAX_PATH];
strcpy(szNewPath, szDir);
strcat(szNewPath, "*.*");
WIN32_FIND_DATA FindData;
HANDLE h = ::FindFirstFile(szNewPath, &FindData);
if (h == INVALID_HANDLE_VALUE)
{
return;
}
char *ptest = FindData.cFileName;
OLECHAR wcsStorageName[MAX_PATH * 2]; // subStorageName
OLECHAR wcsStreamName[MAX_PATH * 2]; // stream name
char szData[512]; // file content
do
{
// unknown!!!
if (!strcmp(FindData.cFileName, "..")
|| !strcmp(FindData.cFileName, "."))
{
continue;
}
// unknown!!!
char *pch = NULL;
while ((pch = strchr(FindData.cFileName, '!')) != NULL)
{
MessageBox(FindData.cFileName);
*pch = '|';
}
if (FindData.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY)
{
strcpy(szNewPath, szDir);
strcat(szNewPath, FindData.cFileName);
strcat(szNewPath, "\\");
mbstowcs(wcsStorageName, FindData.cFileName, 32);
wcsStorageName[32] = L'\0';
// why?
TRACE("%d -- sStorage = %s\n", (m_nLevel - 1) * 4, wcsStorageName);
IStorage *pSubStg = NULL;
pStgRoot->CreateStorage(wcsStorageName,
STGM_CREATE | STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
0,
0,
&pSubStg
);
if (pSubStg == NULL)
{
return;
}
ReadDirectory(szNewPath, pSubStg);
pSubStg->Release();
}
else
{
if ((pch = strrchr(FindData.cFileName, '.')) != NULL)
{
if (!stricmp(pch, ".txt")
|| !stricmp(pch, ".c")
|| !stricmp(pch, ".h")
|| !stricmp(pch, ".cpp")
)
{
mbstowcs(wcsStreamName, FindData.cFileName, 32);
wcsStreamName[32] = L'\0';
strcpy(szNewPath, szDir);
strcat(szNewPath, FindData.cFileName);
CStdioFile file(szNewPath, CFile::modeRead);
if (file.ReadString(szData, 511))
{
IStream *pStream = NULL;
pStgRoot->CreateStream(wcsStreamName,
STGM_CREATE | STGM_READWRITE | STGM_SHARE_EXCLUSIVE,
0,
0,
&pStream
);
if (pStream == NULL)
{
return;
}
pStream->Write(szData, 511, NULL);
pStream->Release();
}
}
}
}
} while(::FindNextFile(h, &FindData));
m_nLevel--;
return;
}
您可能想查找下面的文章:
- 求助:如何使用ISTORAGE接口把文件拷贝到光盘中啊?
- IStorage读取文件时占用内存的问题
- 在对IStorage读文件的过程中,为什么要调用CoTaskMemFree去释放每一个节点呢?
- IStorage->OpenStorage总是返回拒绝访问的问题
- 既然IPropertySetStorage也是读写一个复合文档,为什么不使用IStorage
- 向已存在的IStorage添加IStream覆盖之前内容?结构化存储,复合文件
- IPersistStorage保存到IStorage的问题
- 已知条件:IStorage,求:其内的IStream
- 有没有现成的IStorage的实现??
- 急急的请教高手一个关于IStorage的问题!