Возможно, это не полный ответ на вопрос, но есть некоторые вещи, которые вы, возможно, захотите принять во внимание, если сами реализуете:
Для части «Проверка наличия обновлений»без фактической загрузки вы можете загрузить текстовый файл из онлайн-хранилища, содержащий строку последней версии (например, 1.24).Этот фрагмент кода должен выполнить работу для версии Windows (хотя я ее не тестировал):
#include <wininet.h>
_Bool CheckForUpdate() {
DWORD flags = 0; // Not really used. DWORD == unsigned long
if (!InternetGetConnectedState(&flags, 0)) {
// The user is not connected to the Internet. Finished?
}
// Open the connection (HINTERNET == void *):
HINTERNET connection = InternetOpen("User Agent", INTERNET_OPEN_TYPE_DIRECT, NULL, NULL, 0);
if (http == NULL) {
// Error.
...
}
HINTERNET updateFile = InternetOpenUrl(connection, "URL", NULL, FLAGS, 0);
if (updateFile == NULL) {
// Something went wrong.
...
InternetcloseHandle(connection); // Close the handle.
...
}
// Reached here, we have the connection up, reading the file:
char latestVersion[10] = {0};
DWORD bytesRead = 0;
if (InternetReadFile(updateFile, latestVersion, sizeof(latestVersion), &bytesRead) == FALSE) {
// Error.
...
InternetCloseHandle(updateFile);
InternetCloseHandle(connection);
...
}
// Internet stuff is finished, so the handles can be closed now:
InternetCloseHandle(updateFile);
InternetCloseHandle(connection);
// Check if there's a new version available:
if (strcmp(latestVersion, CURRENT_VERSION) > 0) {
// An update is available.
return 1;
} else {
// No new updates available.
return 0;
}
}
В конце ответа есть ссылки на документы по функциям Wininet, которые я использовал, где выможно посмотреть, для чего предназначен каждый параметр.
При вызове InternetOpen()
строка агента пользователя может быть, например, именем вашего приложения.Я написал INTERNET_OPEN_TYPE_DIRECT
, поскольку это наиболее распространенная настройка, конфигурация прокси не указана.
При вызове InternetOpenUrl()
вторым параметром должен быть URL-адрес текстового файла в виде строки с окончанием NULL
.Для параметра FLAGS
в этом вызове проверьте онлайн-документы на те из них, которые у вас есть (см. Ссылки внизу поста).Например, возможная комбинация флагов будет выглядеть следующим образом:
INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_AUTH | INTERNET_FLAG_NO_COOKIES | INTERNET_FLAG_NO_UI
Вызов strcmp()
также должен хорошо работать с буквами между версиями, поэтому после приведенного выше примера «1.24c» должна быть более новой версиейчем «1.24» или «1.24a».
Если у вас есть несколько путей выпуска (например, бета-версии), вы можете использовать несколько полей в текстовом файле или иметь несколько файлов.Это может быть полезно, если вы не хотите рассылать нестабильные выпуски всем пользователям, а только тем, кто хочет использовать такие сборки.
Если при чтении файла нет ошибок, вы также можете добавить проверку, чтобы увидеть,код состояния HTTP был 200 (ОК) с использованием функции HttpQueryInfo()
с флагом HTTP_QUERY_STATUS_CODE
.
В любом случае, все это только для подтверждения новых версий, вы можете просто уведомить об этом своих пользователейчерез сообщение или используйте аналогичную схему для загрузки нового приложения установки.На этапе аутентификации вы можете добавить в файл версии контрольную сумму установочного файла и рассчитать ее после загрузки файла.
Ссылки на онлайн-документацию по Wininet API:
Надеюсь, это поможет.