• 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 > 怎样将BSTR字符串转换为char数组

怎样将BSTR字符串转换为char数组

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

佚名通过本文主要向大家介绍了bstr转char,bstr char,bstr t char,c bstr 转char,bstr等相关知识,希望对您有所帮助,也希望大家支持linkedu.com www.linkedu.com
问题: 怎样将BSTR字符串转换为char数组
描述:

我在编写一个COM组件,组件内的方法原型如下:
STDMETHODIMP CFileTrans::UploadFile(BSTR FileIdentifier,int *result);
我想使用char数组作为文件名打开一个文件,使用TCP流套接字实施文件传输。请问:怎样将BSTR字符串转换为char数组?


解决方案1:

CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。 
char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR("数据");///使用前需要加上头文件comutil.h 
反之可以使用char *p=_com_util::ConvertBSTRToString(b); 

解决方案2:

STDMETHODIMP CFileTrans::UploadFile(BSTR FileIdentifier,int *result);
char cFileId[MAX_LEN];
wcstombs(cFileId, FileIdentifier, sizeof(cFileId))

解决方案3:

下面是最安全的!为了你的项目没有漏洞!
//------------------------//
// Convert char * to BSTR //转换后的BSTR用完后通过::SysFreeString();删除
//------------------------//
inline BSTR ConvertStringToBSTR(const char* pSrc)
{
    if(!pSrc) return NULL;
    DWORD cwch;
    BSTR wsOut(NULL);
    if(cwch = ::MultiByteToWideChar(CP_ACP, 0, pSrc, 
         -1, NULL, 0))//get size minus NULL terminator
    {
                cwch--;
            wsOut = ::SysAllocStringLen(NULL, cwch);
        if(wsOut)
        {
            if(!::MultiByteToWideChar(CP_ACP, 
                     0, pSrc, -1, wsOut, cwch))
            {
                if(ERROR_INSUFFICIENT_BUFFER == ::GetLastError())
                    return wsOut;
                ::SysFreeString(wsOut);//must clean up
                wsOut = NULL;
            }
        }
    };
    return wsOut;
};
//------------------------//
// Convert BSTR to char * //转换后的char*用完后通过delete []删除
//------------------------//
inline char* ConvertBSTRToString(BSTR pSrc)
{
    if(!pSrc) return NULL;
    //convert even embeded NULL
    DWORD cb,cwch = ::SysStringLen(pSrc);
    char *szOut = NULL;
    if(cb = ::WideCharToMultiByte(CP_ACP, 0, 
               pSrc, cwch + 1, NULL, 0, 0, 0))
    {
        szOut = new char[cb];
        if(szOut)
        {
            szOut[cb - 1]  = '\0';
            if(!::WideCharToMultiByte(CP_ACP, 0, 
                pSrc, cwch + 1, szOut, cb, 0, 0))
            {
                delete []szOut;//clean up if failed;
                szOut = NULL;
            }
        }
    }
    return szOut;
};
inline HRESULT BstrToString( const BSTR pString, char *pBuf, DWORD dwBufSize )
{
if ( NULL == pString )
{
return S_FALSE;
}
UINT nLen = SysStringLen( pString );
memset( pBuf, 0, dwBufSize );
if ( 0 == nLen )
{
return S_OK;
}
nLen *= sizeof( BSTR[1] );
if ( 0 == WideCharToMultiByte( CP_ACP, 0, pString,
nLen, pBuf, dwBufSize, NULL, NULL ) )
{
return S_FALSE;
}
return TRUE;
}

解决方案4:

(3) BSTR转换成char*
  方法一,使用ConvertBSTRToString。例如:
#include 
#pragma comment(lib, "comsupp.lib")
int _tmain(int argc, _TCHAR* argv[]){
BSTR bstrText = ::SysAllocString(L"Test");
char* lpszText2 = _com_util::ConvertBSTRToString(bstrText);
SysFreeString(bstrText); // 用完释放
delete[] lpszText2;
return 0;
}


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

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

  • CStringA转BSTR的问题
  • BSTR转换为Char的问题
  • 有段代码把BSTR字符串转换成char,看不太懂,请教达人
  • 在局部作用域中,将动态的char字符串转换成BSTR
  • 将BSTR类型的数据转换为char类型,数据丢失,请问改如何转换?
  • 关于BSTR和char数组类型是否相等
  • char转bstr问题。。。
  • 请教怎么将BSTR类型转为char
  • BSTR,VARIANT,char相互间如何转换?
  • 用什么方法将BSTR转化成char

相关文章

  • 2017-06-05 可不可以通过驱动程序的dll直接操作硬件?
  • 2017-06-04 VC++做的COM中,怎样实现一个事件啊?
  • 2017-06-05 怎么知道一个进程是否已经结束?
  • 2017-06-04 到哪里去查ActiveX控件的属性和方法呢?
  • 2017-06-04 CoCreateInstance和CoCreateInstanceEx的区别??
  • 2017-06-05 CCriticalSection的问题
  • 2017-06-05 求助:在哪里可以找到pageheap的使用说明呀
  • 2017-06-04 哪儿有socket5的RFC,有人知道吗,贴出来可以吗?谢谢。
  • 2017-06-05 应用程序调用dll,数据正常,但是出现堆栈错误!dll中没有人为控制堆栈!开发工具:VC6!
  • 2017-06-05 工程之间的问题?请帮我好吗?谢谢!

文章分类

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

最近更新的内容

    • 看看这个错误;ErrorrunningMIDLexe:2
    • CButtonSt类用SetBitmaps贴了图后怎么在上面输出文字啊
    • 本人写了一个测量程序。如何在运行时将程序的优先级从中变成实时?
    • 写了一个OCX控件,不过我不会调用啊,谁教教我
    • 如何设置richedit,当重新读取内容时候滚动条保持在原来位置
    • 如何取得ACTIVEX的模式(在设计模式还是在运行模式)的问题。
    • ATLCOMClass一问??谢谢
    • wce中的ATLActiveX问题?
    • ActiveX是否能嵌套ActiveX控件呢
    • 外方程序调用COM组件事件,事件未触发!!!请大侠急救~~~~~~

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

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