updated build system
Some checks failed
BlockStorage/repertory/pipeline/head There was a failure building this commit

This commit is contained in:
2025-08-26 20:08:47 -05:00
parent 8fabc142f2
commit 1d7e96f3a4
20 changed files with 521 additions and 47 deletions

View File

@@ -23,7 +23,6 @@
#include "utils/windows.hpp"
#include "utils/com_init_wrapper.hpp"
#include "utils/error.hpp"
#include "utils/string.hpp"
@@ -65,7 +64,6 @@ auto get_local_app_data_directory() -> const std::string & {
REPERTORY_USES_FUNCTION_NAME();
static std::string app_data = ([]() -> std::string {
com_init_wrapper cw;
PWSTR local_app_data{};
if (SUCCEEDED(::SHGetKnownFolderPath(FOLDERID_LocalAppData, 0, nullptr,
&local_app_data))) {
@@ -139,6 +137,142 @@ auto run_process_elevated(std::vector<const char *> args) -> int {
}
void set_last_error_code(DWORD error_code) { ::SetLastError(error_code); }
auto get_startup_folder() -> std::wstring {
PWSTR raw{nullptr};
auto result = ::SHGetKnownFolderPath(FOLDERID_Startup, 0, nullptr, &raw);
if (FAILED(result)) {
if (raw != nullptr) {
::CoTaskMemFree(raw);
}
return {};
}
std::wstring str{raw};
::CoTaskMemFree(raw);
return str;
}
auto create_shortcut(const std::wstring &exe_path,
const std::wstring &arguments,
const std::wstring &working_directory,
const std::wstring &shortcut_name, std::wstring location)
-> bool {
REPERTORY_USES_FUNCTION_NAME();
const auto hr_hex = [](HRESULT hr) -> std::string {
std::ostringstream oss;
oss << "0x" << std::uppercase << std::hex << std::setw(8)
<< std::setfill('0') << static_cast<std::uint32_t>(hr);
return oss.str();
};
if (location.empty()) {
utils::error::handle_error(function_name, "Shortcut location was empty.");
return false;
}
{
std::error_code ec_mk;
std::filesystem::create_directories(std::filesystem::path{location}, ec_mk);
}
std::filesystem::path exe_p{exe_path};
std::wstring final_name = shortcut_name.empty()
? (exe_p.stem().wstring() + L".lnk")
: shortcut_name;
if (not final_name.ends_with(L".lnk")) {
final_name += L".lnk";
}
const std::filesystem::path lnk_path =
std::filesystem::path{location} / final_name;
IShellLinkW *psl{nullptr};
HRESULT result = ::CoCreateInstance(CLSID_ShellLink, nullptr,
CLSCTX_INPROC_SERVER, IID_PPV_ARGS(&psl));
if (FAILED(result)) {
utils::error::handle_error(
function_name,
std::string("CoCreateInstance(CLSID_ShellLink) failed: ") +
hr_hex(result));
return false;
}
result = psl->SetPath(exe_path.c_str());
if (FAILED(result)) {
utils::error::handle_error(function_name,
std::string("IShellLink::SetPath failed: ") +
hr_hex(result));
psl->Release();
return false;
}
if (not arguments.empty()) {
result = psl->SetArguments(arguments.c_str());
if (FAILED(result)) {
utils::error::handle_error(
function_name,
std::string("IShellLink::SetArguments failed: ") + hr_hex(result));
psl->Release();
return false;
}
}
if (not working_directory.empty()) {
result = psl->SetWorkingDirectory(working_directory.c_str());
if (FAILED(result)) {
utils::error::handle_error(
function_name,
std::string("IShellLink::SetWorkingDirectory failed: ") +
hr_hex(result));
psl->Release();
return false;
}
}
result = psl->SetShowCmd(SW_SHOWNORMAL);
if (FAILED(result)) {
utils::error::handle_error(function_name,
std::string("IShellLink::SetShowCmd failed: ") +
hr_hex(result));
psl->Release();
return false;
}
// Best-effort overwrite
{
std::error_code ec;
std::filesystem::remove(lnk_path, ec);
}
IPersistFile *ppf{nullptr};
result = psl->QueryInterface(IID_PPV_ARGS(&ppf));
if (FAILED(result)) {
utils::error::handle_error(
function_name,
std::string("QueryInterface(IPersistFile) failed: ") + hr_hex(result));
psl->Release();
return false;
}
result = ppf->Save(lnk_path.c_str(), TRUE);
ppf->SaveCompleted(lnk_path.c_str());
ppf->Release();
psl->Release();
if (FAILED(result)) {
utils::error::handle_error(function_name,
std::string("IPersistFile::Save failed: ") +
hr_hex(result));
return false;
}
return true;
}
} // namespace repertory::utils
#endif // defined(_WIN32)