【问题标题】:Basic Win32 C programming基本 Win32 C 编程
【发布时间】:2018-09-24 17:15:20
【问题描述】:

我正在尝试显示命令行参数。 这是我当前的代码。

#include "windows.h"
int _stdcall WinMain ( HINSTANCE  hInstance,  
                       HINSTANCE  hPrevInstance,       
                       LPSTR  lpszCmdline,  
                       int  nCmdShow  )
{ 
    MessageBox (  0, lpszCmdLine,L"Title",0); 

    return  ( 0 ) ; 
} 

我在应用程序中得到了不同的字符。

为了在应用程序窗口中显示命令行参数,我应该做哪些更改?

【问题讨论】:

  • 从未在 C 中见过这种语法,我用 C 编写了一段时间 :o
  • 您是否定义了UNICODE 宏?那么MessageBox 真的是MessageBoxW,它是宽字符wchar_t 的变体。而LPSTR仍然是char *,是一个字符串。编译器应该抱怨那个 IIRC。
  • @Simo Win API 的合法代码..
  • @EugeneSh。我只是想知道
  • 您正在调用MessageBox 的Unicode 版本。 lpszCmdline 被解释为指向一个宽字符串。每两个 ASCII 字符被视为单个 Unicode 字符;纯粹是偶然的,那个字符落在 CJK 代码块中(嗯,不是偶然的;那个代码块是一大块 Unicode 空间,所以随机选择的字符很有可能落在那里)。在 C++ 中,您会遇到类型不匹配错误;但是 C 允许在任意两种指针类型之间进行隐式转换。

标签: visual-studio-2010 winapi visual-c++


【解决方案1】:

由于 lpszCmdline 是 LPSTR,(ASCII,不是 UNICODE),第一个选项是使用 MessageBox() 的 ASCII 版本,但由于 UNICODE 是标准,我建议使用 win32 entry point 的 UNICODE 版本。请看下面的代码:

#include "windows.h"
int _stdcall wWinMain ( HINSTANCE  hInstance,  
                       HINSTANCE  hPrevInstance,       
                       LPWSTR  lpszCmdline,  
                       int  nCmdShow  )
{ 
    MessageBox (  0, lpszCmdLine,L"Title",0); 

    return  ( 0 ) ; 
} 

此外,要将命令行转换为 argv 样式的字符串数组,请调用 CommandLineToArgvW 函数。

【讨论】:

  • 可以说,最简单和正确的方法是实现一个Unicode入口点,在使用微软的编译器时称为wWinMain。该入口点将命令行作为宽字符串获取。
  • 这仍然是错误的,并且有些误导。 Windows API 中没有 ASCII。如果有,就没有歧义了。但它是 ANSI,这一切都不同。使用 Visual Studio 时也无需调用 CommandLineToArgvW。您已经将解析出的命令行参数设为__argc, __argv, __wargv。另外,签名使用了错误的调用约定。那应该是WINAPI
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-04-03
  • 2013-01-22
  • 2010-10-01
  • 1970-01-01
  • 2011-04-22
  • 1970-01-01
相关资源
最近更新 更多