в 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
указываю на свою собственную dll клиента Steam. Хотя это актуально.
Я также пробовал использовать 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.");
}
SteamAPI_InitEx возвращает k_ESteamAPIInitResult_OK, если все в порядке, или код ошибки, указанный ESteamAPIInitResult, если все в порядке. Поэтому ваша первая проверка неверна.
@TedLyngmo да, вы правы, мой пример неправильный (чего не было в моем коде). В любом случае я получил ту же ошибку с обновленным кодом (проверено).





Решение. Использование MSVC вместо MinGW решило проблему. Steam_api.dll, вероятно, был собран с помощью MSVC, использование другого компилятора приведет к внутренним ошибкам.
Я не уверен, является ли это ответом/решением или дополнительной информацией о конфигурации или симптомах. В последнем случае вы можете отредактировать вопрос, добавив детали по мере их появления, и отказаться от этого ответа.
Вызов
SteamUser()дважды, вероятно, не является хорошей практикой — я бы предпочел сохранить возвращаемое значение в локальной переменной, а затем нажать на операторif, но я думаю, это не должно привести к ошибке.