String ATL转换宏不';我不喜欢置身其中;自身功能

String ATL转换宏不';我不喜欢置身其中;自身功能,string,visual-c++,atl,String,Visual C++,Atl,我正在使用ATL转换宏A2T在std::string和const TCHAR*之间进行转换。然后,我将TCHAR*提供给另一个函数,用于解析文件。当我执行以下操作时,它会起作用: USES_CONVERSION; const TCHAR* fileName = A2T(file.c_str()); foo(filename); 但是,我尝试重构空检查,并使用新函数进行转换: const TCHAR* StringToTChar(const string s) { /* To be ad

我正在使用ATL转换宏A2T在std::string和const TCHAR*之间进行转换。然后,我将TCHAR*提供给另一个函数,用于解析文件。当我执行以下操作时,它会起作用:

USES_CONVERSION;
const TCHAR* fileName = A2T(file.c_str());
foo(filename);
但是,我尝试重构空检查,并使用新函数进行转换:

const TCHAR* StringToTChar(const string s)
{   
/*  To be added in
      if(s.empty())
      {
          return NULL;
      }
*/
      USES_CONVERSION;
      const TCHAR *ts= A2T(s.c_str());//Using ATL, convert to TCHAR*
//  assert(ts!=NULL); to be added

    return ts;
}
现在函数foo(filename)说它无法打开我给它的文件。我只能假设这是因为filename变量的格式不正确。这个代码有什么问题吗

谢谢

埃里克

编辑:
看起来输入字符串是“C:\abc\build\Dvv\ggg.trc”,而foo接收的字符串是“C:\abc\buivv\ggg”

A2T
宏使用堆栈内存空间转换字符串。指针
ts
在从函数返回且其指向的数据损坏之前一直有效

如果您将返回类型更改为
ATL::CString
,您将从此处恢复正常。

中对此进行了解释。具体来说,在ATL 3.0宏行为表中,它表示“当函数退出时,字符串被释放。”