我正在尝试使用这行代码
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 ( );
}
}
}
答案 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字符串是
如果你使用的是仍然可以定位Windows 9x的旧工具,你需要支持ANSI,你的意思是针对Windows 9x,你不能使用Layer for Unicode,因为你在DLL中使用MFC而你不喜欢我觉得你很难重建那个。但是你真的在DLL中使用MFC定位Windows 9x并使用足够旧的工具吗?我对此表示怀疑!
所以,到处使用宽字符串。
总结一下,忘掉那些愚蠢的_T
宏。