Search code examples
c++parametersargumentsargv

WinMain arguments


My issue is that the arguments are only retrieving the first letter in each of the parameters, for this i do not know why.. Could someone elaborate?

#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;
}

I believe the issue lies within CommandLineToArgvW(GetCommandLineW(), &nArgs);


Solution

  • LPWSTR is typedefed to wchar_t *, szArglist is an array of wchar_t *s. A wide character is 2 bytes instead of of 1, so a letter might be represented as:

    0x0038 0x0000

    However, if you take those bytes and say 'hey, pretend I'm a char *, this looks like a C-string with one letter (0x0038), because the 2nd char (0x0000) is null, which in C style strings represents the end of the string.

    The problem you have is that you are trying to fit wide characters (wchar_t) into a non-wide (char) string, which is a much more complicated opperation.

    The solution: either use wstring/wchar_t everywhere (corresponding to LPWSTR/LPCWSTR), or use string/char everywhere (corresponding to LPSTR and LPCSTR I believe). Note that your project setting for 'use unicode' should match your decision. Try not to mix these!