std :: string到LPCTSTR

And*_*uri 11 c++ windows string

新版本的如何从转换典型的问题std::stringLPCTSTR.

从不同的SO帖子中读到我了解到我应该这样做:

CreateDirectory(path.c_str(),NULL);
Run Code Online (Sandbox Code Playgroud)

而且编译器仍然会出错cannot convert from const char * to LPCTSTR.

我试过了:

CreateDirectory((LPCTSTR)path.c_str(),NULL);
Run Code Online (Sandbox Code Playgroud)

没错!

仍然创建目录(在正确的位置):

D:\\something\\????????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

这不完全是我想要的,你可以猜到......

那我错过了什么?它与UNICODE/ANSI有关吗?我该如何解决这个问题?

Mar*_*rio 6

这里的问题LPCTSTR是解决wchar_t*char*基于您的构建是否支持unicode(unicode标志设置与否)的事实.

要显式调用该char*版本,请调用CreateDirectoryA().


jav*_*web 6

当你试图找到"(std::)字符串到LPCTSTR"时弹出这个问题

这里有一个方法如何转换和传递std::stringLPCTSTR使用wstring

string path_str = "Yay!"; //your string containing path
wstring path_wstr( path_str.begin(), path_str.end() );
//then this should work:
CreateDirectory(path_wstr.c_str(),NULL);
Run Code Online (Sandbox Code Playgroud)

重要说明阿德里安·麦卡锡:

如果源字符串是ASCII或者它是ANSI并且当前代码页是Windows-1252(非常类似于Latin-1),则这很好.如果源是UTF-8或其他代码页,那么这只是隐藏了问题.


Mar*_*rry 5

试着看看这个页面:什么是TCHAR-WCHAR-LPSTR-LPWSTR-LPCTSTR-etc . 如果您使用的是MSVC,那么您可能已为项目设置了Unicode LPCSTR并被"翻译"为const wchar_t *,这与之不兼容const char *

通过这样做:(LPCTSTR)path.c_str()你从原始字符串中取出两个字符,并从中创建一个unicode wchar_t字母.多数民众赞成你获得"中国"字符的方式.


Dav*_*nan 5

您正在编译Unicode,这意味着它CreateDirectoryCreateDirectoryW宽字符版本的别名.但是,程序中的文本使用ANSI进行编码.这意味着您的程序无法正确处理国际化.

编译器告诉您CreateDirectoryW所需的文本编码与您提供的文本编码之间存在不匹配.确实,您可以调用CreateDirectoryA以解决该不匹配问题,但这只会使根问题永久化,即您在程序中使用ANSI文本这一事实.

因此,最好的解决方案是将所有文本编码为Unicode.停止使用string并开始使用wstring.一旦你改变pathwstring那时

CreateDirectory(path.c_str(),NULL);
Run Code Online (Sandbox Code Playgroud)

是正确的.