Поиск:

Ответ в темуСоздание новой темы Создание опроса
> создание потоков IStream 
V
    Опции темы
xvr
Дата 9.11.2010, 22:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(RastaDja @  9.11.2010,  16:04 Найти цитируемый пост)
спс, но програ вылетает на
Попробуйте подать последний параметр (не NULL). MSDN утверждает, что туда можно давать NULL, но кто его знает ...


PM MAIL   Вверх
RastaDja
Дата 10.11.2010, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



Код

IDispatch* pDisp = m_varMap[CComBSTR(it->first)].pdispVal;//получаем на обект ссылку из коллекции
CComPtr<IPersistStream> spPersistS;
hr = pDisp->QueryInterface(IID_IPersistStream, (void**)&spPersistS);//получаем PersistStream обьекта
if (SUCCEEDED(hr))
{
       CComPtr<IStream> pStream;  //сколько сюда памяти выделить и как правельно создать IStream
  CreateStreamOnHGlobal(NULL,TRUE,&pStream);
       spPersistS->Save(pStream, TRUE);
LARGE_INTEGER ld;
ld.QuadPart = 0;
pStream34->Seek(ld,STREAM_SEEK_SET,NULL);
  pStream->Seek(ld,STREAM_SEEK_SET,NULL);
  unsigned char b;
 // while(pStream->Read(&b,1,NULL)==S_OK)
 // {
 //    cout<<hex<<b;
 //  }
}


как мне эти данные прочитать, while делает бесконечный цикл. как правельно считать все данные? и как их последовательно записать в виде строки?

спасибо


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
xvr
Дата 10.11.2010, 16:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(RastaDja @  10.11.2010,  11:16 Найти цитируемый пост)
while делает бесконечный цикл.
Проверяйте 3й параметр метода pStream->Read (предварительно передав его, вместо NULL). Или извлеките handle куска памяти из pStream (GetHGlobalFromStream) и читайте напрямую


PM MAIL   Вверх
RastaDja
Дата 10.11.2010, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



решил таким кодом задачу, кажется работает, думаю проблема может возникнуть если обьект не реализует IPersistStrea::Stat.
и есчё посмотри - будет ли этот код дееспособен?
Код

CComPtr<IPersistStream> spPersistS;
                    hr = pDisp->QueryInterface(IID_IPersistStream, (void**)&spPersistS);
                    if (SUCCEEDED(hr))
                    {
                    
                    //    CComPtr<IStream> pStream34;
                        IStream* pStream34;
                        CreateStreamOnHGlobal(NULL,TRUE,&pStream34);
                        spPersistS->Save(pStream34, TRUE);
                        STATSTG stg;
                        //STATFLAG_DEFAULT
                        pStream34->Stat(&stg, STATFLAG_DEFAULT);
                        _ULARGE_INTEGER dlen = stg.cbSize; 
                        
                        LARGE_INTEGER ld;
                        ld.QuadPart = 0;
                        pStream34->Seek(ld,STREAM_SEEK_SET,NULL);
                        byte *data = new byte[dlen.QuadPart];
                        pStream34->Read((void*)data,dlen.QuadPart,NULL);
                                                
                        std::string s( reinterpret_cast< char const* >(data),dlen.QuadPart ) ;
                //        MessageBox(NULL,CComBSTR(s.c_str()),L"__-string fro byte[]-__",MB_OK);
                        pStream34->Release();
                        //--2




--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
xvr
Дата 10.11.2010, 17:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Работоспособен будет, но data надо в конце удалить (иначе будет утечка памяти). Еще возникают сомнения в читаемости строки s - spPersistS->Save не гарантирует, что сохраненные данные будут текстом, это могут быть и бинарные данные
Цитата(RastaDja @  10.11.2010,  17:02 Найти цитируемый пост)
IPersistStrea::Stat
Можно через 
pStream34->Seek(ld,STREAM_SEEK_END,&ld); - в ld получится размер


PM MAIL   Вверх
RastaDja
Дата 10.11.2010, 17:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



Цитата

 Еще возникают сомнения в читаемости строки s - spPersistS->Save не гарантирует, что сохраненные данные будут текстом

дело в том, что для меня не важно какие данные. надо считать поток и записать его как строку. и сохранить данную строку (например в файл или ноду XML). Ну а после соответственно возобновить поток из строки, и создать обьэкт

Добавлено через 8 минут и 58 секунд
Цитата

Можно через 
pStream34->Seek(ld,STREAM_SEEK_END,&ld); - в ld получится размер

а не надо после опять делать 
Код

pStream34->Seek(ld,STREAM_SEEK_SET,NULL);


З,Ы, просто я не очень разобрался есчё


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
RastaDja
Дата 10.11.2010, 17:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



всё разобраля smile ,
Большое спасибо, но тему не закрываю, ато не полностью разобрался с потоками.
есчё раз спасибо, до завтра


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
xvr
Дата 10.11.2010, 17:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(RastaDja @  10.11.2010,  17:20 Найти цитируемый пост)
сохранить данную строку (например в файл или ноду XML). 
Сделайте ее хекс дамп и сохраняйте. Иначе содержимое может визуально поломать текстовый формат xml. (Это только рекомендация)

PM MAIL   Вверх
RastaDja
Дата 11.11.2010, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



а ято такое хекс дамп, и как его сделать?

Добавлено через 33 секунды
а что такое хекс дамп, и как его сделать?


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
xvr
Дата 11.11.2010, 09:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(RastaDja @  11.11.2010,  09:20 Найти цитируемый пост)
а что такое хекс дамп,  
Печать бинарных данных в виде одной длинной шестнадцатиричной строки

Цитата

и как его сделать?

Вход - buf, size - бинарные данные и их размер, выход - строка с дампом
Код

string hex_dump(const void* buf, size_t size)
{
 char* out=new char[size*2+1];
 const unsigned char* p=(const unsigned char*)buf;
 for(size_t i=0;i<size;++i)
  sprintf(out+2*i,"%02X",p[i]);
 string rv(out);
 delete[] out;
 return rv;
}

PS. Счас апологеты 'чистоты С++' меня съедят с потрохами за использование sprintf с C++ программе  smile 

PM MAIL   Вверх
RastaDja
Дата 11.11.2010, 10:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



я тоже частенько sprintf использую

Добавлено через 13 минут и 7 секунд
спасибо, а можеш прокоментировать код? и обратную функцию написать?

типерь
Код

- <Msxml2.DOMDocument ID="xml">
- <![CDATA[ <a><s>Hello</s><s>Hello</s></a>

  ]]> 
  </Msxml2.DOMDocument>
- <Msxml2.DOMDocument ID="xml2">
- <![CDATA[ <root><wer>Text</wer><wer>Text</wer></root>

  ]]> 
  </Msxml2.DOMDocument>
  </root>


будет
Код

- <Msxml2.DOMDocument ID="xml">
- <![CDATA[ 3C613E3C733E48656C6C6F3C2F733E3C733E48656C6C6F3C2F733E3C2F613E0D0A
  ]]> 
  </Msxml2.DOMDocument>
- <Msxml2.DOMDocument ID="xml2">
- <![CDATA[ 3C726F6F743E3C7765723E546578743C2F7765723E3C7765723E546578743C2F7765723E3C2F726F6F743E0D0A
  ]]> 
  </Msxml2.DOMDocument>
  </root>



--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
xvr
Дата 11.11.2010, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(RastaDja @  11.11.2010,  10:05 Найти цитируемый пост)
спасибо, а можеш прокоментировать код?
А что там комментировать? Он и так простой как пять копеек  smile 
Цитата

 и обратную функцию написать?
Ну как то так:
Код

string unhex(const string& str)
{
 size_t total=str.size()/2;
 char* dst=new char[total];
 for(size_t i=0;i<total;++i)
  {
   char h[]={str[i*2],str[i*2+1],0};
   dst[i]=strtoul(h,0,16);
  }
 string rv(dst,total);
 delete[] dst;
 return rv;
}

Только надо помнить, что в возвращенном string'е лежат бинарные данные, и трактовать ее как текстовую строку нельзя (в частности .c_str() не будет строкой в С понимании)

PM MAIL   Вверх
RastaDja
Дата 11.11.2010, 17:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



спасибо, тут у меня есчё вопросы  smile 
есть код 
Код

IClassFactory* pCF;
IUnknown* pUnk;
IDispatch* pDisp;
CLSID clsid;
_bstr_t prog_id;
prog_id = stsave.c_str();
HRESULT hr=::CLSIDFromProgID(prog_id,&clsid);
hr = CoGetClassObject( clsid, CLSCTX_INPROC, NULL,IID_IClassFactory, (void**) &pCF );
hr = pCF->CreateInstance( NULL, IID_IUnknown, (void**) &pUnk );
pUnk->QueryInterface(IID_IDispatch, (void**)&pDisp);
IPersistStream* pPerStream;
if(SUCCEEDED(pDisp->QueryInterface(IID_IPersistStream, (void**)&pPerStream))){
    IStream* pStream;
    CreateStreamOnHGlobal(NULL,TRUE,&pStream);
    std::string st = _com_util::ConvertBSTRToString(bst_data);
    
    int len = st.length();
    byte *data = new byte[len];
    for(int i = 0; i<len; i++){
        data[i] = st[i];
    }
                    
    ULONG d;
    ULONG length = st.length();
    pStream->Write((void*)st.c_str(),length,&d);
    
    MessageBox(NULL, CComBSTR(data[0]), CComBSTR(st.c_str()), 1);
                    
    pPerStream->Load(pStream);
                    
    
    delete [] data;
//    delete pStream;
} //delete pPerStream;
//nodeCVDS->Add(CComBSTR("OBJECT"), pUnk);
nodeCVDS->m_varMap[bst_ID_str] = pDisp;
pCF->Release();

bst_data получаю так:
Код

CComBSTR bst_data;
Node->get_text(&bst_data);


имею исхлдный файл, из которого читаю
Код

<?xml version="1.0"?>
<root>

  ...

  
  <Msxml2.DOMDocument ID="xml"><![CDATA[<a><s>Hello</s><s>Hello</s></a>]]>
  </Msxml2.DOMDocument><Msxml2.DOMDocument ID="xml2">
    <![CDATA[<root><wer>Text</wer><wer>Text</wer></root>]]>
  </Msxml2.DOMDocument>
</root>

а на выход получаю 
Код

<?xml version="1.0"?>
<root>
  
...

  <Msxml2.DOMDocument ID="xml"><![CDATA[]]>
  </Msxml2.DOMDocument><Msxml2.DOMDocument ID="xml2">
    <![CDATA[]]>
  </Msxml2.DOMDocument>
</root>



как мне записать поток


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
xvr
Дата 11.11.2010, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Позовите pStream->Seek(0,SEEK_SET,NULL) перед pPerStream->Load(pStream);

PM MAIL   Вверх
RastaDja
Дата 12.11.2010, 09:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 337
Регистрация: 1.11.2010

Репутация: 1
Всего: 5



заработало, спасибо, а вы не подскажите какуюто литературу на русском по всем этим IPersist* IStream интерфейсам, ато везде всё на буржуйском


--------------------
The more closely you look at one thing, the less closely can you see something else.
PM MAIL   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0579 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.