Как привести указатель блока памяти к потоку STD - PullRequest
0 голосов
/ 18 мая 2010

Я запрограммировал приложение на Windows XP и Visual Studio с языком c ++.

В этом приложении я использовал API LoadResource (), чтобы загрузить ресурс для передачи файла в память ресурса.

Он вернул указатель блока памяти, и я хочу привести указатель к потоку std, чтобы использовать его для совместимости.

Может ли кто-нибудь мне помочь?

Ответы [ 3 ]

2 голосов
/ 18 мая 2010

Вы не можете привести ресурс к типу потока. Либо вы копируете байты:

std::stringstream ss;
ss.rdbuf().sputn(buf, len);

или вы оборачиваете свой ресурс в свой потоковый поток:

class resourcebuf : public std::streambuf {
   // Todo: implement members including at least xsgetn, uflow and underflow
};

и передайте его istream::istream

1 голос
/ 18 мая 2010

Зачем вам это нужно?

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

Если вы хотите работать с необработанной памятью, работайте с ней. Кастинг здесь (совместимость?) Кажется очень странным подходом.

Тем не менее, если вы хотите сделать это, вы можете создать некоторый поток из вашего блока памяти, который обрабатывает его как последовательность байтов. В данном случае это означает использование std::stringstream (istringstream).

После того, как вы заблокируете свой ресурс с помощью LockResource, создайте строку из полученного указателя void* и передайте ее в свой экземпляр stringstream.

void* memory = LockResource(...);
// You would probably want to use SizeofResource() here
size_t memory_size = ... ;
std::string casted_memory(static_cast<char*>(memory), memory_size);
std::istringstream stream(casted_memory);
0 голосов
/ 18 мая 2010

Самый простой способ - это, вероятно, преобразовать буфер в string, а затем stringstream:

std::stringstream ss(std::string(buf,len));

Я думаю, что это скопирует его дважды, поэтому, если это займет много времени, вам, возможно, придется искать альтернативы. Вы можете использовать strstream, но это может испугать квадраты.

...