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位字符串之间进行转换

您的选择:

  • 将项目设置更改为不使用Unicode字符集
  • 使用Unicode函数而不是ANSI函数。将应用程序入口点定义为
    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
    从命令行读取,您使用的是什么?