C++ 将LPSTR转换为LPCTSTR
我正在修改一个程序,将命令行参数作为C++ 将LPSTR转换为LPCTSTR,c++,c,winapi,C++,C,Winapi,我正在修改一个程序,将命令行参数作为LPSTR类型的变量。目前,该值在程序中是硬编码的,并以\T(“program.exe”)的形式传递给所需的函数。函数需要类型LPCTSTR。我试图将命令行参数从LPSTR转换为LPCTSTR,但没有成功。使用char*作为中介的类似尝试也失败了。我知道我可能遗漏了一些非常简单的东西,但现在我非常感谢您的帮助。如果您的项目默认使用Unicode,\T(“字符串”)将变成L“String”,这是一个宽字符串。不能使用类型转换在宽字符串和8位字符串之间进行转换 您
LPSTR
类型的变量。目前,该值在程序中是硬编码的,并以\T(“program.exe”)
的形式传递给所需的函数。函数需要类型LPCTSTR
。我试图将命令行参数从LPSTR
转换为LPCTSTR
,但没有成功。使用char*
作为中介的类似尝试也失败了。我知道我可能遗漏了一些非常简单的东西,但现在我非常感谢您的帮助。如果您的项目默认使用Unicode,\T(“字符串”)
将变成L“String”
,这是一个宽字符串。不能使用类型转换在宽字符串和8位字符串之间进行转换
您的选择:
wWinMain
而不是WinMain
,并将命令行参数定义为LPWSTR lpCmdLine
通常LPSTR应转换为LPCTSTR 然而,这显然不是在你的情况下,所以说这对任何人都没有帮助 如果您使用的是VisualStudio,请转到Project⟩ [项目名称]属性⟩ 配置属性⟩ 一般的⟩ 项目默认设置并将字符集的值更改为“使用多字节字符集” 如果您正在使用自定义的
.vcxproj
文件,请在每个
<PropertyGroup Condition= "'$(Configuration)|$(Platform)'=='[Configuration]|[Platform]'" Label="Configuration"></PropertyGroup>
您需要添加一行内容,说明:
<CharacterSet>MultiByte</CharacterSet>
多字节
如果您已经有一个
,那么只需将其值更改为“MultiByte”。因为您处理的是命令行参数,所以您可能正在使用argv
您应该改为使用函数,该函数生成类似argv的Unicode字符串数组。链接文档的底部有示例代码,但基本上是这样的:
argv_wide = CommandLineToArgvW(GetCommandLineW(), &argc_wide);
请注意,如果您以其他方式获得ANSI字符串,例如从文本文件中读取,则您将使用该函数对其进行转换。不是downvoter,但您的第一个选项与OP想要的相反:
\u T(“”
已经工作,而”
不会工作,但她希望传递一个动态值,而不是硬编码的值。@Quentin指出-我只是仔细地重新阅读了OP的问题。不过,第二个建议更好。如果你不使用Unicode,你的应用程序将停留在20世纪。为什么你的输入是LPSTR而不是LPTSTR?用于获取命令行参数和\u tWinMain
函数的参数的GetCommandLine
函数应该为您提供Unicode版本中的LPTSTR。不是重复的,但您可能会对这个问题感兴趣OP:Why-oh为什么要使用TCHAR
?您需要同时编译ANSI和Unicode吗?你还在瞄准Windows98吗?我对此表示怀疑。编译Unicode,使用<代码> WCARGYT ,并决定你写C还是C++。我想你需要从学习<代码> TCHAR 开始。就目前而言,我认为你甚至不知道TCHAR
扩展到什么?是char
还是wchar\t
?你需要知道这一点,并理解其中的含义。这是你下一个研究任务。@DavidHeffernan是的,我知道。我只是害怕OP从此会认为Unicode是一种编码——这会起作用,但应该是最后的手段,如果您处理的是无法更新以使用Unicode的遗留代码。从听起来,大部分代码已经支持Unicode,因此这只是正确获取命令行参数的问题。没有人声称,LPSTR
不会转换为LPCSTR
。说有人做了,对任何人都没有帮助。另外,你的双引号和单引号都不是。我从来没有说过有人声称LPSTR不会转换为LPCTSTR。试图在不使用事实的情况下模仿我的陈述并中途结束你的最后一句话对任何人都没有帮助。他的意思是“你的双引号和单引号不是双引号和单引号”。您的浏览器或操作系统已将它们转换为所谓的智能引号,这意味着如果读者复制并粘贴它们,他们将遇到麻烦。我已经修好了。啊,我没听清楚-非常感谢你的澄清和修好!我真的很想用argv,它更好。但是我试着让遗留代码与原始代码保持一致,但是让它在上面运行是这样的。根据您的描述,代码中从命令行获取参数而不是硬编码的部分是新的,所以这是您可以更改的部分,是吗?如果您没有使用argv
从命令行读取,您使用的是什么?