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;