• linkedu视频
  • 平面设计
  • 电脑入门
  • 操作系统
  • 办公应用
  • 电脑硬件
  • 动画设计
  • 3D设计
  • 网页设计
  • CAD设计
  • 影音处理
  • 数据库
  • 程序设计
  • 认证考试
  • 信息管理
  • 信息安全
菜单
linkedu.com
  • 网页制作
  • 数据库
  • 程序设计
  • 操作系统
  • CMS教程
  • 游戏攻略
  • 脚本语言
  • 平面设计
  • 软件教程
  • 网络安全
  • 电脑知识
  • 服务器
  • 视频教程
  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号
您的位置:首页 > 程序设计 >vc/mfc > 继续请教CString类型与IStream类型的buffer数据怎莫来回转化?fuzbfufu帮忙再看一下

继续请教CString类型与IStream类型的buffer数据怎莫来回转化?fuzbfufu帮忙再看一下

作者:佚名 字体:[增加 减小] 来源:互联网 时间:2017-06-04

佚名通过本文主要向大家介绍了继续请教CString类型与IStream类型的buffer数据怎莫来回转化?fuzbfufu帮忙再看一下等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 继续请教CString类型与IStream类型的buffer数据怎莫来回转化?fuzbfufu帮忙再看一下
描述:

下边是一个显示jpeg图的函数,buf是jpeg图的数据,nLength是数据长度.现RES=pStm->Write(buf,BUFFER_SIZE,&cbWritten);时res总为0,说明buf没有写进pStm中去.请高手帮忙看一下怎没回事.谢谢
void CTestJJDlg::DisplayJpeg(char* buf,int nLength)
{
CString m_Path;
CFile m_file;
IStream *pStm;  
CFileStatus fstatus;  
CDC* pDC=this->GetDC();
HRESULT RES;
int BUFFER_SIZE=nLength;//sizeof(buf);
HGLOBAL hMem = GlobalAlloc(GMEM_FIXED, BUFFER_SIZE);
if (hMem == NULL) return;
CreateStreamOnHGlobal(hMem , FALSE, &pStm );
if (pStm == NULL) 
{
GlobalFree(hMem );
return;
}
// CString ---> IStream 
ULONG cbWritten;
RES=pStm->Write(buf,BUFFER_SIZE,&cbWritten);//str.GetLength()pBuffer
IPicture *pPic;
if(SUCCEEDED(OleLoadPicture(pStm,BUFFER_SIZE,TRUE,IID_IPicture,(LPVOID*)&pPic)))
{ 
OLE_XSIZE_HIMETRIC hmWidth;  
OLE_YSIZE_HIMETRIC hmHeight;  
pPic->get_Width(&hmWidth);  
pPic->get_Height(&hmHeight);  
double fX,fY;  
fX = (double)pDC->GetDeviceCaps(HORZRES)*(double)hmWidth/((double)pDC->GetDeviceCaps(HORZSIZE)*100.0);  
fY = (double)pDC->GetDeviceCaps(VERTRES)*(double)hmHeight/((double)pDC->GetDeviceCaps(VERTSIZE)*100.0);  
if(FAILED(pPic->Render(*pDC,65,40,(DWORD)fX,(DWORD)fY,0,hmHeight,hmWidth,-hmHeight,NULL)))  
AfxMessageBox("图像失败!");  
pPic->Release();  
}  
else  
AfxMessageBox("装载图像失败!");  
}


解决方案1:

嗷,这几天有点事,来迟了,对tianya320 () 说:
RES=pStm->Write(buf,BUFFER_SIZE,&cbWritten);时res总为0,说明buf没有写进pStm中去?
Write()方法返回类型是HRESULT,返回0就是S_OK,说明write()本身调用是成功的
你之所以不成功,是因为 if(SUCCEEDED(OleLoadPicture(pStm,BUFFER_SIZE,TRUE,IID_IPicture,(LPVOID*)&pPic)))这个函数(OleLoadPicture)调用失败,
你可能在上一篇帖子中忘记了一个关键的函数seek(),你可以再看一下我将// IStream -->CString 段代码(http://community.csdn.net/Expert/topic/3835/3835774.xml?temp=.2909357)中有一段
          ULARGE_INTEGER    pSeek;
 LARGE_INTEGER  dlibMove ={ 0 } ;
 pStream->Seek(dlibMove,STREAM_SEEK_SET ,&pSeek);
所以这里OleLoadPicture()会失败,是因为在你RES=pStm->Write(buf,BUFFER_SIZE,&cbWritten);//str.GetLength()pBuffer之后,stream的指针也指到stream的末尾了,如果你要读stream的内容,需要把stream的指针
重置到头部,所以你只要在Write()之后、OleLoadPicture()之前加上上面3行代码,就ok了

解决方案2:

你分配内存之后直接用GlobalLock和memcpy往里面写
Write可能需要超出指定大小的内存空间,而你又禁止了重新分配内存。

解决方案3:

void writecstring(CString s,IStream* ps)
{
CComBSTR cbs((LPCSTR)s);
cbs.WriteToStream(ps);
}
CString readcstring(IStream* ps)
{
CComBSTR cbs;
cbs.ReadFromStream(ps);
return (LPCSTR)(_bstr_t(cbs.Detach( ),false));
}


分享到:QQ空间新浪微博腾讯微博微信百度贴吧QQ好友复制网址打印

您可能想查找下面的文章:

相关文章

  • 2017-06-04 请问怎么把_variant_t转换为_RecordsetPtr
  • 2017-06-05 关于线程AfxBeginThread的结束问题?
  • 2017-06-04 搞难度问题,如何在打开MSWORD文档时,之对文档中的部分内容有编辑权限例如表格中可以编辑,其他位置不允许
  • 2017-06-05 两个窗口之间相互调用数据问题!在线等!50分求!
  • 2017-06-04 如何取得ole剪贴板中的数据对象中的数据?
  • 2017-06-04 怎么样用VC实现客户机运行服务器上的程序?
  • 2017-06-04 急:怎么在C#中引用ActiveX控件?在线等待!
  • 2017-06-05 怎样等待线程结束?
  • 2017-06-04 IHTMLStyle指针怎么才能删除某属性?
  • 2017-06-04 可否通过调用COM中的一个接口函数实现启动另一个应用程序的目的吗?

文章分类

  • JavaScript
  • ASP.NET
  • PHP
  • 正则表达式
  • AJAX
  • JSP
  • ASP
  • Flex
  • XML
  • 编程技巧
  • Android
  • swift
  • C#教程
  • vb
  • vb.net
  • C语言
  • Java
  • Delphi
  • 易语言
  • vc/mfc
  • 嵌入式开发
  • 游戏开发
  • ios
  • 编程问答
  • 汇编语言
  • 微信小程序
  • 数据结构
  • OpenGL
  • 架构设计
  • qt
  • 微信公众号

最近更新的内容

    • DLL中的回调函数,为什么用显式调用时会出错
    • 关于多线程使用IWebBrowser2的问题
    • 这个问题没人能解决么?(版主能不能帮帮忙?)
    • 最近我做一个DCOM组件,关于系统配置问题。参与有分
    • 马上给分!如何VC6中插入Flash?
    • 怎么从一个线程模块知道执行的exe名
    • 如何用wininet得到当前页面的验证码图片
    • 如何在UDP通讯中传递对象?
    • 如何在WindowsNT/2000下,枚举一个进程的所有线程IDThreadID
    • active控件

关于我们 - 联系我们 - 免责声明 - 网站地图

©2020-2025 All Rights Reserved. linkedu.com 版权所有