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); } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |