调用Steamworks SDK的GetFriendCountFromSource函数触发访问违例错误
问题分析与解决方案
错误根源
0xC0000005访问违规是因为SteamFriends()返回了空指针,直接调用其成员函数GetFriendCountFromSource导致非法内存访问。核心原因是SteamAPI未完成正确初始化,且缺少必要的校验步骤。
修复步骤
- 必须初始化SteamAPI:
SteamAPI_RestartAppIfNecessary仅用于检查程序是否通过Steam客户端启动,不会完成SDK初始化。需调用SteamAPI_Init()并校验返回结果,确保SDK初始化成功。 - 校验Steam接口指针:调用
SteamFriends()后必须检查是否为非空,避免空指针调用。 - 正确构造服务器CSteamID:从Web API获取的服务器SteamID,需明确指定账号类型为游戏服务器(
k_EAccountTypeGameServer),仅用uint64值构造可能导致类型错误,接口无法识别。 - 程序退出时清理SteamAPI:调用
SteamAPI_Shutdown()释放资源,避免内存泄漏。
修改后的代码
#include <iostream> #include "../HeaderFiles/steam_api.h" #include "../HeaderFiles/isteamfriends.h" int main() { std::cout << "Hello World!\n"; // 检查是否需要通过Steam重启程序 if (SteamAPI_RestartAppIfNecessary(480)) { std::cout << "程序将通过Steam重启\n"; return 0; // 重启后当前进程需退出 } // 初始化SteamAPI,必须成功才能继续 if (!SteamAPI_Init()) { std::cout << "SteamAPI初始化失败\n"; return 1; } // 构造服务器CSteamID,指定账号类型为游戏服务器 uint64 serverId = 90163946096075782; CSteamID steamIDServer(serverId, k_EAccountTypeGameServer); // 校验SteamFriends接口是否有效 ISteamFriends* pSteamFriends = SteamFriends(); if (pSteamFriends == nullptr) { std::cout << "无法获取SteamFriends接口\n"; SteamAPI_Shutdown(); return 1; } // 调用接口获取服务器玩家数量 int playerCount = pSteamFriends->GetFriendCountFromSource(steamIDServer); std::cout << "服务器当前玩家数量: " << playerCount << "\n"; // 清理SteamAPI资源 SteamAPI_Shutdown(); return 0; }
额外注意事项
- 确保程序已添加Steamworks SDK的链接库(如
steam_api.lib),编译配置正确。 - 测试时必须通过Steam客户端启动程序,否则SteamAPI初始化会失败。
- 确认从Web API获取的服务器SteamID准确无误,且目标服务器处于在线状态。
内容的提问来源于stack exchange,提问作者l l
相关产品推荐
相关产品推荐

