Игры здесь
Суббота, 12.10.2024, 10:13



Приветствую Вас Гость | RSS
[ Главная ] [ COM: доступ к потоку ввода/вывода - Форум ] [ Регистрация ] [ Вход ]
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
COM: доступ к потоку ввода/вывода
DoubleVenomДата: Понедельник, 21.02.2011, 16:13 | Сообщение # 1
Рядовой
Группа: Администраторы
Сообщений: 12
Репутация: 0
Статус: Offline
Для доступа к потоку ввода/вывода используется интерефейс IStream.

IStreamPtr spStream;
::CreateStreamOnHGlobal(NULL, TRUE, &spStream); //create stream in global memory
if (spStream == NULL) return E_FAIL;


char* msg = "Hello world!";
ULONG bwritten;
spStream->Write(msg,strlen(msg)+1,&bwritten); //+1 means that we want to write terminating '0' too
LARGE_INTEGER d;
d.LowPart = 0;
d.HighPart = 0;
spStream->Seek(d,STREAM_SEEK_SET,NULL); //seek start

char buf[260];
spStream->Read(buf,260,&bwritten); //read from start

Более привычно можно работать так:

// test_xmlBom.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <iostream>
#include <strstream>
#include <unknwn.h>
using namespace std;

#import "some.tlb" no_namespace named_guids

//выводит все содержимое IStream в поток вывода
//считается что IStream - последовательный текстовый
//выводит не более max(int) символов, т.е. 4 миллиарда символов с лишним (multibyte)
void operator<<(ostream& out, IStreamPtr& in) {
//out<<"operator<< called"<<endl;

ULARGE_INTEGER end_d;
LARGE_INTEGER start_d;
start_d.LowPart = 0;
start_d.HighPart = 0;
in->Seek(start_d,STREAM_SEEK_CUR,&end_d); //to start
in->Seek(start_d,STREAM_SEEK_SET,NULL);

DWORD max_len;
max_len = end_d.LowPart - start_d.LowPart;

//cout<<"max_len= "<<max_len<<endl;

DWORD i = 0;
DWORD step = 255;//255;

char *buf = new char[step+1]; //step + 1
memset(buf,1,step);
buf[step] = 0; //put terminating null for our algorithm, now length is step
ULONG bytes = 1;
if(step>max_len)
{
in->Read(buf,max_len,&bytes);
buf[max_len] = 0;
out<<buf;
}
else //step< max_len
{
DWORD temp_end = max_len - max_len%step;
//out<<"temp_end = "<<temp_end<<endl;
for(i = 0;i<temp_end;i+= step) {
in->Read(buf,step,&bytes);
out<<buf;
}
//write tail
in->Read(buf,max_len - temp_end,&bytes);
buf[max_len - temp_end] = 0;
out<<buf;
}

delete[] buf;
}

template<class T>
void operator<<(IStreamPtr& out,T& arg) {
ostrstream ostr;
ostr<<arg<<ends;
ULONG bwritten;
out->Write(ostr.str(),strlen(ostr.str()),&bwritten);
}

int _tmain(int argc, _TCHAR* argv[])
{
CoInitialize(NULL);

IStreamPtr spStream;
::CreateStreamOnHGlobal(NULL, TRUE, &spStream);

ISpSome spSome(:CLSID_Some);
spSome.showInfo(spStream); //выводим какую-то информацию

cout<<spStream; //выводим информацию из потока spStream в cout, т.е. на экран

cin.get();

CoUninitialize();
return 0;
}

 
  • Страница 1 из 1
  • 1
Поиск:

Михаил, 2024      Создать бесплатный сайт с uCoz