You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.18 02:05:37