Windows unicode命令行argv

Mar*_*ett 11 c++ unicode winapi qt visual-studio

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

int main(int argc, wchar_t **argv)
Run Code Online (Sandbox Code Playgroud)

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

感谢您的评论 - 我将尝试在这里总结(z)e为搜索引擎.

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

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

    qtmaind.lib(qtmain_win.obj):错误LNK2019:函数_WinMain @ 16中引用了未解析的外部符号_main

解决方案似乎是使用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();
Run Code Online (Sandbox Code Playgroud)

对不起,我最初没有标记这个Qt,因为我认为这不相关.
如果有人想编辑它还包括如何在MFC中执行此操作 - 请执行此操作.

Mar*_*som 18

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

  • 无论子系统(GUI或控制台)如何,`wmain`都可以.但是,MS链接器并不聪明,因此对于非常规启动函数,您必须使用链接器`/ entry`选项来指定调用该启动函数的入口点.在这种情况下,IIRC将是`/ entry:wmainCRTStartup`.另一种方法是使用`GetCommandLine` API函数及其附近的表兄弟将命令行拆分为参数(我忘记了名称,但有趣之处在于它仅在Unicode版本中可用).这可能就是`wmainCRTStartup`的作用.干杯&hth., (4认同)
  • @Chris:我同意不必选择入口点.GNU工具链会自动推断出它.微软的链接器没有,所以Visual C++实际上不符合(不接受标准的`main`,除非你添加那些鲜为人知的选项)用于GUI子系统应用程序.也就是说,`main`签名是该语言中的Unix依赖.C++标准建议使用`main`参数的UTF-8编码,但是例如Win XP [cmd.exe]不处理UTF-8编码:大多数命令只是*在`chcp 65001'后静默失败*...: - (干杯, (2认同)

Pra*_*ian 5

尝试这个:

#include <tchar.h>

int _tmain( int argc, TCHAR **argv )
{
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

_tmain定义为wmain使用 UNICODE 选项main编译时和使用 MBCS 选项编译时。

  • 呃,除非你需要在动态链接 MFC 的同时支持 Windows 9x(并且不想重建 MFC),否则不要使用 MS `T` 的东西。由于图中没有 MFC,并且希望支持 Windows 9x for Unicode 程序,只需使用 Microsoft Layer for Unicode。无论如何,使用`T` 的东西不仅仅是不合时宜,它还会带来麻烦。:-) (3认同)
  • @Mark:使用`T` 的东西,例如文字从窄变宽,这取决于编译时是否定义了某些宏符号。通常,代码仅使用一组宏定义进行测试,例如构建为 Unicode。构建为 ANSI(并且这种可能性是`T` 东西的全部意义)然后失败。即使它没有失败,它也需要更多的测试工作(大约两倍,测试两个不同的版本),并且编写代码需要更多的工作。这也会给你带来麻烦...... :-) 干杯 &amp; hth., (3认同)

Nem*_*vic 5

为此,您可以使用GetCommandLine函数。

  • 还有 `CommandLineToArgvW()` 将返回的字符串解析为 argv 样式的 `wchar_t[]` 数组。 (3认同)