那位兄弟用过微软的IStorage接口,并用该接口读取过compound file format,能否给小弟一些指导,最好能够提供源码,先谢过了。

解决方案 »

  1.   

    StgOpenStorage 打开文件 返回IStorage接口
    然后IStorage就像目录,IStream就像文件,和操作目录一样操作
      

  2.   

    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;}