Простой механизм обновления приложения C / GTK в Windows - PullRequest
3 голосов
/ 30 октября 2010

Я разрабатываю приложение C / GTK. Скоро я выпустлю новую версию, и я подумал, что было бы полезно включить в нее какой-то механизм обновления, чтобы приложение могло само обновляться.

Мне действительно нужно только что-то простое; достаточно, чтобы оно работало только в Windows, поскольку в Linux приложение находится в репозитории, поэтому пользователи могут легко его обновить.

Итак, я хотел спросить, есть ли какой-нибудь простой и легкий способ сделать это (например, небольшая библиотека), или мне придется самому это реализовать?

Спасибо.

приписка

Я действительно хочу что-то очень простое, например, скажем, приложение будет загружать веб-страницу с сервера, который будет содержать номер последней версии. Если номер версии приложения! = Номер версии сервера, он получит файл setup.exe, каким-то образом проверит его подлинность и запустит.

Ответы [ 2 ]

3 голосов
/ 31 октября 2010

Возможно, это не полный ответ на вопрос, но есть некоторые вещи, которые вы, возможно, захотите принять во внимание, если сами реализуете:

Для части «Проверка наличия обновлений»без фактической загрузки вы можете загрузить текстовый файл из онлайн-хранилища, содержащий строку последней версии (например, 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:

Надеюсь, это поможет.

1 голос
/ 30 октября 2010

Омаха довольно круто, если у вас есть ресурсы для настройки соответствующей серверной стороны.

...