Windows 64位下Steam SDK 1.60调用GetSteamID崩溃求助
Windows 64位下Steam API 1.60调用GetSteamID崩溃问题
问题背景
在Windows 64位系统中使用Steam API v1.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() is valid.,说明SteamUser()返回非空指针,但调用GetSteamID时直接崩溃,无异常抛出 - GDB调试显示崩溃发生在
steamclient64.dll的Steam_NotifyMissingInterface函数:
Thread 1 "MainThrd" received signal SIGSEGV, Segmentation fault. 0x00007ffa5a3de225 in steamclient64!Steam_NotifyMissingInterface () from C:\Program Files (x86)\Steam\steamclient64.dll
- 本地
steamclient64.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."); }
解决方案建议
- 确认Steam客户端已登录且为最新版本,尝试重启Steam客户端后再测试
- 检查程序编译配置:确保项目为64位编译,Steam API的头文件、库文件与系统位数完全匹配,禁止混用32位/64位资源
- 验证
steam_appid.txt:确保程序运行目录下存在该文件,且内容为正确的游戏AppID,Steam API初始化依赖此文件关联应用 - 检查线程调用:Steam API要求所有接口调用在主线程执行,确保初始化和
GetSteamID调用都在主线程 - 替换Steam API文件:重新从Steamworks SDK中提取最新的
steam_api64.dll及相关库文件,避免文件损坏或版本不匹配 - 权限排查:尝试以管理员权限运行程序,确保Steam客户端和程序有足够的系统资源访问权限
内容的提问来源于stack exchange,提问作者Nathan
相关产品推荐
相关产品推荐

