mirror of
https://github.com/wpilibsuite/allwpilib
synced 2026-06-19 00:41:43 +00:00
124 lines
3.5 KiB
C++
124 lines
3.5 KiB
C++
// Copyright (c) FIRST and other WPILib contributors.
|
|
// Open Source Software; you can modify and/or share it under the terms of
|
|
// the WPILib BSD license file in the root directory of this project.
|
|
|
|
#include "main.h"
|
|
|
|
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
|
|
LPTSTR pCmdLine, int nCmdShow) {
|
|
DWORD Status;
|
|
WCHAR ExePathRaw[1024];
|
|
Status = GetModuleFileNameW(NULL, ExePathRaw, 1024);
|
|
if (Status == 0) {
|
|
DWORD LastError = GetLastError();
|
|
return LastError;
|
|
}
|
|
|
|
std::filesystem::path ExePath{ExePathRaw};
|
|
if (ExePath.empty()) {
|
|
return 1;
|
|
}
|
|
|
|
if (!ExePath.has_stem()) {
|
|
return 1;
|
|
}
|
|
|
|
if (!ExePath.has_parent_path()) {
|
|
return 1;
|
|
}
|
|
|
|
if (ExePath.stem() == (L"AdvantageScope")) {
|
|
std::filesystem::path AdvantageScopePath{
|
|
ExePath.parent_path().parent_path() / L"advantagescope" /
|
|
L"AdvantageScope (WPILib).exe"};
|
|
return StartExeTool(AdvantageScopePath);
|
|
} else if (ExePath.stem() == (L"Elastic")) {
|
|
std::filesystem::path ElasticPath{ExePath.parent_path().parent_path() /
|
|
L"elastic" / L"elastic_dashboard.exe"};
|
|
return StartExeTool(ElasticPath);
|
|
} else {
|
|
return StartJavaTool(ExePath);
|
|
}
|
|
}
|
|
|
|
int StartJavaTool(std::filesystem::path& ExePath) {
|
|
WCHAR ExePathRaw[1024];
|
|
DWORD Status;
|
|
|
|
std::filesystem::path JarPath{ExePath};
|
|
JarPath.replace_extension(L"jar");
|
|
std::filesystem::path ParentPath{ExePath.parent_path()};
|
|
|
|
if (!ParentPath.has_parent_path()) {
|
|
return 1;
|
|
}
|
|
std::filesystem::path ToolsFolder{ParentPath.parent_path()};
|
|
|
|
std::filesystem::path Javaw = ToolsFolder / L"jdk" / L"bin" / L"javaw.exe";
|
|
|
|
std::wstring ToRun = L" -jar \"";
|
|
ToRun += JarPath;
|
|
ToRun += L"\"";
|
|
|
|
STARTUPINFOW StartupInfo;
|
|
PROCESS_INFORMATION ProcessInfo;
|
|
|
|
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
|
|
StartupInfo.cb = sizeof(StartupInfo);
|
|
ZeroMemory(&ProcessInfo, sizeof(ProcessInfo));
|
|
|
|
if (!CreateProcessW(Javaw.c_str(), ToRun.data(), NULL, NULL, FALSE, 0, NULL,
|
|
NULL, &StartupInfo, &ProcessInfo)) {
|
|
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
|
|
StartupInfo.cb = sizeof(StartupInfo);
|
|
ZeroMemory(&ProcessInfo, sizeof(ProcessInfo));
|
|
|
|
ToRun = L" -jar \"";
|
|
ToRun += JarPath;
|
|
ToRun += L"\"";
|
|
|
|
Status = GetEnvironmentVariableW(L"JAVA_HOME", ExePathRaw, 1024);
|
|
std::wstring JavawLocal = L"javaw";
|
|
if (Status != 0 && Status < 1024) {
|
|
std::filesystem::path JavaHomePath{ExePathRaw};
|
|
JavaHomePath /= "bin";
|
|
JavaHomePath /= "javaw.exe";
|
|
JavawLocal = JavaHomePath;
|
|
}
|
|
|
|
if (!CreateProcessW(JavawLocal.c_str(), ToRun.data(), NULL, NULL, FALSE, 0,
|
|
NULL, NULL, &StartupInfo, &ProcessInfo)) {
|
|
return 1;
|
|
}
|
|
}
|
|
|
|
Status =
|
|
WaitForSingleObject(ProcessInfo.hProcess, 3000); // Wait for 3 seconds
|
|
CloseHandle(ProcessInfo.hProcess);
|
|
CloseHandle(ProcessInfo.hThread);
|
|
|
|
return Status == WAIT_TIMEOUT ? 0 : 1;
|
|
}
|
|
|
|
int StartExeTool(std::filesystem::path& ExePath) {
|
|
STARTUPINFOW StartupInfo;
|
|
PROCESS_INFORMATION ProcessInfo;
|
|
DWORD Status;
|
|
|
|
ZeroMemory(&StartupInfo, sizeof(StartupInfo));
|
|
StartupInfo.cb = sizeof(StartupInfo);
|
|
ZeroMemory(&ProcessInfo, sizeof(ProcessInfo));
|
|
|
|
if (!CreateProcessW(ExePath.c_str(), NULL, NULL, NULL, FALSE, 0, NULL, NULL,
|
|
&StartupInfo, &ProcessInfo)) {
|
|
return 1;
|
|
}
|
|
|
|
Status =
|
|
WaitForSingleObject(ProcessInfo.hProcess, 5000); // Wait for 5 seconds
|
|
CloseHandle(ProcessInfo.hProcess);
|
|
CloseHandle(ProcessInfo.hThread);
|
|
|
|
return Status == WAIT_TIMEOUT ? 0 : 1;
|
|
}
|