在std :: string上使用_T

时间:2013-03-16 23:32:18

标签: c++ string visual-c++

我正在尝试使用这行代码

startingfolder = _T("C:\\VSS\\" +  caseref);

但据我了解,我不允许在变量上使用_T。 基本上我正在尝试将SHBrowseForFolder的起始文件夹设置为由之前分配的变量组成的路径。 我花了很多年时间试图绕过它,一直在搜索并找到关于绳索的东西,但似乎没有任何效果。我希望这很容易让我错过,因为我无法相信_T变量很难。

void folderdialog2()
                 {    
                     PIDLIST_ABSOLUTE xx;
                     PCTSTR startingfolder; 

                     startingfolder = _T("C:\\VSS\\" +  caseref);
                     xx = ILCreateFromPath(startingfolder);

                     BROWSEINFO bi = { 0 };
                     bi.pidlRoot = xx;
                     bi.lpszTitle = _T("Pick a Directory");

                     LPITEMIDLIST pidl = SHBrowseForFolder ( &bi );
                     if ( pidl != 0 )
                     {
                         // get the name of the folder
                         TCHAR path[MAX_PATH];
                         if ( SHGetPathFromIDList ( pidl, path ) )
                         {
                             _tprintf ( _T("Selected Folder: %s\n"), path );                                                                           
                         }
                         // free memory used
                         IMalloc * imalloc = 0;
                         if ( SUCCEEDED( SHGetMalloc ( &imalloc )) )
                         {
                             imalloc->Free ( pidl );
                             imalloc->Release ( );
                         }                               
                     }           

                 }

2 个答案:

答案 0 :(得分:3)

你可以这样做:

startingfolder = _T("C:\\VSS\\") +  caseref;

但如果caseref被声明为std::string,则在您使用Unicode字符集时不会编译。另一方面,如果您将其声明为std::wstring,则在使用多字节字符集时将无法编译。

如果您需要程序支持这两个字符集,一种可能的方法是使用预处理程序指令来定义类型别名tstring,如果std::wstring符号为_UNICODE,则该别名将解析为std::string如果没有,则定义为tstring,并将您的字符串变量声明为#ifdef _UNICODE typedef std::wstring tstring; #else typedef std::string tstring; #endif tstring casref = _T("something"); tstring startingfolder = _T("C:\\VSS\\") + caseref;

_T

但请注意,非史前(即任何基于NT的)Windows版本在内部使用Unicode字符,因此,如果您没有特定理由支持这两种配置,请删除那些丑陋的宏(包括{{ 1}})并将L前缀用于字符串文字(例如L"Hello")与std::wstring(以及广泛版本的流,如果您使用它们)。

答案 1 :(得分:2)

而不是:

PCTSTR startingfolder;
startingfolder = _T("C:\\VSS\\" +  caseref);

这样做:

wstring const startingfolder = wstring() + L"C:\\VSS\\" + caseref;

并将字符串类型更改为宽字符串等,并确保在包含UNICODE之前定义<windows.h>

Windows API使用16位wchar_t构建在UTF-16字符串表示上。当您使用ANSI函数时,它必须与宽字符底层API进行转换。所以使用ANSI字符串是

  • 低效。
  • 限制(无法处理常规Unicode字符)。
  • 还有很多额外的工作,而且很可能还有很多错误。

如果你使用的是仍然可以定位Windows 9x的旧工具,你需要支持ANSI,你的意思是针对Windows 9x,你不能使用Layer for Unicode,因为你在DLL中使用MFC而你不喜欢我觉得你很难重建那个。但是你真的在DLL中使用MFC定位Windows 9x并使用足够旧的工具吗?我对此表示怀疑!

所以,到处使用宽字符串。


总结一下,忘掉那些愚蠢的_T宏。