问BSTR与CSTRING之间的转换.另外--查询窗口不灵!

whiterabbit 2000-03-03 07:44:00
请教:BSTR和CSTRING之间是怎么转换的?!(双向)
另外,
记得前几天有人问过这个问题,于是向查询一下,结果试了好几次都报错如下.
Microsoft OLE DB Provider for ODBC Drivers 错误 '80040e07'

[Microsoft][ODBC Microsoft Access 97 驱动程序] 内存溢出

/csdn/expert/forum.asp, 行92

建议辛勤的斑竹把查询检索功能强化一下.

...全文
2342 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sunlet 2001-01-09
  • 打赏
  • 举报
回复
呵呵,自己编写一个函数来处理:
void inline BR_TO_CSTRING( BSTR bst,CString& cst)
{
DWORD len=*((DWORD*)bst-1);
for(UINT i=0;i<len;i+=2)
cst+=*(char*)((BYTE*)bst+i);
}
strangecat 2000-03-21
  • 打赏
  • 举报
回复
好象有道理.但是我仔细检查了我当初项目的源代码,使用_BSTR_t的确出现了问题.
老兄身在何方,所供何职,薪水多少?有无跳槽企图?
请给我发信>yanfeng-zhang@263.com
longx 2000-03-20
  • 打赏
  • 举报
回复
当然调用了SysAllocString()。但这已封装在_bstr_t的构造函数里,
在它的析构函数里调用了SysFreeString(),避免了使用SysAllocString()后
可能忘记调用SysFreeString()造成内存漏洞的危险。
上面两种写法本质是一样的。
strangecat 2000-03-18
  • 打赏
  • 举报
回复
具体情况具体分析.1.从你引述的稳当上可以清楚地看见应该使用SysAllocString,而不是LockBuffer()能解决的.
2.BSTR的真实定义为一个指针(参见文档),所以LockBuffer()可以通过编译器检查,但是按照你的方法,先锁住以后再开锁,导致BSTR指向一片不确定的内存区间.另外即使锁住以后不开锁,当该字符串为局部变量时,字符串会随着栈空间的释放而失效,引发错误.
3.以上的判断是经过了实践检验的,在一个项目中,我自己遇到过上述问题.
longx 2000-03-17
  • 打赏
  • 举报
回复
strangecat:
你的说法错误,出现错误不会是_bstr_t问题,绝大部分是由于程序的bug,
在MICROSOFT的官方文档MSDN文档中有对_bstr_t如下描叙:
_bstr_t
Microsoft Specific

A _bstr_t object encapsulates the BSTR data type. The class manages resource allocation and deallocation, via function calls to SysAllocString and SysFreeString, and other BSTR APIs when appropriate. The _bstr_t class uses reference counting to avoid excessive overhead.

forgettor 2000-03-17
  • 打赏
  • 举报
回复
80040e07属于类型转换错误,是有人提过这个问题
strangecat 2000-03-17
  • 打赏
  • 举报
回复
longgx所言有些问题.用此方法的确能通过编译,但是运行的时候,特别是用BSTR在COM组件和应用程序之间传递信息的时候会出现莫名其妙的错误.
MICROSOFT的官方文档中用以下方法完成转化.
CString str;
BSTR bstr;
bstr = str.AllocSysString();
BSTR到CString可以直接转换.
longx 2000-03-04
  • 打赏
  • 举报
回复
在VC++ 6.0中BSTR已封装成一个类 _bstr_t 很好用。以下代码演示
在BSTR与CString相互转化.

在stdafx.h中加如头文件 <comdef.h>

//将一个CString 转化一个BSTR,
CString str=_T("this is test");
_bstr_t myBstr(str.LockBuffer());
str.UnlockBuffer();
//将一个BSTR转化一个CString.
CString nStr;
nStr.Format("%s",(char*)myBstr);

zdg 2000-03-03
  • 打赏
  • 举报
回复
谢谢你的提醒, 我已经知道这个问题了...
会尽快增强查询功能...

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

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

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