2010-10-30 3 views
3

Je développe une application C/GTK. Je vais bientôt publier une nouvelle version, et j'ai pensé qu'il serait utile d'inclure un mécanisme de mise à jour pour que l'application puisse se mettre à jour. Je n'ai vraiment besoin que de quelque chose de simple; c'est suffisant si cela ne fonctionnait que sous Windows, puisque sur Linux l'application est dans le repo afin que les utilisateurs puissent la mettre à jour facilement.Mécanisme de mise à jour simple pour l'application C/GTK sous Windows

Alors je voulais demander, y a-t-il un moyen simple et facile de le faire (comme une petite bibliothèque), ou devrais-je l'implémenter moi-même?

Merci.

P.S.

Je veux vraiment quelque chose de très simple, par exemple, disons que l'application téléchargerait une page Web à partir d'un serveur qui contiendrait le dernier numéro de version. Si le numéro de version de l'application! = Numéro de version du serveur, il récupèrera un fichier setup.exe, vérifiera en quelque sorte son authenticité et l'exécutera.

Répondre

0

Pour tous les Googleurs, j'ai écrit ma propre bibliothèque très simple, libhul, pour ce faire.

Il est maintenant très stable, je l'ai utilisé moi-même dans mon programme, HoubySoft Calculator.

N'hésitez pas à check it out here et utilisez-le vous-même; Il est sous licence GPL v3, si vous avez besoin d'une autre licence, contactez-moi, ça ira probablement bien.

1

omaha est assez cool, si vous avez les ressources pour configurer le côté serveur correspondant.

+0

Je déteste l'approche de mise à jour de google. Il n'y a aucune raison pour que la vérification des mises à jour s'exécute plus souvent que j'utilise le programme, exécuter le programme de mise à jour sur un calendrier est tout simplement stupide. –

+0

D'un coup d'œil, c'est trop compliqué pour ce dont j'ai besoin - a ajouté un PS à la question pour clarifier. – houbysoft

3

Cela pourrait ne pas être une réponse complète à la question, mais ils sont des choses que vous pourriez vouloir prendre en compte si vous êtes vous-même de mettre en œuvre:

Pour la partie « vérification de la mise à jour », sans le télécharger, vous pouvez télécharger un fichier texte à partir d'un emplacement en ligne, contenant la dernière version de la chaîne (par exemple 1.24). Cet extrait de code doit faire le travail pour la version Windows (bien que je ne l'ai pas testé):

#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; 
    } 
} 

Il y a des liens vers la documentation sur les fonctions Wininet j'ai utilisé à la fin de la réponse, où vous pouvez voir quel est chaque paramètre pour.

Lorsque vous appelez InternetOpen(), la chaîne de l'agent utilisateur peut être votre nom d'application par exemple. J'ai écrit INTERNET_OPEN_TYPE_DIRECT car c'est l'installation la plus commune, aucune configuration de proxy n'est spécifiée.

Dans l'appel InternetOpenUrl(), le deuxième paramètre doit être l'URL du fichier texte en tant que chaîne terminée NULL. Pour le paramètre FLAGS de cet appel, vérifiez les documents en ligne sur les différents que vous avez (consultez les liens en bas de la publication). Par exemple, une combinaison possible de drapeaux serait la suivante:

INTERNET_FLAG_RELOAD | INTERNET_FLAG_NO_CACHE_WRITE | INTERNET_FLAG_NO_AUTH | INTERNET_FLAG_NO_COOKIES | INTERNET_FLAG_NO_UI 

Le strcmp() appel devrait bien fonctionner avec des lettres entre les versions aussi, donc en suivant l'exemple ci-dessus « 1.24c » devrait être une version plus récente que « 1.24 » ou "1.24a".

Si vous disposez de plusieurs chemins de version (comme les versions bêta par exemple), vous pouvez utiliser plusieurs champs du fichier texte ou plusieurs fichiers. Cela peut être utile si vous ne souhaitez pas envoyer les versions instables à tous les utilisateurs, mais uniquement à ceux qui souhaitent utiliser ces versions.

S'il n'y a pas d'erreur lors de la lecture du fichier, vous pouvez également ajouter une vérification pour voir si le code d'état HTTP était 200 (OK) en utilisant la fonction HttpQueryInfo() avec l'indicateur HTTP_QUERY_STATUS_CODE.

Quoi qu'il en soit, tout cela est seulement pour être reconnu des nouvelles versions, vous pouvez simplement en informer vos utilisateurs via un message ou utiliser un schéma similaire pour télécharger la nouvelle application d'installation. Pour la phase d'authentification, vous pouvez ajouter au fichier de version une somme de contrôle du fichier d'installation et la calculer une fois le fichier téléchargé.

Liens vers la documentation en ligne sur l'API Wininet:

espoir qui aide.

+0

Merci, cela aide définitivement, +1. Je n'ai pas encore choisi la réponse, mais vu qu'il ne semble pas y avoir une bibliothèque capable de faire ce que je veux, je finirai probablement par l'implémenter moi-même, auquel cas j'accepterai cette réponse. – houbysoft

+0

A utilisé votre code comme point de départ pour ma propre bibliothèque pour cela - vous avez donné du crédit dans le fichier README, merci encore! Voir ma réponse pour plus de détails. – houbysoft

+0

Bien! Je suis content que ça te va. Comme vous continuez à l'améliorer, vous devrez faire face à des choses comme la gestion de proxy ou la récupération de fichiers FTP (en ce moment la connexion est un HTTP) par exemple, mais c'est un bon point de départ;). – Xandy

Questions connexes