将WinMain(或wWinMain)参数传递给普通main

Tom*_*ica 4 c++ winapi

如果您尝试将构建类型更改Console (/SUBSYSTEM:CONSOLE)Windows (/SUBSYSTEM:WINDOWS),则会收到错误,抱怨输入点WinMain丢失:

MSVCRT.lib(crtexew.obj):错误LNK2001:未解析的外部符号_WinMain @ 16

我认为解决这个问题的最佳方法是int main(int, char**)WinMain以下方面调用您的法线:

#ifdef _WINDOWS_
INT WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
    PSTR lpCmdLine, INT nCmdShow)
{
    return main(0, NULL);
}
#endif
Run Code Online (Sandbox Code Playgroud)

问题是ImageMagick正在使用控制台参数(我计划将来也使用它们):

分段故障imagemagick init

所以过去NULL并且0可能不是一个好主意.如何将WinMain参数转换为mainarugments?

Rem*_*eau 7

一种方法是使用CommandLineToArgvW()将结果解析为UTF-16编码字符串GetCommandLineW()argv样式数组,然后使用WideCharToMultiByte()它们将它们转换为ANSI字符串,以便您可以将它们传递给main()(假设您不能使用wmain()).

例如:

int w_argc = 0;
LPWSTR* w_argv = CommandLineToArgvW(GetCommandLineW(), &w_argc);
if (w_argv)
{
    char** my_argv = new char*[w_argc];
    int my_argc = 0;

    for (int i = 0; i < w_argc; ++i)
    {
        int w_len = lstrlenW(w_argv[i]);
        int len = WideCharToMultiByte(CP_ACP, 0, w_argv[i], w_len, NULL, 0, NULL, NULL);
        my_argv[my_argc] = new char[len+1];
        WideCharToMultiByte(CP_ACP, 0, wargv[i], w_len, my_argv[my_argc], len+1, NULL, NULL);
        ++my_argc;
    }

    main(my_argc, my_argv);

    for (int i = 0; i < my_argc; ++i)
        delete[] my_argv[i];
    delete[] my_argv;

    LocalFree(w_argv);
}
Run Code Online (Sandbox Code Playgroud)

或者:

int w_argc = 0;
LPWSTR* w_argv = CommandLineToArgvW(GetCommandLineW(), &w_argc);
if (w_argv)
{
    std vector<std::string> my_argv_buf;
    my_argv.reserve(w_argc);

    for (int i = 0; i < w_argc; ++i)
    {
        int w_len = lstrlenW(w_argv[i]);
        int len = WideCharToMultiByte(CP_ACP, 0, w_argv[i], w_len, NULL, 0, NULL, NULL);
        std::string s;
        s.resize(len);
        WideCharToMultiByte(CP_ACP, 0, wargv[i], w_len, &s[0], len, NULL, NULL);
        my_argv_buf.push_back(s);
    }

    std vector<char*> my_argv;
    my_argv.reserve(my_argv_buf.size());
    for (std vector<std::string>::iterator i = my_argv_buf.begin(); i != my_argv_buf.end(); ++i)
        my_argv.push_back(i->c_str());

    main(my_argv.size(), &my_argv[0]);

    LocalFree(w_argv);
}
Run Code Online (Sandbox Code Playgroud)