• 全部
  • VC综合技术
  • 互联网技术
  • MFC AppLauncher
  • .NET 技术
  • 界面
  • 进程
  • 算法
  • 硬件/系统
  • 数据库
  • VC++技术资源

用char数组能不能生成BSTR类型的字符串?

gstone 2002-05-09 03:56:51
如果能,应该怎么写?
谢谢!
...全文
115 点赞 收藏 9
写回复
9 条回复
切换为时间正序
当前发帖距今超过3年,不再开放新的回复
发表回复
tpProgramer 2002-05-09
如果不想使用 ATL 或者 MFC 类(当然,这样代码会更小,加载也更快):
转化如下,下面是一个完整的接口实现,功能是将传入的小写字母转化为大写,只是为了体现教学目的,所以没有加入检错语句:

STDMETHODIMP CCStr::Upper(BSTR inStr ,BSTR *outStr)
{
/*
说 明:
com接口传入的参数除了基本的非指针类型(如ing ,long ,bool等),其余的都要使用com特定的类型 --
对于字符串,应该使用BSTR类型,这种类型是一种模糊类型,微软并没有公开内部结构,所有必须使用支持的API去操纵它

相关类型转换:
从BSTR字符串转换到Unicode字符串(例如LPOLESTR)不是必须的,即不需要转换,可以当作一个Unicode字符串使用
从Unicode字符串转换到BSTR字符串必须经过相应的API函数 SysAllocString。
从标准C的字符串转换到Unicode字符串需要使用MultiByteToWideChar函数。
从Unicode字符串转换到标准C的字符串需要使用WideCharToMultiByte函数。

总结:由此可见,使用Unicode字符串当作中介,则可以在标准C的字符串和BSTR字符串之间相互转换!

函数流程:
将传入的字符串 inStr通过转换函数转换成相应的标准C字符串 szInStr,通过标准C的大写转换函数将szInStr转换成大写。
将szInStr通过转换函数转换成BSTR字符串 outStr,作为返回值输出
*/
//得到字符串的长度
//
long nLen = WideCharToMultiByte( CP_ACP, 0, inStr, -1, NULL, NULL, NULL , NULL);
char * szInStr = new char[nLen];

//从 Unicode字符串 转换成 C标准字符串
//
WideCharToMultiByte( CP_ACP , 0, inStr, -1, szInStr , nLen, NULL ,NULL);
szInStr = strupr(szInStr);

MessageBox(NULL,szInStr,"",MB_OK);


//处理多字符集的最安全的函数是 lstrlen(而不是strlen)
//
nLen = lstrlen(szInStr) + 1; //加 1 的原因是要加上2个结尾为NULL的字符(下一步将乘2使之加倍)
int nAlloc = 2 * nLen;

//分配空间给 Unicode字符串
//
LPOLESTR szNewOleString;
szNewOleString = (OLECHAR *)new wchar_t[nAlloc];

//转换 C标准字符串到 Unicode 字符串
//
MultiByteToWideChar(CP_ACP , 0, szInStr, -1, szNewOleString ,nLen); //注意这里是nLen,而不是nAlloc!!

//从 Unicode字符串 转换到 BSTR字符串
BSTR bstrTemp;
bstrTemp = SysAllocString( szNewOleString);
*outStr = bstrTemp;

return S_OK;
}



回复
tpProgramer 2002-05-09
关于CComBSTR类的简介:
1。类中含有m_bstr的公共成员变量,该变量使一个包含BSTR的地址。如果想拷贝它,使用CComBSTR::Copy,
2。如果想取出BSTR,则使用CComBSTR::Detach,因为Detach把m_bstr设置为空,在你调用它之后不能再使用CComBSTR对象。
例如(接着我上面的例子往下写):
BSTR bstrString2;
bstrString2 = bstrString.Detach();

如果你使用MFC,则因为 MFC类 _bstr_t提供了更高的函数化程度,要用_bstr_t类代替CComBSTR,
char szTalbeName[] ="Table_Student";
_bstr_t bstrTableName = _bstr_t("Select * from ") + _bstr_t(szTableName);

怎么样,也很简单吧?
回复
huqiming 2002-05-09
MultiByteToWideChar

或者用上面的办法
回复
oracle3 2002-05-09
char *pchar;
BSTR pbstr;
pchar=(char *)_bstr_t(pbstr);
pbstr=_bstr_t(pchar);
回复
gstone 2002-05-09
Thank you!!!
回复
jaidy 2002-05-09
AllocSysString() is OK
回复
tpProgramer 2002-05-09
本来使比较麻烦的,我一般只告诉简单的方法:
再ATL中,如果你使用类 CComBSTR,该转换将大大简化,该类将封装转换行为,例如,如下简单代码将标准C字符串转换为一个BSTR:
//Convert from char * to BSTR
//
char szStdString[] =" This is a string !";
CComBSTR bstrString(szStdString);
回复
yu_hl 2002-05-09
char buf[..];
CString str = buf;
BSTR bstr = str.AllocSysString();
回复
不解 2002-05-09
char to olechar
sysAllocString(olechar)
回复
相关推荐
发帖
VC/MFC
创建于2007-09-28

1.5w+

社区成员

VC/MFC相关问题讨论
申请成为版主
帖子事件
创建了帖子
2002-05-09 03:56
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……