23 #define BUFFER_SIZE 32768
24 int launch(
const char local_exe[],
const char arguments[]);
26 int main(
int argc,
char **argv) {
27 const char executable_name[] = EXECUTABLE_NAME;
34 for(i = 1; i < argc; ++
i) {
35 for(s = argv[i]; *
s; ++
s) {
45 *(d++) = i + 1 == argc ?
'\0' :
' ';
48 return launch(executable_name, lpCmdLine);
51 int launch(
const char local_exe[],
const char arguments[]) {
57 STARTUPINFOA siStartupInfo;
58 PROCESS_INFORMATION piProcessInfo;
60 if(!nSize || GetLastError() == ERROR_INSUFFICIENT_BUFFER)
65 for(i = (
int)nSize - 1; i != -1; --
i)
71 memcpy(dir + i,
"\\bin\\x64", 9);
73 memcpy(dir + i,
"\\bin\\d64", 9);
77 memcpy(dir + i,
"\\bin\\x32", 9);
79 memcpy(dir + i,
"\\bin\\d32", 9);
87 if(strlen(dir) + strlen(local_exe) + 1 >
BUFFER_SIZE)
89 sprintf_s(full_exe,
BUFFER_SIZE,
"%s\\%s", dir, local_exe);
91 if(strlen(full_exe) + strlen(arguments) + 1 >
BUFFER_SIZE)
93 sprintf_s(full_exe_with_args,
BUFFER_SIZE,
"%s %s", full_exe, strlen(arguments));
95 memset(&siStartupInfo, 0,
sizeof(siStartupInfo));
96 memset(&piProcessInfo, 0,
sizeof(piProcessInfo));
97 siStartupInfo.cb =
sizeof(siStartupInfo);
99 if(!SetCurrentDirectoryA(dir)) {
102 MessageBoxA(0,
"Failed to set the current working directory to bin\\x64\\", 0, MB_OK);
104 MessageBoxA(0,
"Failed to set the current working directory to bin\\d64\\", 0, MB_OK);
108 MessageBoxA(0,
"Failed to set the current working directory to bin\\x32\\", 0, MB_OK);
110 MessageBoxA(0,
"Failed to set the current working directory to bin\\d32\\", 0, MB_OK);
117 if(!CreateProcessA(full_exe,
128 MessageBoxA(0,
"Failed to launch \"" EXECUTABLE_NAME
"\"", 0, MB_OK);
133 if(WaitForSingleObject(piProcessInfo.hProcess, INFINITE) == WAIT_FAILED)
134 return (
int)GetLastError();
136 CloseHandle(piProcessInfo.hThread);
137 CloseHandle(piProcessInfo.hProcess);
int main(int argc, char **argv)
return Display return Display Bool Bool int d
int launch(const char local_exe[], const char arguments[])
typedef DWORD(WINAPI *XInputGetState_t)(DWORD dwUserIndex