diff options
author | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-08-07 22:20:43 +0400 |
---|---|---|
committer | Sergey Sharybin <sergey.vfx@gmail.com> | 2014-08-07 22:22:57 +0400 |
commit | 57c4871146269a34522ad50c43cb55fe773f3bdf (patch) | |
tree | 92c909a5b7a696bdda21c5b969671ef477ecacc3 | |
parent | a108532eb93d96a2c8dea7e21533d953d0eee2c3 (diff) |
Tweaks to the recent wrapper on windows
- Forgot to handle command line arguments
- Because of the fact we need to be able to
use stdout and stderr we need to use regular
console application for the wrapper.
- Because of using regular application for the
wrapper we need to check forparent PID in the
isStartedFromCommandPrompt().
I really hope it's not gonna to become any more
complicated.
-rw-r--r-- | intern/ghost/intern/GHOST_SystemWin32.cpp | 30 | ||||
-rw-r--r-- | source/creator/creator_launch_win.c | 24 |
2 files changed, 44 insertions, 10 deletions
diff --git a/intern/ghost/intern/GHOST_SystemWin32.cpp b/intern/ghost/intern/GHOST_SystemWin32.cpp index 91ac8545018..bc2a210fb1e 100644 --- a/intern/ghost/intern/GHOST_SystemWin32.cpp +++ b/intern/ghost/intern/GHOST_SystemWin32.cpp @@ -46,6 +46,7 @@ #include <shlobj.h> #include <tlhelp32.h> +#include <Psapi.h> #include "utfconv.h" @@ -1383,6 +1384,30 @@ void GHOST_SystemWin32::putClipboard(GHOST_TInt8 *buffer, bool selection) const } } +static DWORD GetParentProcessID(void) +{ + HANDLE snapshot; + PROCESSENTRY32 pe32 = {0}; + DWORD ppid = 0, pid = GetCurrentProcessId(); + snapshot = CreateToolhelp32Snapshot( TH32CS_SNAPPROCESS, 0 ); + if (snapshot == INVALID_HANDLE_VALUE) { + return -1; + } + pe32.dwSize = sizeof( pe32 ); + if (!Process32First(snapshot, &pe32)) { + CloseHandle(snapshot); + return -1; + } + do { + if (pe32.th32ProcessID == pid) { + ppid = pe32.th32ParentProcessID; + break; + } + } while (Process32Next(snapshot, &pe32)); + CloseHandle(snapshot); + return ppid; +} + static bool isStartedFromCommandPrompt() { HWND hwnd = GetConsoleWindow(); @@ -1392,7 +1417,10 @@ static bool isStartedFromCommandPrompt() GetWindowThreadProcessId(hwnd, &pid); - if (pid == GetCurrentProcessId()) + /* Because we're starting from a wrapper we need to comare with + * parent process ID. + */ + if (pid == GetParentProcessID()) return true; } diff --git a/source/creator/creator_launch_win.c b/source/creator/creator_launch_win.c index 0f186f643db..e998343c876 100644 --- a/source/creator/creator_launch_win.c +++ b/source/creator/creator_launch_win.c @@ -23,8 +23,6 @@ * ***** END GPL LICENSE BLOCK ***** */ -#pragma comment(linker, "/subsystem:windows") - /* Binary name to launch. */ #define BLENDER_BINARY "blender-app.exe" @@ -33,21 +31,29 @@ #include <stdlib.h> #include <windows.h> -int WINAPI WinMain(HINSTANCE hInstance, - HINSTANCE hPrevInstance, - LPSTR lpCmdLine, - int nCmdShow) +int main(int argc, char **argv) { PROCESS_INFORMATION processInformation = {0}; STARTUPINFOA startupInfo = {0}; BOOL result; + char command[65536]; + int i, len = sizeof(command); _putenv_s("OMP_WAIT_POLICY", "PASSIVE"); startupInfo.cb = sizeof(startupInfo); - result = CreateProcessA(NULL, BLENDER_BINARY, NULL, NULL, FALSE, - 0, NULL, NULL, - &startupInfo, &processInformation); + + strncpy(command, BLENDER_BINARY, len - 1); + len -= strlen(BLENDER_BINARY); + for (i = 1; i < argc; ++i) { + strncat(command, " ", len - 1); + strncat(command, argv[i], len - 2); + len -= strlen(argv[i]) + 1; + } + + result = CreateProcessA(NULL, command, NULL, NULL, TRUE, + 0, NULL, NULL, + &startupInfo, &processInformation); if (!result) { fprintf(stderr, "Error launching " BLENDER_BINARY "\n"); |