X-Git-Url: https://git.carlh.net/gitweb/?a=blobdiff_plain;f=src%2Flib%2Fcross_windows.cc;h=9181b6c8abf1deb8861a21c65b3db63d4d62a883;hb=3ffd0163026be24e5373e0674c3301ed37546e44;hp=12fb5efa03659108b0a190a0afb0976fe7332ecc;hpb=8a8c977c12fc65f1f50ea05099387e0fc8840e7d;p=dcpomatic.git diff --git a/src/lib/cross_windows.cc b/src/lib/cross_windows.cc index 12fb5efa0..9181b6c8a 100644 --- a/src/lib/cross_windows.cc +++ b/src/lib/cross_windows.cc @@ -29,6 +29,8 @@ #include "exceptions.h" #include "dcpomatic_assert.h" #include "util.h" +#include +#include #include #include extern "C" { @@ -43,10 +45,11 @@ extern "C" { #include #include #undef DATADIR -#include -#include -#include #include +#include +#include +#include +#include #include #include #include @@ -123,37 +126,51 @@ cpu_info () void -run_ffprobe (boost::filesystem::path content, boost::filesystem::path out) +run_ffprobe(boost::filesystem::path content, boost::filesystem::path out, bool err, string args) { SECURITY_ATTRIBUTES security; security.nLength = sizeof (security); security.bInheritHandle = TRUE; security.lpSecurityDescriptor = 0; - HANDLE child_stderr_read; - HANDLE child_stderr_write; - if (!CreatePipe (&child_stderr_read, &child_stderr_write, &security, 0)) { + HANDLE child_out_read; + HANDLE child_out_write; + if (!CreatePipe(&child_out_read, &child_out_write, &security, 0)) { LOG_ERROR_NC ("ffprobe call failed (could not CreatePipe)"); return; } + if (!SetHandleInformation(child_out_read, HANDLE_FLAG_INHERIT, 0)) { + LOG_ERROR_NC("ffprobe call failed (could not SetHandleInformation)"); + return; + } + wchar_t dir[512]; MultiByteToWideChar (CP_UTF8, 0, directory_containing_executable().string().c_str(), -1, dir, sizeof(dir)); STARTUPINFO startup_info; ZeroMemory (&startup_info, sizeof (startup_info)); startup_info.cb = sizeof (startup_info); - startup_info.hStdError = child_stderr_write; + if (err) { + startup_info.hStdError = child_out_write; + } else { + startup_info.hStdOutput = child_out_write; + } startup_info.dwFlags |= STARTF_USESTDHANDLES; wchar_t command[512]; - wcscpy (command, L"ffprobe.exe \""); + wcscpy(command, L"ffprobe.exe "); + + wchar_t tmp[512]; + MultiByteToWideChar(CP_UTF8, 0, args.c_str(), -1, tmp, sizeof(tmp)); + wcscat(command, tmp); + + wcscat(command, L" \""); - wchar_t file[512]; - MultiByteToWideChar (CP_UTF8, 0, content.string().c_str(), -1, file, sizeof(file)); - wcscat (command, file); + MultiByteToWideChar(CP_UTF8, 0, dcp::filesystem::canonical(content).make_preferred().string().c_str(), -1, tmp, sizeof(tmp)); + wcscat(command, tmp); - wcscat (command, L"\""); + wcscat(command, L"\""); PROCESS_INFORMATION process_info; ZeroMemory (&process_info, sizeof (process_info)); @@ -168,12 +185,12 @@ run_ffprobe (boost::filesystem::path content, boost::filesystem::path out) return; } - CloseHandle (child_stderr_write); + CloseHandle(child_out_write); while (true) { char buffer[512]; DWORD read; - if (!ReadFile(child_stderr_read, buffer, sizeof(buffer), &read, 0) || read == 0) { + if (!ReadFile(child_out_read, buffer, sizeof(buffer), &read, 0) || read == 0) { break; } o.write(buffer, read, 1); @@ -184,7 +201,7 @@ run_ffprobe (boost::filesystem::path content, boost::filesystem::path out) WaitForSingleObject (process_info.hProcess, INFINITE); CloseHandle (process_info.hProcess); CloseHandle (process_info.hThread); - CloseHandle (child_stderr_read); + CloseHandle(child_out_read); } @@ -656,3 +673,17 @@ show_in_file_manager (boost::filesystem::path, boost::filesystem::path select) return (reinterpret_cast(r) <= 32); } + +ArgFixer::ArgFixer(int, char**) +{ + auto cmd_line = GetCommandLineW(); + auto wide_argv = CommandLineToArgvW(cmd_line, &_argc); + + _argv_strings.resize(_argc); + _argv = new char*[_argc]; + for (int i = 0; i < _argc; ++i) { + _argv_strings[i] = wchar_to_utf8(wide_argv[i]); + _argv[i] = const_cast(_argv_strings[i].c_str()); + } +} +