调用com时候的CoInitialize(0)究竟做了什么?为什么我的一个指针里面的字符串没了?

KnowLittle 2002-03-04 04:49:11
我定义了一个
wchar_t* name;
debug时发现,在执行CoInitialize(0)之前,name一直有正确值,这句一执行,就变成了“?”,导致程序出错。

谁知道为什么吗?
...全文
199 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
KnowLittle 2002-03-11
  • 打赏
  • 举报
回复
好的,我知道了,给分。另一个问题我还没解决,你开了qq吗?
strip 2002-03-08
  • 打赏
  • 举报
回复
int a=0;
wchar_t* Str;
a=readSocket(a,&Str)
_bstr_t bstrStr = Str;
delete Str;

接下来你就用bstrStr就可以了

或者:
int a=0;
wchar_t* Str;
a=readSocket(a,&Str)
....
.... // 这些代码都要用到Str
....
....
delete Str;
KnowLittle 2002-03-08
  • 打赏
  • 举报
回复
哦,原来是这样,看来基本概念不清楚啊
你说delete *Output是在什么时候?我调用的时候是这么调用的阿
int a=0;
wchar_t* Str;
a=readSocket(a,&Str)
zifzhu 2002-03-07
  • 打赏
  • 举报
回复
CoInitialize(0)是进入一个STA套间。
strip 2002-03-07
  • 打赏
  • 举报
回复
int SqlExc::ReadSocket(int SLen, wchar_t** Output)
{
int Len=(int)Com.Data[SLen];
wchar_t myStr[20]=L""; // myStr的地址空间在离开ReadSocket之后就会被释放,这可是常识啊,怎么回头又把myStr传给了*Output ???
// 你应该wchar_t* myStr = new wchar_t[20], 回头你出了函数,*Output的内容不用了,记得delelt *Output
for(int i=0;i< Len/2;i++)
{
myStr[i]=Com.Data[2*i+SLen+1];
myStr[i]=myStr[i] < < 8;
myStr[i]=myStr[i] + (Com.Data[2*i+SLen+2] & 0x00ff);
}
myStr[Len/2]='\0';
*Output=myStr;
int TLen=SLen+Len+1;
return TLen;

}
KnowLittle 2002-03-05
  • 打赏
  • 举报
回复
问题解决了,不过就这个指针的地址问题我还是没搞懂。
我最后用的是BSTR*
KnowLittle 2002-03-05
  • 打赏
  • 举报
回复
刚才有个朋友说
name所指向的区域是在一个函数体内部
分配的
当程序离开函数之后
虽然name指针还在
但是name指针所指向的区域已经是不被保护的了

他说:指针定义了之后有没有给他定义分配一块区域?

我应该怎么做?
xuchu 2002-03-05
  • 打赏
  • 举报
回复
哈哈
嘿嘿
KnowLittle 2002-03-04
  • 打赏
  • 举报
回复
呵呵,奇怪,我的信誉值为什么变107了,看了半天使用帮助,没看到加信誉的地方啊。
难道我老实的感动了上天?
KnowLittle 2002-03-04
  • 打赏
  • 举报
回复
我初始化了,
wchar_t* name=new wchar_t[20];
依然不行,debug发现
还是在CoInitialize(0)之后丢失name的值
KnowLittle 2002-03-04
  • 打赏
  • 举报
回复
阿飞,这句话不合法阿!
我也知道这些。
我再把我的问题说清楚点,能解决一定给分!

我要在一个函数内部改变name的值,然后传入com.
原来我是写成数组,分别赋值,没有问题。但是为了以后开发的方便,我要定义成一个函数。
本来想用引用调用,但是试了半天都不行,就改成指针。
int ReadSocket(int,wchar_t**);

int SqlExc::ReadSocket(int SLen, wchar_t** Output)
{
int Len=(int)Com.Data[SLen];
wchar_t myStr[20]=L"";
for(int i=0;i<Len/2;i++)
{
myStr[i]=Com.Data[2*i+SLen+1];
myStr[i]=myStr[i] << 8;
myStr[i]=myStr[i] + (Com.Data[2*i+SLen+2] & 0x00ff);
}
myStr[Len/2]='\0';
*Output=myStr;
int TLen=SLen+Len+1;
return TLen;

}

wchar_t* name;
TLen=ReadSocket(TLen,&name);

编译通过了,但是就发生了name值丢失的问题。
code_cold 2002-03-04
  • 打赏
  • 举报
回复
wchar_t* name; // 没有初始化 ???

应不会是CoInitialize的错,
panda_w 2002-03-04
  • 打赏
  • 举报
回复
使用前需要初始化COM库,CoInitialize(0)来完成这个功能,它分配各种数据结构来容纳有关的COM使用的重要信息,CoInitialize()函数获取进程ID,使用此ID来跟踪你程序中与COM有关的活动进程!
我也弄不明白你在CoInitialize后name就为“?”了
strip 2002-03-04
  • 打赏
  • 举报
回复
wchar_t* name = new char[12];
strcpy(name, "dir");
CoInitialize(0)
看看name还会不会变成???

应该是你的name指向的内存地址已经被释放掉了,比如你的程序的其他地方,或者你让某个函数返回一个局部的字符串变量然后把值赋给name

检查一下吧
KnowLittle 2002-03-04
  • 打赏
  • 举报
回复
怎么不能点?
KnowLittle 2002-03-04
  • 打赏
  • 举报
回复
怎么不能点?
KnowLittle 2002-03-04
  • 打赏
  • 举报
回复
怎么不能点?

16,472

社区成员

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

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

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