2010-03-01 6 views
1

Dans une application que je développe (en C), une application de chargement doit d'abord être exécutée avant que l'application principale ne soit exécutée. J'ai fait en sorte que l'application principale exécute l'application Loader comme un enfant quand il est lancé afin d'automatiser cette tâche. Tout cela fonctionne bien, sauf que l'application loader ne doit être exécutée qu'une seule fois pendant la session de connexion actuelle de l'utilisateur pour que l'application principale fonctionne correctement, et avoir à l'exécuter chaque fois que l'application principale s'exécute est une réelle douleur. Donc ce que je demande est: est-il un moyen de vérifier si le chargeur a déjà été exécuté en utilisant des fonctionnalités Windows ou C? Idéalement quelque chose comme ça serait génial, même si je ne sais pas s'il est même possible:Comment vérifier si un programme a déjà été exécuté pendant la session de connexion en cours? (Windows)

if(thisapp.exe hasBeenExecuted) 
    return; 
else 
    spawnl(app_path, app_name, args, NULL); 

Ou peut-être quelque chose comme ayant l'application principale de créer un fichier fictif qui agit comme un drapeau lorsque le chargeur est exécuté. Ensuite, lors des exécutions suivantes, vérifiez si le fichier existe et exécutez le chargeur si ce n'est pas le cas. Le seul problème avec cela est l'automatisation de sorte que le fichier fictif est effacé lorsque l'ordinateur est éteint (existe-t-il un moyen de le faire?).

Quelques précisions: Je ne peux pas éditer l'application loader ou répliquer ses fonctionnalités dans l'application principale, je ne l'ai pas écrite.

Merci à l'avance pour toute aide

Répondre

1

Vous pouvez également utiliser les fonctions de l'atome sans avoir à lire/écrire un fichier énorme

http://msdn.microsoft.com/en-us/library/ms649053%28VS.85%29.aspx

+0

Cela a fonctionné parfaitement, merci! Cela fonctionne bien dans Windows XP, mais savez-vous si la fonctionnalité est altérée dans toutes les autres distributions Windows? –

+0

Je suppose que les choses win32 seraient les mêmes pour NT à la hausse. Il y avait des trucs atomiques jusqu'à Win 3.x mais je ne me souviens pas s'il y avait des paramètres différents ou pas. Essayez ceci (devrait toujours fonctionner sous XP tel quel) http://ghirai.com/hutch/files/win32hlp_big.zip –

2

Il y a deux manières de le faire. Votre application pourrait ajouter une entrée à Run key. Cela garantit qu'il est exécuté au moins une fois par session, lorsque l'utilisateur se connecte. Vous pouvez lui passer un argument de ligne de commande spécial dans ce cas pour le distinguer des relances. Une autre option peut être de stocker votre état dans la ruche utilisateur actuelle et de créer la clé avec l'indicateur REG_OPTION_VOLATILE. Cela provoque le stockage de la clé uniquement en mémoire et ne sera pas vidée sur le disque lorsque la ruche est déchargée, ce qui devrait se produire lorsque l'utilisateur se déconnecte.

0

Une suggestion que j'ai vu utilisé dans le passé est d'exécuter une application à partir de l'utilisateur-ruche (c'est-à-dire le registre) sur le chargement qui supprime votre fichier (ou alternativement, le crée). L'avantage est que cela peut être aussi simple qu'un script shell (fichier batch) qui s'exécute au démarrage (ou le chargement du profil utilisateur, selon l'endroit où vous vous connectez) et devrait dans la plupart des cas être exécuté une fois (soit au démarrage, soit au login)). Si vous avez choisi la connexion, elle peut (sera) exécutée chaque fois que l'utilisateur se connecte à la machine après s'être déconnecté.

Vous pouvez également le faire lors de la déconnexion de l'utilisateur, bien que ce soit moins fiable car vous ne connaissez pas toujours l'état de la machine lorsque la ruche est déchargée (panne, panne de courant, etc.).

Ce n'est pas une façon complète de le faire, et cela ne fonctionnera que sur Windows, mais dans la plupart des scénarios d'utilisation normale, cela fonctionnerait. Comme alternative, vous pouvez écrire un horodatage dans un fichier et lorsque vous le chargez, obtenez l'horodatage et vérifiez s'il est inférieur à la durée de connexion de l'utilisateur actuel. Si c'est le cas, vous pouvez ignorer la charge car elle s'est probablement produite pendant la session des utilisateurs en cours.

Encore une fois, il y a quelques inconvénients à cela, mais cela devrait fonctionner raisonnablement bien aussi.

0

Qu'est-ce que l'application de chargeur faire, cela signifie qu'il doit être exécuté en premier?

Il me semble que la bonne réponse est de vérifier et voir si cela a été fait, puisque c'est ce qui vous intéresse vraiment. Tout le reste est susceptible d'être fragile et de casser dans les cas de coin.

0

Je l'ai implémenté dans le passé en utilisant un Mutex.

Par exemple:

int main(int argc, char argv[][]) 
{ 
    // if Mutex exists 
    // { 
    //  Don't allow a second instance to run: 
    //  Notify user, log something, etc. 
    //  return 0; 
    // } 
    // else 
    // { 
    //  Create Mutex, this is the first time running 
    // } 

    // Rest of your program runs from here . . . 
} 

-bn

Questions connexes