From 1437d9b8bc49228c626c751ff39f595b40ec718d Mon Sep 17 00:00:00 2001 From: Martin Herkt Date: Thu, 2 Jan 2014 05:26:22 +0100 Subject: Add Windows console wrapper program (mpv.com) --- osdep/win32-console-wrapper.c | 83 +++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 osdep/win32-console-wrapper.c (limited to 'osdep/win32-console-wrapper.c') diff --git a/osdep/win32-console-wrapper.c b/osdep/win32-console-wrapper.c new file mode 100644 index 0000000000..f369b07555 --- /dev/null +++ b/osdep/win32-console-wrapper.c @@ -0,0 +1,83 @@ +/* + * conredir, a hack to get working console IO with Windows GUI applications + * + * Copyright (c) 2013, Martin Herkt + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + */ + +#include +#include + +void cr_perror(const wchar_t *prefix) +{ + wchar_t *error; + + FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | + FORMAT_MESSAGE_FROM_SYSTEM | + FORMAT_MESSAGE_IGNORE_INSERTS, + NULL, GetLastError(), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + (LPWSTR)&error, 0, NULL); + + fwprintf(stderr, L"%s: %s", prefix, error); + LocalFree(error); +} + +void cr_runproc(wchar_t *name, wchar_t *cmdline) +{ + STARTUPINFO si; + PROCESS_INFORMATION pi; + + ZeroMemory(&si, sizeof(si)); + si.cb = sizeof(si); + si.hStdInput = GetStdHandle(STD_INPUT_HANDLE); + si.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE); + si.hStdError = GetStdHandle(STD_ERROR_HANDLE); + si.dwFlags |= STARTF_USESTDHANDLES; + + ZeroMemory(&pi, sizeof(pi)); + + if (!CreateProcessW(name, cmdline, NULL, NULL, TRUE, 0, + NULL, NULL, &si, &pi)) { + + cr_perror(L"CreateProcess"); + } else { + WaitForSingleObject(pi.hProcess, INFINITE); + CloseHandle(pi.hProcess); + CloseHandle(pi.hThread); + } +} + +int wmain(int argc, wchar_t **argv, wchar_t **envp) +{ + wchar_t *cmd, *args, *eargs; + wchar_t exe[MAX_PATH]; + size_t len; + + cmd = GetCommandLineW(); + args = cmd + wcslen(argv[0]); + + GetModuleFileNameW(NULL, exe, MAX_PATH); + wcscpy(wcsrchr(exe, '.') + 1, L"exe"); + + len = wcslen(exe) + wcslen(args) + 1; + eargs = malloc(len * sizeof(wchar_t)); + swprintf(eargs, len, L"%s%s", exe, args); + free(cmd); + + cr_runproc(exe, eargs); + + free(eargs); + return 0; +} -- cgit v1.2.3