我有这个函数返回一个字符串:
string getStringFromFile()
{
ifstream in("in.txt");
ofstream out("out.txt");
std::string line;
while(getline(in,line)){
if(line.empty())
line="http://www.google.com/";
}
return line;
}
尝试调用getStringFromFile
函数时,会返回语法错误(Error : identificator not defined)
。
CreateWindowEx(0, _T("EDIT"),
_T(getStringFromFile()),
WS_CHILD | WS_VISIBLE | WS_BORDER,
260, 10,
200, 20,
hWnd, NULL, hInst, NULL);
答案 0 :(得分:5)
您不能像这样使用_T()
。它是一个将L
后缀应用于字符串文字的宏,而不是可以应用于任意表达式的函数。
您应该从这些库类型的宽字符串版本开始,这基本上等同于您尝试使用_T()
进行攻击的内容:
std::wifstream
std::wofstream
std::wstring
当您调用Windows API函数时,您似乎也可能需要获取指向字符串数据的指针,而不是尝试传递实际的C ++字符串对象。
getStringFromFile().c_str()
这会给你所需要的wchar_t const*
,说实话,我不能完全确定用一个临时的做法是否安全。这取决于CreateWindowEx
的前提条件。
最安全的方法,IMO:
std::wstring getStringFromFile()
{
std::wifstream in("in.txt");
std::wofstream out("out.txt");
std::wstring line;
while (std::getline(in,line)) {
if (line.empty())
line = "http://www.google.com/";
}
return line;
}
// ...
const std::wstring str = getStringFromFile();
CreateWindowEx(0, _T("EDIT"),
str.c_str(),
WS_CHILD | WS_VISIBLE | WS_BORDER,
260, 10,
200, 20,
hWnd, NULL, hInst, NULL
);
另一个复杂因素是,当您的程序定义_T()
时,L
宏 仅将UNICODE
后缀应用于字符串文字。如果您希望同时支持Unicode和非Unicode模式,则在未定义std::string
时,您需要切换回原始UNICODE
等。话虽如此,我已经被认为现在很少有人禁用UNICODE
。不过,我不是Windows开发者......
答案 1 :(得分:3)
您无法在_T
macro
该宏扩展为(可能)将L
附加到字符串 literal 。您的函数返回std::string
,因此您无法将其修改为文字。
要清楚,那就像拥有这个功能
int foo()
{
return 5;
}
并尝试将其称为
foo().0
这显然不会将您的int
转换为double
,因为您添加了.0
,这将指定双字面
答案 2 :(得分:3)
_T是一个用于处理文字字符串的宏,可以是UNICODE或ANSI字符串,具体取决于项目的设置。如果要同时支持两者,则必须通过在UNICODE构建下返回std :: wstring并调用.c_str()方法将值传递给CreateWindowEx函数来相应地编写getStringFromFile()函数。