【问题标题】:Windows unicode commandline argvWindows unicode 命令行 argv
【发布时间】:2011-05-05 08:25:14
【问题描述】:

因此进入新千年,我重写了我的 c++ 代码:

int main(int argc, wchar_t **argv)

如果使用 Unicode 或 MBCS 选项构建,则当应用程序使用命令行 arg 运行时,直接或通过 dbl-click 传递给 argv[] 的文件名是不可读的 = 在某些中文字体混合中。

感谢 cmets - 我将尝试在此处为搜索引擎汇总(z)e。

  1. wmain(int argc,char **argv) 只能用于命令行(子系统:控制台)应用

  2. int winMain(int argc, wchar_t **argv) 适用于 gui (subsystem:windows),但 gui 将其替换为它自己的入口点。在 Qt 的情况下,这不起作用

    qtmaind.lib(qtmain_win.obj) : error LNK2019: unresolved external symbol _main referenced in function _WinMain@16

解决方案似乎是使用main(int arc,char **argv)main(int argc,wchar_t**argv) 但忽略 argv。然后使用 argv 或 NULL 调用 QApplication - 当 Qt 内部调用 GetCommandLine() 时忽略 argv。
然后使用 app.arguments 返回解析后的参数。
然后,如果需要,可以使用 Qt 的字符串函数将这些转换回 wchar。

 QApplication app(argc, (char**)argv);  or  QApplication app(argc,NULL);  
 QStringList args = app.arguments();

抱歉,我最初没有标记此 Qt,因为我认为这无关紧要。
如果有人想编辑它以包括如何在 MFC 中执行此操作 - 请执行此操作。

【问题讨论】:

  • (我知道这个问题很旧,但是)您应该发布一个自我回答,而不是在问题中包含“摘要”。问题就是问题。

标签: c++ visual-studio winapi qt unicode


【解决方案1】:

您可以为此目的使用GetCommandLine 函数。

【讨论】:

  • 还有 CommandLineToArgvW() 将返回的字符串解析为 argv 样式的 wchar_t[] 数组。
【解决方案2】:

试试这个:

#include <tchar.h>

int _tmain( int argc, TCHAR **argv )
{
  return 0;
}

_tmain 在使用 UNICODE 选项编译时定义为 wmain,在使用 MBCS 选项编译时定义为 main

【讨论】:

  • 呃,不要使用 MS T 的东西,除非您需要在动态链接 MFC 时支持 Windows 9x(并且不想重建 MFC)。图片中没有 MFC,并且希望支持 Windows 9x for Unicode 程序,只需使用 Microsoft Layer for Unicode。无论如何,使用T 的东西不仅仅是不合时宜的,它是麻烦的根源。 :-)
  • @Alf,很想知道T 的东西会给你带来什么麻烦。似乎 C++ 严格的类型系统会警告您任何即将发生的灾难。
  • @Mark: 带有T 的东西,例如根据编译时是否定义了某些宏符号,文字会从窄变为宽。通常,代码仅使用一组宏定义进行测试,例如构建为 Unicode。构建为 ANSI(这可能是 T 东西的全部意义)然后失败。即使它没有失败,它也需要更多的测试工作(大约两倍,测试两个不同的版本),并且编写代码需要更多的工作。这也会给你带来麻烦...... :-) 干杯&hth.,
  • @Alf:谈论谬误的推理!因此,根据您的说法,如果特定项目的要求需要宽字符和 ASCII 版本,最好复制项目或使用您自己的预处理器开关,而不是定义和取消定义 UNICODE 符号并使用 MS'TCHAR 的 2 个构建配置开关?继续...
  • 如果你不关心其中一个字符集,TCHAR 对你有什么伤害?您仍将测试您关心的案例并确保其有效。此外,使用“T stuff”函数名称感觉比不使用更自然,例如LoadLibrary() vs LoadLibraryA()
【解决方案3】:

你需要将你的入口点命名为wmain:http://msdn.microsoft.com/en-us/library/fzc2cy7w(VS.80).aspx

【讨论】:

  • 看来 wmain 只能在命令行应用程序中使用,wWinMain 用于 GUI 但与 Qt 库冲突。
  • @Martin,我以为main 也只能用于命令行程序,所以我不认为这是个问题。
  • 不幸的是,当您单击 dbl-click 时,您将文件名作为命令行 arg 发送,我想这确实是一个 Qt 错误。
  • wmain 无论子系统(GUI 或控制台)如何,都可以。但是,MS 链接器对此并不聪明,因此对于非常规的启动功能,您必须使用链接器/entry 选项来指定调用该启动功能的入口点。在这种情况下,IIRC 将是/entry:wmainCRTStartup。另一种方法是使用GetCommandLine API 函数及其近亲,它将命令行拆分为参数(我忘记了名称,但有趣的是它仅在 Unicode 版本中可用)。这可能就是wmainCRTStartup 所做的。干杯&hth.,
  • @Chris:我同意没有必要选择入口点。 GNU 工具链会自动推导出它。 Microsoft 的链接器没有,因此 Visual C++ 实际上不符合 GUI 子系统应用程序的标准(不接受标准 main,除非您添加那些鲜为人知的选项)。也就是说,main 签名是该语言中的 Unix 依赖项。 C++ 标准建议对 main 参数进行 UTF-8 编码,但例如Win XP [cmd.exe] 不处理 UTF-8 编码:大多数命令只是在chcp 65001... 之后静默失败... :-( 干杯,
猜你喜欢
  • 2020-01-23
  • 2013-06-13
  • 2020-11-15
  • 1970-01-01
  • 2015-07-26
  • 2012-05-26
  • 1970-01-01
  • 2014-08-21
  • 2017-12-27
相关资源
最近更新 更多