c++ - 将 WinMain(或 wWinMain)参数传递给普通的 main

标签 c++ winapi

如果您尝试将构建类型从 Console (/SUBSYSTEM:CONSOLE) 更改为 Windows (/SUBSYSTEM:WINDOWS),您将收到一个错误提示该条目缺少 WinMain 点:

MSVCRT.lib(crtexew.obj) : error LNK2001: unresolved external symbol _WinMain@16

我认为解决这个问题的最好方法是从 WinMain 调用您的普通 int main(int, char**):

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

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

Segmentation fault imagemagick init

因此传递 NULL0 可能不是一个好主意。如何将 WinMain 参数转换为 main 参数?

最佳答案

一种方法是使用 CommandLineToArgvW()解析 GetCommandLineW() 的结果转换为 argv 样式的 UTF-16 编码字符串数组,然后使用 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);
}

或者:

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

关于c++ - 将 WinMain(或 wWinMain)参数传递给普通的 main,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27363851/

相关文章:

c++ - 即使在简单的 hello 程序中,我也无法在 C++ 中的 ./a.out 之后获得输出

c++ - 如果目录不为空,则RemoveDirectory()?

c++ - 获取带指针的二维数组元素

javascript - Nodejs Addon - 将正则表达式字符串传递给 C++

winapi - 使用 WinAPI 获取与正在运行的应用程序关联的图标

c++ - 如何判断文件夹是否是递归文件夹复制的子文件夹?

delphi - UpDown 控件的样式与编辑框不匹配

php - 使用 CNG 在 c++ 应用程序中签署数据并在 php api 中验证

C++ 性能挑战:整数到 std::string 的转换

c++ - 在 C++ 中的派生类之间切换