高手们站出来给个数据类型如wchar等互转换的完整版如何,很见功力啊

xiguazi 2003-02-21 09:31:36
请拉
...全文
45 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
ruihuahan 2003-02-26
  • 打赏
  • 举报
回复
对。ATL的数据转换宏很好用的。但要注意首先使用USES_CONVERSION
laohenry 2003-02-26
  • 打赏
  • 举报
回复
呵呵。。共享。

STDAPI_(LPWSTR) ConvertToLPWSTR(LPCSTR pszString)
{
LPWSTR pwsz;
UINT cblen;

CHECK_NULL_RETURN(pszString, NULL);
cblen = lstrlen(pszString);

if ((pwsz = (LPWSTR)MemAlloc((cblen+1)*sizeof(WCHAR))) &&
(0 == MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, pszString, cblen, pwsz, cblen + 1)))
{
MemFree(pwsz); pwsz = NULL;
}

return pwsz;
}

STDAPI_(BSTR) ConvertToBSTR(LPCSTR pszString)
{
BSTR bstr = NULL;
LPWSTR pwsz;

if (pwsz = ConvertToLPWSTR(pszString))
{
bstr = SysAllocString(pwsz);
MemFree(pwsz);
}

return bstr;
}

STDAPI_(LPSTR) ConvertToANSI(LPCWSTR pwszString)
{
LPSTR psz;
UINT cblen;

CHECK_NULL_RETURN(pwszString, NULL);
cblen = WideCharToMultiByte(CP_ACP, 0, pwszString, -1, NULL, 0, NULL, NULL);

if ((psz = (LPSTR)MemAlloc(cblen + 1)) &&
(0 == WideCharToMultiByte(CP_ACP, 0, pwszString, -1, psz, cblen, NULL, NULL)))
{
MemFree(psz); psz = NULL;
}

return psz;
}
brave_heart 2003-02-22
  • 打赏
  • 举报
回复
ATL 里有一些串转换宏,很好用

ATL String Conversion Macros
USES_CONVERSION;
A2BSTR OLE2A T2A W2A
A2COLE OLE2BSTR T2BSTR W2BSTR
A2CT OLE2CA T2CA W2CA
A2CW OLE2CT T2COLE W2COLE
A2OLE OLE2CW T2CW W2CT
A2T OLE2T T2OLE W2OLE
A2W OLE2W T2W W2T

在函数中,如果你想把转换后的结果通过输出参数输出,那么就必须
用SysAllocString申请一块Heap内存,再传出去。不能直接传转换宏的
结果。举个例子

HRESULT get_string(/* out */ BSTR bstrOut)
{
char* p = get_some_string();
USES_CONVERSION;
bstrOut = A2BSTR(p); // error
bstrOut = SysAllocString(A2BSTR(p)); // right way
return S_OK;
}

注意,调用get_string()的代码负责释放(SysFreeString)输出串bstrOut。
林仪明 2003-02-22
  • 打赏
  • 举报
回复
就是啊!也请到这个帖子去!一共是300分啊!
http://expert.csdn.net/Expert/topic/1452/1452788.xml?temp=.8216974
brave_heart 2003-02-22
  • 打赏
  • 举报
回复
上面给的例子有1个bug, 你看出来了吗?


HRESULT get_string(/* out */ BSTR* bstrOut)
{
char* p = "Hello World.";
USES_CONVERSION;
// 因为A2BSTR 内部也调用了SysAllocStringLen,所以可以直接
// 传出去。
*bstrOut = A2BSTR(p);
return S_OK;
}
Rigel 2003-02-22
  • 打赏
  • 举报
回复
学习
xiguazi 2003-02-21
  • 打赏
  • 举报
回复
BSTR->LPSTR
BSTR word;
USES_CONVERSION;
OLE2A(word);

char* -> BSTR
char buf[10];
BSTR word;
USES_CONVERSION;
word = SysAllocString(A2W(buf));
xiguazi 2003-02-21
  • 打赏
  • 举报
回复
gz

3,245

社区成员

发帖
与我相关
我的任务
社区描述
ATL,Active Template Library活动(动态)模板库,是一种微软程序库,支持利用C++语言编写ASP代码以及其它ActiveX程序。
社区管理员
  • ATL/ActiveX/COM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧