2
0
Branimir Karadžić 10 жил өмнө
parent
commit
d6b8d3c04e
1 өөрчлөгдсөн 45 нэмэгдсэн , 1 устгасан
  1. 45 1
      include/bx/process.h

+ 45 - 1
include/bx/process.h

@@ -6,6 +6,9 @@
 #ifndef BX_PROCESS_H_HEADER_GUARD
 #define BX_PROCESS_H_HEADER_GUARD
 
+#include "string.h"
+#include "uint32_t.h"
+
 #if BX_PLATFORM_LINUX
 #	include <unistd.h>
 #endif // BX_PLATFORM_LINUX
@@ -13,7 +16,7 @@
 namespace bx
 {
 	///
-	inline void* exec(const char*const _argv[])
+	inline void* exec(const char* const* _argv)
 	{
 #if BX_PLATFORM_LINUX
 		pid_t pid = fork();
@@ -26,6 +29,47 @@ namespace bx
 		}
 
 		return (void*)uintptr_t(pid);
+#elif BX_PLATFORM_WINDOWS
+		STARTUPINFO si;
+		memset(&si, 0, sizeof(STARTUPINFO) );
+		si.cb = sizeof(STARTUPINFO);
+
+		PROCESS_INFORMATION pi;
+		memset(&pi, 0, sizeof(PROCESS_INFORMATION) );
+
+		int32_t total = 0;
+		for (uint32_t ii = 0; NULL != _argv[ii]; ++ii)
+		{
+			total += (int32_t)strlen(_argv[ii]) + 1;
+		}
+
+		char* temp = (char*)alloca(total);
+		int32_t len = 0;
+		for(uint32_t ii = 0; NULL != _argv[ii]; ++ii)
+		{
+			len += snprintf(&temp[len], bx::uint32_imax(0, total-len)
+						, "%s "
+						, _argv[ii]
+						);
+		}
+
+		bool ok = CreateProcessA(_argv[0]
+					, temp
+					, NULL
+					, NULL
+					, false
+					, 0
+					, NULL
+					, NULL
+					, &si
+					, &pi
+					);
+		if (ok)
+		{
+			return pi.hProcess;
+		}
+
+		return NULL;
 #else
 		return NULL;
 #endif // BX_PLATFORM_LINUX