【问题标题】:WinMain argumentsWinMain 参数
【发布时间】:2013-07-27 01:08:42
【问题描述】:

我的问题是参数只检索每个参数中的第一个字母,为此我不知道为什么.. 有人可以详细说明吗?

#include <Windows.h>
#include <string>

int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hpInstance, LPSTR nCmdLine, int iCmdShow){

LPWSTR *szArglist;
    int nArgs = 0;
    szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
    std::string a;
    for(int i=0; i<nArgs; i++){
        a += (LPCSTR)szArglist[i];
    }

    MessageBox(NULL, (LPCSTR)a.c_str(), (LPCSTR)a.c_str(), MB_OK);

    LocalFree(szArglist);
return 0;
}

我认为问题出在CommandLineToArgvW(GetCommandLineW(), &amp;nArgs);

【问题讨论】:

  • 这正是 C 强制转换是邪恶的原因。如果您遇到编译器错误,请不要本能地进行强制转换。使用std::wstring,for循环可以替换为将a初始化为GetCommandLineW并去掉空格。
  • 为了详细说明为什么 C 转换是邪恶的,宽字符可能由位序列 0100000000000000 表示,其中 ANSI 字符表示的相同位序列是两个字符 01000000 00000000。它现在是一个 1 个字符的以 null 结尾的字符串。
  • 但是 wstring 会使我的类型成为一个无法检索所有数组元素的常量。缺少空格不是大问题。
  • 我现在理解位排序,但是如何将参数放入数组中?
  • std::wstringstd::string 没有什么不同。它们都是使用不同字符类型的 typedef。

标签: c++ parameters arguments argv


【解决方案1】:

LPWSTR 的类型定义为wchar_t *szArglistwchar_t *s 的数组。宽字符是 2 个字节而不是 1 个字节,因此一个字母可能表示为:

0x0038 0x0000

但是,如果你拿这些字节说'嘿,假装我是char *,这看起来像一个带有一个字母 (0x0038) 的 C 字符串,因为第二个字符 (0x0000) 为空,在C风格的字符串表示字符串的结束。

您遇到的问题是您试图将宽字符 (wchar_t) 放入非宽 (char) 字符串中,这是一个复杂得多的操作。

解决方案:要么在任何地方使用 wstring/wchar_t(对应于 LPWSTR/LPCWSTR),要么在任何地方使用 string/char(我相信对应于 LPSTR 和 LPCSTR)。请注意,您的“使用 unicode”项目设置应符合您的决定。尽量不要混合这些!

【讨论】:

    【解决方案2】:

    不应该是这样的

    int WINAPI 
    WinMain(HINSTANCE hInstance, HINSTANCE hpInstance, LPSTR nCmdLine, int iCmdShow)
    {
        MessageBoxA(NULL, nCmdLine, nCmdLine, MB_OK);
        return 0;
    }
    

    int WINAPI 
    WinMain(HINSTANCE hInstance, HINSTANCE hpInstance, LPSTR nCmdLine, int iCmdShow)
    {
        MessageBoxW(NULL, GetCommandLineW(), GetCommandLineW(), MB_OK);
        return 0;
    }
    

    ?

    【讨论】:

    • 哦 WOWWWW >.
    • “他们”是指MessageBox 的A 和W 形式吗?是的,几乎每个接受字符串的 Windows API 函数都有,而现代最佳编码实践是一直使用它们。不合格的版本只是为了向后兼容旧代码。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-05-01
    • 2015-04-08
    • 2016-04-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多