Проблема с чтением потока (IStream->Read...)
От: p.glad Беларусь  
Дата: 03.07.06 10:42
Оценка:
Здравствуйте!
Вот надо из MS Word выудить текст. Экспериментирую.. Модифицировав один код хотел прочитать данные из потока. Но, толи с этим буффером потом делать что-то нужно, то что вообщем в буфере после этого содержится всякий мусор. Инфу в инете нахожу только на дельфе. Сам пишу на VC++ (Студия 2003 (Ver. 7.0))

начиная с "ls->OpenStream(stat.pwcsName, 0,STGM_READ|STGM_SHARE_EXCLUSIVE, 0, &IMyStream);"
и заканчивая delete []some_str; — этот кусок кода меня интересует. Я хотел получить текст, а получаю бред какой-то.

Помогите пожайлуста разобраться.

Заранее благодарю.

Вот код:

#include <windows.h>
#include <ole2.h>
#include <iostream.h>
#include <stdio.h>

int level=0;

walk(char *s, LPSTORAGE ls)
{
    OLECHAR FileName[256]; 
    LPENUMSTATSTG lpEnum=NULL;
    LPSTORAGE pIStorage=NULL, pIStorage2=NULL;
    IStream * IMyStream;
    ULONG uCount; 
    STATSTG stat; 
    int i;

    if (!ls) {
        mbstowcs(FileName, s, 256); 
        wprintf(L"[%s]\n", FileName);
        StgOpenStorage(FileName, NULL,
            STGM_READ|STGM_SHARE_EXCLUSIVE,
            NULL,0,&pIStorage);
        walk("", pIStorage);
    }
    else  {
        ls->EnumElements(0,NULL,0,&lpEnum);
        if (lpEnum)
            while (lpEnum->Next(1,&stat,&uCount)==S_OK) {
                for (i=0;i<level;i++) wprintf(L" ");
                wprintf(L"%d: %s\n", stat.type, (LPSTR)stat.pwcsName);
                if (stat.type == 2)
                {
                    ULONG ulBytesRead;
                    ls->OpenStream(stat.pwcsName, 0,STGM_READ|STGM_SHARE_EXCLUSIVE, 0, &IMyStream);
                    char *some_str = new char[stat.cbSize.QuadPart];
                    if (IMyStream->Read(some_str, stat.cbSize.QuadPart, &ulBytesRead )!=S_OK)
                    {
                        IMyStream->Release();

                    }
                    for (int i = 0; i<stat.cbSize.QuadPart; i++) 
                        printf("%c", some_str[i]);
                        printf("\n");
                    delete []some_str;
                } else
                if (stat.type==STGTY_STORAGE) {
                    ls->OpenStorage(stat.pwcsName, NULL,
                        STGM_READ|STGM_SHARE_EXCLUSIVE,
                        NULL, 0, &pIStorage2);
                    level++;
                    walk("", pIStorage2);
                    level--;
                }
            };
        ls->Release();
    }
}

int main(int argc, char* argv[]) {    
    if (argc>1) walk(argv[1],NULL);
}
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.