在 Windows 64x 上,使用 steam api 版本 1.60(最后一个)。使用以下代码片段,游戏在函数上崩溃
GetSteamID
if (SteamAPI_InitEx(nullptr)) {
if (SteamUser()) {
printf("SteamUser() is valid.\n");
try {
CSteamID steamID = SteamUser()->GetSteamID();
printf("SteamID: %llu\n", steamID.ConvertToUint64());
} catch (const std::exception &e) {
printf("Exception occurred: %s\n", e.what());
}
} else {
printf("SteamUser() is nullptr.\n");
}
SteamAPI_Shutdown();
} else {
printf("Failed to initialize Steam API.\n");
}
SteamUser()
不为空,正如我所见 "SteamUser() is valid.\n"
。这是一个有效的 ptr。
没有例外,只是该函数崩溃了GetSteamID()
使用gdb,我们可以看到它在哪个函数中崩溃,这是GetSteamID()
之后的下一个函数调用
Thread 1 "MainThrd" received signal SIGSEGV, Segmentation fault. 0x00007ffa5a3de225 in steamclient64!Steam_NotifyMissingInterface () from C:\Program Files (x86)\Steam\steamclient64.dll
指向我自己的 Steam 客户端 dll。不过已经是最新的了。
我还尝试使用
SteamAPI_Init()
和 SteamAPI_InitFlat()
加载 API,但得到了相同的结果。
在 Linux 上一切正常。
更新:我遵循了评论中的建议,我得到了完全相同的崩溃行为。
SteamErrMsg errMsg;
if (SteamAPI_InitEx(&errMsg) == k_ESteamAPIInitResult_OK) {
auto steamUser = SteamUser();
if (steamUser) {
LOG_ERROR(logger, "SteamUser() is valid.");
try {
CSteamID steamID = steamUser->GetSteamID();
LOG_ERROR(logger, "SteamID: {}", steamID.ConvertToUint64());
} catch (const std::exception &e) {
LOG_ERROR(logger, "Exception occurred: {}", e.what());
}
} else {
LOG_ERROR(logger, "SteamUser() is nullptr.");
}
SteamAPI_Shutdown();
} else {
LOG_ERROR(logger, "Failed to initialize Steam API.");
}
使用 MSVC 代替 MinGW 解决了问题。