From 120b03e859e890710c293f42e9a9d412f46f0b8a Mon Sep 17 00:00:00 2001 From: baldurk Date: Tue, 12 Jul 2016 15:16:39 +0200 Subject: [PATCH] On windows, make sure cmd.exe can see the stdout/stderr --- renderdoccmd/renderdoccmd.vcxproj | 10 ++--- renderdoccmd/renderdoccmd_win32.cpp | 60 +++++++++++++++++++++++++++++ 2 files changed, 65 insertions(+), 5 deletions(-) diff --git a/renderdoccmd/renderdoccmd.vcxproj b/renderdoccmd/renderdoccmd.vcxproj index 31a3c0b33..2fdc87d0e 100644 --- a/renderdoccmd/renderdoccmd.vcxproj +++ b/renderdoccmd/renderdoccmd.vcxproj @@ -100,7 +100,7 @@ Windows true - ws2_32.lib;Wininet.lib;%(AdditionalDependencies) + psapi.lib;ws2_32.lib;Wininet.lib;%(AdditionalDependencies) @@ -117,7 +117,7 @@ Windows true - ws2_32.lib;Wininet.lib;%(AdditionalDependencies) + psapi.lib;ws2_32.lib;Wininet.lib;%(AdditionalDependencies) @@ -137,7 +137,7 @@ true true true - $(SolutionDir)\renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\breakpad_common.lib;$(SolutionDir)\renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\crash_generation_server.lib;ws2_32.lib;Wininet.lib;%(AdditionalDependencies) + $(SolutionDir)\renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\breakpad_common.lib;$(SolutionDir)\renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\crash_generation_server.lib;psapi.lib;ws2_32.lib;Wininet.lib;%(AdditionalDependencies) @@ -157,7 +157,7 @@ true true true - $(SolutionDir)\renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\breakpad_common.lib;$(SolutionDir)\renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\crash_generation_server.lib;ws2_32.lib;Wininet.lib;%(AdditionalDependencies) + $(SolutionDir)\renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\breakpad_common.lib;$(SolutionDir)\renderdoc\3rdparty\breakpad\$(Platform)\$(Configuration)\crash_generation_server.lib;psapi.lib;ws2_32.lib;Wininet.lib;%(AdditionalDependencies) @@ -200,4 +200,4 @@ - \ No newline at end of file + diff --git a/renderdoccmd/renderdoccmd_win32.cpp b/renderdoccmd/renderdoccmd_win32.cpp index 16535f0ee..ec77a15bd 100644 --- a/renderdoccmd/renderdoccmd_win32.cpp +++ b/renderdoccmd/renderdoccmd_win32.cpp @@ -33,6 +33,9 @@ #include "miniz/miniz.h" #include "resource.h" +#include +#include + using std::string; using std::wstring; using std::vector; @@ -266,6 +269,48 @@ void DisplayRendererPreview(ReplayRenderer *renderer, TextureDisplay &displayCfg DestroyWindow(wnd); } +// from http://stackoverflow.com/q/29939893/4070143 +// and http://stackoverflow.com/a/4570213/4070143 + +std::string getParentExe() +{ + DWORD pid = GetCurrentProcessId(); + HANDLE h = NULL; + PROCESSENTRY32 pe = {0}; + DWORD ppid = 0; + pe.dwSize = sizeof(PROCESSENTRY32); + h = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0); + if(Process32First(h, &pe)) + { + do + { + if(pe.th32ProcessID == pid) + { + ppid = pe.th32ParentProcessID; + break; + } + } while(Process32Next(h, &pe)); + } + CloseHandle(h); + + if(ppid == 0) + return ""; + + h = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, ppid); + if(h) + { + char buf[MAX_PATH]; + if(GetModuleFileNameExA(h, 0, buf, MAX_PATH)) + { + CloseHandle(h); + return buf; + } + CloseHandle(h); + } + + return ""; +} + int WINAPI wWinMain(_In_ HINSTANCE hInst, _In_opt_ HINSTANCE hPrevInstance, _In_ LPWSTR lpCmdLine, _In_ int nShowCmd) { @@ -295,6 +340,21 @@ int WINAPI wWinMain(_In_ HINSTANCE hInst, _In_opt_ HINSTANCE hPrevInstance, _In_ LocalFree(wargv); + // if launched from cmd.exe, be friendly and redirect output + std::string parent = getParentExe(); + for(size_t i = 0; i < parent.length(); i++) + { + parent[i] = tolower(parent[i]); + if(parent[i] == '\\') + parent[i] = '/'; + } + + if(strstr(parent.c_str(), "/cmd.exe") && AttachConsole(ATTACH_PARENT_PROCESS)) + { + freopen("CONOUT$", "w", stdout); + freopen("CONOUT$", "w", stderr); + } + hInstance = hInst; WNDCLASSEX wc;