CString str="taet";
void* ptr=(void*)(LPTSTR)(LPCTSTR)str;CString strin=(LPTSTR)ptr;//strin返回了taet;
以上语句能很好返回,但是写成如下形式的函数就出现了问题,VOID* CEditDlg::Change()
{
CString str="taet";
void* ptr=(void*)(LPTSTR)(LPCTSTR)str;
return ptr;}BOOL CEditDlg::OnInitDialog()
{  
  void* ptring=Change();
  CString string1=(LPTSTR)ptring;
  //返回的是乱码
}

解决方案 »

  1.   

    你的代码返回乱码正常的。ptr指向的是str的数据,但str实例在chang函数中是局部变量,函数结束的时候给销毁了,指针指向的内存的内容就是不可知的。
      

  2.   

    很感谢sunrise(日出江花红胜火) 的指点: 但我还有一点不明白 switch(TheValue.vt) 
    {
    case VT_DECIMAL:
    {
    FLOAT TempValue=0;
    this->ChangeDecimalToFloat(TheValue.decVal,TempValue);
    ResultPtr=(void*)&TempValue;
    break;
    }
    case VT_BSTR:
    {
    ItemTextADO=(char*)(_bstr_t)TheValue;
    ResultPtr=(void*)(LPTSTR)(LPCTSTR)ItemTextADO;
    // ResultPtr=(void*)(char*)(_bstr_t)TheValue;

    break;
    }
    case VT_DATE:
    {
    ItemTextADO=(char*)(_bstr_t)TheValue;
    ResultPtr=(void*)(LPTSTR)(LPCTSTR)ItemTextADO;
    break;
    }按照你的指点,我将ItemTextADO(cstring)变量设为类的私有成员,ResultPtr
    所指向的内容就不再被销毁,在其他函数通过相应的转换即可获得指针所指向的内容.但我还是有一点不明白: 在case VT_DECIMAL:中, FLOAT TempValue也是局部变量,
    为什么ResultPtr指向它时, 在其他函数内能访问到它所指向的内容,而没有象上面一样而
    被销毁,不能获得所指向的内容? 
      

  3.   

    其实这样使用是很危险的。像 CString是类,在销毁的时候,是会调用析构函数的。内存是有析构函数处理的,简单变量,象int,float,没有析构函数,所以在函数退出的时候,没有被破坏掉原来的内容。但其内容已经与原来的值之间没有关联了。你用指针去访问一个函数的局部变量,因为局部变量的作用域是函数,这个函数块执行完毕,这个变量的值就是不可预知,你在函数体外部去访问一个不可预知的值,就会很危险。