1
0
mirror of https://github.com/vlang/v.git synced 2023-08-10 21:13:21 +03:00

windows: do not link gdi32/shell32 to console applications

* read os.args from argv when we have console
* dynamically load CommandLineToArgvW when we are GUI app
* link gdi32/shell32 in glfw module
This commit is contained in:
vitalyster
2019-12-27 11:27:19 +03:00
committed by Alexander Medvednikov
parent 55dbb8b81c
commit 3f0f8bac49
8 changed files with 65 additions and 22 deletions

View File

@ -557,10 +557,42 @@ pub fn (v mut V) generate_main() {
}
pub fn (v mut V) gen_main_start(add_os_args bool) {
v.cgen.genln('int main(int argc, char** argv) { ')
if (v.os == .windows) {
if 'glfw' in v.table.imports {
v.cgen.genln('#ifdef V_BOOTSTRAP')
v.cgen.genln('int main(int argc, char** argv) { ')
v.cgen.genln('#else')
// GUI application
v.cgen.genln('int WINAPI wWinMain(HINSTANCE instance, HINSTANCE prev_instance, LPWSTR cmd_line, int show_cmd) { ')
v.cgen.genln(' typedef LPWSTR*(WINAPI *cmd_line_to_argv)(LPCWSTR, int*);')
v.cgen.genln(' HMODULE shell32_module = LoadLibrary(L"shell32.dll");')
v.cgen.genln(' cmd_line_to_argv CommandLineToArgvW = (cmd_line_to_argv)GetProcAddress(shell32_module, "CommandLineToArgvW");')
v.cgen.genln(' int argc;')
v.cgen.genln(' wchar_t** argv = CommandLineToArgvW(cmd_line, &argc);')
v.cgen.genln(' os__args = os__init_os_args_wide(argc, argv);')
v.cgen.genln('#endif')
} else {
v.cgen.genln('#ifdef V_BOOTSTRAP')
v.cgen.genln('int main(int argc, char** argv) { ')
v.cgen.genln('#else')
// Console application
v.cgen.genln('int wmain(int argc, wchar_t* argv[], wchar_t* envp[]) { ')
v.cgen.genln('#endif')
}
} else {
v.cgen.genln('int main(int argc, char** argv) { ')
}
v.cgen.genln(' init();')
if add_os_args && 'os' in v.table.imports {
v.cgen.genln(' os__args = os__init_os_args(argc, (byteptr*)argv);')
if v.os == .windows {
v.cgen.genln('#ifdef V_BOOTSTRAP')
v.cgen.genln(' os__args = os__init_os_args(argc, (byteptr*)argv);')
v.cgen.genln('#else')
v.cgen.genln(' os__args = os__init_os_args_wide(argc, argv);')
v.cgen.genln('#endif')
} else {
v.cgen.genln(' os__args = os__init_os_args(argc, (byteptr*)argv);')
}
}
v.generate_hotcode_reloading_main_caller()
v.cgen.genln('')