加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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

发布时间:2020-12-16 09:55:31 所属栏目:百科 来源:网络整理
导读:如果您尝试将构建类型从控制台(/ SUBSYSTEM:CONSOLE)更改为 Windows(/ SUBSYSTEM:WINDOWS),则会收到错误,抱怨输入点WinMain丢失: 我认为解决这个问题的最佳方法是从WinMain调用普通的int main(int,char **): #ifdef _WINDOWS_INT WinMain(HINSTANCE hIns
如果您尝试将构建类型从控制台(/ SUBSYSTEM:CONSOLE)更改为 Windows(/ SUBSYSTEM:WINDOWS),则会收到错误,抱怨输入点WinMain丢失:

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

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

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

??

所以传递NULL和0可能不是一个好主意.如何将WinMain参数转换为主要参数?

解决方法

一种方法是使用 CommandLineToArgvW()GetCommandLineW()的结果解析为argv样式的UTF-16编码字符串数组,然后使用 WideCharToMultiByte()将它们转换为ANSI字符串,这样你就可以将它们传递给main()(假设你可以’ t使用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,w_argv[i],w_len,NULL,NULL);
        my_argv[my_argc] = new char[len+1];
        WideCharToMultiByte(CP_ACP,wargv[i],my_argv[my_argc],len+1,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,NULL);
        std::string s;
        s.resize(len);
        WideCharToMultiByte(CP_ACP,&s[0],len,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);
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读