• 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 > 为什么VB和C++Builder调VCATL写的ActiveX控件结果正确,而用VC调用结果却是错的呢?

为什么VB和C++Builder调VCATL写的ActiveX控件结果正确,而用VC调用结果却是错的呢?

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

佚名通过本文主要向大家介绍了为什么VB和C++Builder调VCATL写的ActiveX控件结果正确,而用VC调用结果却是错的呢?等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 为什么VB和C++ Builder调VC ATL写的ActiveX控件结果正确,而用VC调用结果却是错的呢?
描述:

我写的ActiveX控件ATest有一个如下方法:
STDMETHODIMP CATest::ShowStr(BSTR bstrStr)
{
_bstr_t bstr=bstrStr;
LPSTR str=(TCHAR*)bstr;
/*还用过
CComBSTR bstr=bstrStr;
CString str(bstr);
的方法*/
MessageBox(str);
}
VB调用如下:
ATest1.ShowStr "VB Test!"
弹出的MessageBox都很正常
C++ Bulider调用如下:
wchar_t* wstr=new wchar_t[30];
String str="C++ Bulider Test!";
str.WideChar(wstr,30);
ATest1->ShowStr(wstr);
弹出的MessageBox也很正常
VC调用如下:
//m_ATest定义:CATest m_ATest;
m_ATest.ShowStr(_bstr_t("VC Test!"));
/*还用过
CString str="VC Test!";
BSTR bstr=str.AllocSysString();
m_ATest.ShowStr(bstr);
的方法*/
可是弹出的MessageBox中都是只有第一个字母V


解决方案1:

告诉你原因:
因为组件不是在UNICODE下编译通过的,所以
LPSTR str=(TCHAR*)bstr;
的结果是声明了一个char*的指针指向一个
宽字节unsigned short *的指针。
str[0] = 'V'
str[1] = 0
所以messagebox调用后只看到了"V",
你后来的方法虽然使用了wchar_t bstr[30];
但是memcpy(bstr,"VC Test!",30);使得bstr里
实际存的是Ansi字符串。

解决方案2:


把“ _bstr_t bstr=bstrStr;
LPSTR str=(TCHAR*)bstr;
/*还用过
CComBSTR bstr=bstrStr;
CString str(bstr);
的方法*/
MessageBox(str);
”
改成: 
    CString strValue = bstrStr;
    MessageBox( NULL, strValue, "OK", MB_OK ); 
试试看。

解决方案3:

_com_util::ConvertBSTRToString(str)
用这个方法把BSTR转化过来

解决方案4:

On client side
IMyMessageBox* pMyMess;
OleInitialize(NULL);
CoCreateInstance(CLSID_MyMessageBox, NULL, CLSCTX_INPROC_SERVER , IID_IMyMessageBox, (void**)&pMyMess);
BSTR myMess = SysAllocString(L"hello world");
pMyMess->ShowMessage(myMess);
SysFreeString(myMess);
OleUninitialize();

解决方案5:

文件前面加上
#include <comutil.h>
#pragma comment(lib, "comsupp.lib")
STDMETHODIMP CATest::ShowStr(BSTR bstrStr)
{
MessageBox(_com_util::ConvertBSTRToString(str));
}


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

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

  • 为什么VB和C++Builder调VCATL写的ActiveX控件结果正确,而用VC调用结果却是错的呢?

相关文章

  • 2017-06-04 对面的大哥看过来,ActiveX控件的分发问题
  • 2017-06-04 珠海优特招聘
  • 2017-06-04 哪们高人翻译一下这个技术文档吧COMHOOK
  • 2017-06-04 com的接口函数怎么返回一个bool值(快没分只能给50了)
  • 2017-06-04 com学习新体会2
  • 2017-06-05 我用ATL做了一个COM进程外组件(EXE),在有VC编程环境的机器上可以注册在其他机器上则不可以,为什么?
  • 2017-06-05 interface函数签名之前的中括号,除了能写helpstring还能写什么?
  • 2017-06-04 菜鸟问题:sstab哪里能下到啊?
  • 2017-06-04 线程间传递接口问题
  • 2017-06-05 求分析关于WINDOWS的文件系统的操作的实现

文章分类

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

最近更新的内容

    • 用ATL写的一个客户端CSocket能接收到OnReceive事件吗?SOS!!!
    • 关于VisualC++Net中Com的聚合问题,高手请进,在线等待。
    • attribute编程问题,百思不得解
    • 关于制作病毒数据库的问题?
    • ActiveX中的IPersistStorage问题。
    • aboutdll'srebase
    • 300分求无窗口控件windowless怎么使用对话框??
    • hookAPI的问题~为什么就是钩不到?高手指点一下,错误到底在哪儿?钩send函数!谢谢
    • 丛哪儿可以查找类似这些函数_Application::GetWorkbooks();的帮助文件?
    • 我开了一个线程,在里面循环等待,但是CPU使用率却很高很高速度很慢为什么?如何解决?

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

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