ACPIテーブルIDを整数・文字列として列挙する。
#include <format> #include <iostream> #include <vector> #define STRICT #define NOMINMAX #include <Windows.h> namespace SysInfoUtil { std::vector<DWORD> EnumSystemACPITableIDs() noexcept { auto buffer_size = ::EnumSystemFirmwareTables('ACPI', nullptr, 0); if (buffer_size == 0) return {}; std::vector<DWORD> buffer(buffer_size / sizeof(DWORD), 0); if (!::EnumSystemFirmwareTables('ACPI', buffer.data(), buffer_size)) return {}; return std::move(buffer); } } // 32ビット整数を4文字の文字列ビューとして扱います。 // 文字列ビューの寿命は与えられたポインタと一致します。 constexpr auto fourcc_ptr_to_sv(const unsigned long* pdw) { return std::string_view(reinterpret_cast<const char*>(pdw), 4); } int main() { std::cout.imbue(std::locale("Japanese", std::locale::ctype)); for (auto id : SysInfoUtil::EnumSystemACPITableIDs()) { std::cout << std::format("{}: {:d}", fourcc_ptr_to_sv(&id), id) << std::endl; } return 0; }
補足