Проблема с чтением потока (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);
}
Re: Проблема с чтением потока (IStream->Read...)
От: NightBlade Россия  
Дата: 03.07.06 11:25
Оценка:
PG>Вот надо из MS Word выудить текст. Экспериментирую.. Модифицировав один код хотел прочитать данные из потока. Но, толи с этим буффером потом делать что-то нужно, то что вообщем в буфере после этого содержится всякий мусор. Инфу в инете нахожу только на дельфе. Сам пишу на VC++ (Студия 2003 (Ver. 7.0))

а там потоков много разных, а текст хранится только в одном вперемешку с форматированием и другой служебной информацией
Все вопросы на nightblade@inbox.ru
Re[2]: Проблема с чтением потока (IStream->Read...)
От: p.glad Беларусь  
Дата: 03.07.06 12:04
Оценка:
Здравствуйте, NightBlade, Вы писали:

PG>>Вот надо из MS Word выудить текст. Экспериментирую.. Модифицировав один код хотел прочитать данные из потока. Но, толи с этим буффером потом делать что-то нужно, то что вообщем в буфере после этого содержится всякий мусор. Инфу в инете нахожу только на дельфе. Сам пишу на VC++ (Студия 2003 (Ver. 7.0))


NB>а там потоков много разных, а текст хранится только в одном вперемешку с форматированием и другой служебной информацией


Что же делать ? Неужели придется заниматься низкоуровневым парсингом файла ?
Re[3]: Проблема с чтением потока (IStream->Read...)
От: Cyberax Марс  
Дата: 04.07.06 08:55
Оценка:
p.glad wrote:
> NB>а там потоков много разных, а текст хранится только в одном
> вперемешку с форматированием и другой служебной информацией
> Что же делать ? Неужели придется заниматься низкоуровневым парсингом
> файла ?
Используй объектную модель MS Office'а (у тебя и так Винда). Если не
подходит, то можно взять Apache POI (но он на Java).
Posted via RSDN NNTP Server 2.0
Sapienti sat!
Re: Проблема с чтением потока (IStream->Read...)
От: Константин Л.  
Дата: 04.07.06 09:10
Оценка:
Здравствуйте, p.glad, Вы писали:

В чем проблема? Через Word::Document можно получить текст документа
Re[2]: Проблема с чтением потока (IStream->Read...)
От: p.glad Беларусь  
Дата: 04.07.06 22:04
Оценка:
Здравствуйте, Константин Л., Вы писали:

КЛ>Здравствуйте, p.glad, Вы писали:


КЛ>В чем проблема? Через Word::Document можно получить текст документа


Не представляю что за такой namespace Word, но мне нужно сделать это именно через работу со Storage(хранилище). Это не моя прихоть, просто я выполняю тестовое задание и столкнулся с такой вот траблой.
Re[3]: Проблема с чтением потока (IStream->Read...)
От: Константин Л.  
Дата: 06.07.06 16:53
Оценка:
Здравствуйте, p.glad, Вы писали:

PG>Здравствуйте, Константин Л., Вы писали:


КЛ>>Здравствуйте, p.glad, Вы писали:


КЛ>>В чем проблема? Через Word::Document можно получить текст документа


PG>Не представляю что за такой namespace Word, но мне нужно сделать это именно через работу со Storage(хранилище). Это не моя прихоть, просто я выполняю тестовое задание и столкнулся с такой вот траблой.


появляется при использовании директивы #import и берется из названия type library
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.