IStream赋值

lemonash2007 2009-02-05 02:13:54
如何把一个字符串数组赋值给IStream?

char data[1000000];
fstream WaveFile1;
WaveFile1.open("C:\\test1.wav",ios::in|ios::out|ios::binary);
WaveFile1.read(data,1000000);
WaveFile1.close();

IStream *pStream;
HRESULT hr = CreateStreamOnHGlobal(NULL, TRUE, &pStream);

CComBSTR bstrStr(data);
if (0 != bstrStr.Length())
{
hr = bstrStr.WriteToStream(pStream);
}
...全文
282 22 打赏 收藏 转发到动态 举报
写回复
用AI写文章
22 条回复
切换为时间正序
请发表友善的回复…
发表回复
lemonash2007 2009-02-05
  • 打赏
  • 举报
回复
哦 不小心被我注释了 谢谢 谢谢大家 特别谢谢jameshooo负责任的态度

你们有谁做过ms speech吗 非常渴望向大家讨教
jameshooo 2009-02-05
  • 打赏
  • 举报
回复
你不是已经调用CreateStreamOnHGlobal了吗,这个就应该产生有效的IStream,检查一下创建成功没有。
lemonash2007 2009-02-05
  • 打赏
  • 举报
回复
oyljerry 点到核心啦 呵呵

我就是不会初始化IStream啊 该怎么初始化? 有没有CoCreateInstance()的方式?
  • 打赏
  • 举报
回复
pStream当然不能是空了
oyljerry 2009-02-05
  • 打赏
  • 举报
回复
IStream *pStream = NULL; 后面需要把pStream 初始化,不然直接访问write是会出错的
lemonash2007 2009-02-05
  • 打赏
  • 举报
回复
谢谢crybird

就是单步执行到hr = pStream->Write时 提示Unhandled exception in .exe:0xc0000005:Access Violation 过不去 hr肯定失败撒

是不是IStream *pStream = NULL; 空指针有问题?
  • 打赏
  • 举报
回复
size为实际大小,另外可以检验一下返回值,判断是否成功
  • 打赏
  • 举报
回复
CComBSTR bstrStr(data);
----------------------------
错的原因可能是你的数据里有0,数据会被截断

DWORD dwWrite;
pStream->Write(buffer,size,&dwWrite);
lemonash2007 2009-02-05
  • 打赏
  • 举报
回复
换成堆也一样, 单步执行到 hr = pStream->Write时 提示Unhandled exception in .exe:0xc0000005:Access Violation

oyljerry 你应该做过Speech吧?
oyljerry 2009-02-05
  • 打赏
  • 举报
回复
你栈上数据是不是太大了,换成堆试试, new char[1000000];
lemonash2007 2009-02-05
  • 打赏
  • 举报
回复
执行的时候发生错误:"0x00401a8b"指令引用的"0x00000000"内存。该内存不能为"read"。

我用1000000代替了filesize 不行吗?
jameshooo 2009-02-05
  • 打赏
  • 举报
回复
ULONG ulWrited = 0;
pStream->Write((const void*)data, filesize, &ulWrited);
jameshooo 2009-02-05
  • 打赏
  • 举报
回复
可以啊,读了多少就往IStream里Write多少
lemonash2007 2009-02-05
  • 打赏
  • 举报
回复
谢谢jameshooo 我读的方式是WaveFile1.open("C:\\test1.wav",ios::in|ios::out|ios::binary);

用Write方法该怎么用呢?pStream->Write();





也谢谢oyljerry 你应该做过speech吧 渴望和你交流
lemonash2007 2009-02-05
  • 打赏
  • 举报
回复
我想自己控制wav文件 每次读多少由我控制
jameshooo 2009-02-05
  • 打赏
  • 举报
回复
data里保存的是字符串还是二进制数据?两者处理方式是有区别的,如果是空结束的字符串,上面的处理没有问题,如果是二进制,则不能通过CComBSTR来转换,必须自己调用IStream::Write
oyljerry 2009-02-05
  • 打赏
  • 举报
回复
你SPBindToFile直接绑定wav文件,然后获得IStream的指针,这样不行?
lemonash2007 2009-02-05
  • 打赏
  • 举报
回复
我是在做ms speech没错
你抄的这段代码我也早看过

中国怎么就没几个认认真真做事的呢
oyljerry 2009-02-05
  • 打赏
  • 举报
回复
BOOL Speech::SpeakFromWave(LPCTSTR szWavePath)
{
CComPtr <ISpStream> cpWavStream;

//USES_CONVERSION;
//wcscpy( szwWavFileName, T2W( szAFileName ) );//从ANSI将WAV文件的名字转换成宽字符串

//使用sphelper.h 提供的这个函数打开 wav 文件,并得到一个 IStream 指针
HRESULT hr = SPBindToFile( szWavePath, SPFM_OPEN_READONLY, &cpWavStream );
if( SUCCEEDED( hr ) )
{
m_Speak->SpeakStream( cpWavStream, SPF_ASYNC, NULL );//播放WAV文件
}

return TRUE;
}
lemonash2007 2009-02-05
  • 打赏
  • 举报
回复
我认为是不行的 对了怎么测试pStream是否成功了呢?
加载更多回复(2)

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧