在C++中将TCHAR转换为字符串

23
我正在尝试将TCHAR转换为字符串,如下所示:
std::string mypath;
TCHAR path[MAX_PATH];
GetModuleFileName( NULL, path, MAX_PATH );

我需要将mypath设置为path的路径。我使用了一个简单的循环,并将path[index]连接到mypath中,这样可以实现,但我不喜欢这种方式。

我是C++新手,但已经熟悉了许多C#。我看过使用“char”参数的GetModuleFileName示例,但它不生效。它需要TCHARLPWSTR

5个回答

26

TCHAR是一个宏,根据你所定义的字符集被定义为char或wchar。2008年后的默认字符集是unicode。如果更改字符集,则此代码将起作用。

int _tmain(int argc, _TCHAR* argv[])
{
    TCHAR* bob ="hi";
    string s = bob;    
}

右键单击项目设置并更改以下内容:

enter image description here

如果您想使用TCHAR作为Unicode字符集,请使用wstring


11
最好在 TCHAR 上定义一个 typedeftypedef std::basic_string<TCHAR> tstring; 并在所有地方使用 tstring - Pablo
谢谢帮忙。将字符集设置为上面的工作了。现在我可以在GetModuleFileName方法中使用char类型。 - David
这给了我一个错误:“无法使用类型为“const char *”的值来初始化类型为“TCHAR *”的实体”。 - ThisClark
1
@ThisClark TCHAR 是否已定义。它适用于 VS2013 和 2015。如果未包含 tchar.h,则 TCHAR 将无法定义,因此该代码将无法工作。 - rerun
你是唯一的,也是独一无二的。你真正指出了TCHAR的真正痛点。哇,这是一个很棒的答案。 - user285594

15

在我真正需要做它的时候,我会使用以下方法:

TCHAR  infoBuf[32767];
GetWindowsDirectory(infoBuf, 32767);

然后我将其转换为可以转换为标准std::string的:

wstring test(&infoBuf[0]); //convert to wstring
string test2(test.begin(), test.end()); //and convert to string.

8
如果您想要以字符形式获取路径,您应该调用GetModuleFilenameA。该函数使用LPSTR而不是LPTSTR
请注意,几乎所有接受或返回字符串的Win32函数都有两个版本,一个以A结尾(ANSI?),另一个以W结尾(宽)。

5

1

嗨,这是一个晚回答,但我有一个想法。

{wstring test = User;
 std::wcout << test << std::endl;
 string test2(test.begin(), test.end());
 std::cout << test2 << std::endl;}

在这个例子中,用户是TCHAR形式的用户名。现在我可以使用名称作为stringwstring。这是将TCHAR转换为string最简单的方法。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接