• 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 > COM中BSTR类型的数据传递问题?

COM中BSTR类型的数据传递问题?

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

佚名通过本文主要向大家介绍了bstr数据类型,bstr类型,bstr是什么类型,bstr,bstr t等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: COM中BSTR类型的数据传递问题?
描述:

我在COM中从客户端往服务端传递结构体数据,服务端接收到后,用结构体指针强制转换时得到的Name为乱码。结构体为:
typedef struct POI_Data_Struct
{ 
    double Pointx; 
    double Pointy; 
    BSTR Name;
}POI_Data_Struct;
BSTR类型用在结构体中不合适,但是如果是不定长的Name,我该用什么数据类型?char可以用,但是等指定长度。
如果可以用BSTR,该怎么解决乱码的问题?
客户端:
POI_Data_Struct bs;
bs.Pointx=100.1;
bs.Pointy=100.2;
bs.Name=_T("zhangzhi");
BSTR bstr1 = ::SysAllocStringByteLen((char*)&bs, (UINT)sizeof(bs)); 
 long   index;    
 index=0;   
 BSTR   bstr=bstr1;
 hr=SafeArrayPutElement(pSa,&index,bstr);  
  POI_Data_Struct *p=(POI_Data_Struct*)bstr;//此时p->Name能正确显示出“zhangzhi”
服务端:
  long j;
  j=0;
  BSTR bstr1; 
  ::SafeArrayGetElement(p1,&j,&bstr1);
  POI_Data_Struct *ps=(POI_Data_Struct*)bstr1;
  ::MessageBox(NULL,ps->Name, _T("SafeArray Value1:"), MB_OK);
//此时ps->Name显示为乱码
请各位指教。谢谢!


解决方案1:

我觉得你可以用 VARIANT 类型, VARIANT Name, 祝你好运

解决方案2:

POI_Data_Struct bs;
bs.Pointx=100.1;
bs.Pointy=100.2;
bs.Name=_T("zhangzhi");     这里不对,需要申请用SysAllocStringByteLen

解决方案3:

这样定义结构:
typedef struct POI_Data_Struct
{
  double Pointx;
  double Pointy;
  CHAR Name[]; // 这个是可变长的,但是不是指针
}POI_Data_Struct;
但是不能直接申请结构变量,比如POI_Data_Struct pd;就是错误的,应该申请一段所需的内存,然后强制转换成此结构:
BYTE* pBuf = new BYTE[sizeof(POI_Data_Struct) + strlen(str) + 1];
POI_Data_Struct* pData = (POI_Data_Struct*)pBuf;
strcpy(pData->Name, str);
pData->Pointx = 10;
pData->Pointy = 20;
BSTR bstr1 = ::SysAllocStringByteLen((char*)pBuf, (UINT)sizeof(POI_Data_Struct) + strlen(str) + 1);
delete[] pBuf;

解决方案4:

BSTR相当于一个指针,SafeArrayPutElement的封装只是把地址封装进去了,这样定义你的数据结构:
typedef struct POI_Data_Struct
{
    double Pointx;
    double Pointy;
    OLECHAR Name[256];
}POI_Data_Struct; 

解决方案5:

_T("zhangzhi"); //对于_T这个宏,只有字符集使用 Unicode的时候才是宽字符串。
客户端、服务端都用 Unicode字符集。
结构里使用BSTR是可以的,也可以用LPWSTR。 并不需要指定长度。


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

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

  • 如何将BSTR转化为LPCSTR类型。。急等。。谢谢
  • 得到_bstr_t类型的字符串请问如何取出其中的一段子字符串啊
  • VC中BSTR类型参数在PB中调用的问题
  • BSTR类型转换不成功,仍然是乱码
  • BSTR与_bstr_t转换类型与类如何可以转换
  • 如何提取_bstr_t里的数据?
  • BSTR到SafeArray怎么类型转换
  • bstr类型引发的困惑,求助
  • _bstr_t类型抛异常
  • _bstr_t类型的字符串存储的是个小数怎么控制小数的精度

相关文章

  • 2017-06-04 对我说比较难的问题,详情请进!
  • 2017-06-05 怎样在动态win32dll中调用activeX控件的功能?
  • 2017-06-04 BHO插件能获取网页播放器的播放信息吗
  • 2017-06-04 请问OpenCV2中把轮廓作为输入,怎么检测轮廓的角点以及个数
  • 2017-06-04 关于开发后ocx控件的反注册问题。
  • 2017-06-05 API获取打印机注册表路径
  • 2017-06-04 在ActiveX中使用DDraw时遇到的问题
  • 2017-06-05 CloseHandle()问题?
  • 2017-06-04 请教msmq的使用
  • 2017-06-05 请教一下关于vc设置internet选项的问题

文章分类

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

最近更新的内容

    • 在win2000,xp中,使用VC,怎样才能判断当前登陆的用户有没有Administrator权限?急!!!各位大侠帮忙!!!
    • 熟悉ActiveX的快来看看啊!
    • COM/COM+技术交流QQ群:20503168
    • 送分啊vc7下的一个alt的进程间的comsample
    • 使用VS2010关于TeeChart控件创建问题
    • 怎样保证只连一次数据库就让多个线程都能对数据库操作?
    • 谁有《ATL开发指南》第二版源代码?
    • ActiveX组件有必要学吗?
    • 关于在子线程中创建对话框的问题。
    • MFCACTIVEX中可以使用相对路径来找文件吗?

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

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