|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Membre régulier
![]() Inscription : novembre 2010 Messages : 101 ![]() |
Bonjour,
Lorsque je travaillais en ACC97, j'avais trouvé ce code qui fonctionnait bien afin d'éviter le lancement de plusieurs instances de mon application. Voici le code : Code :
Code :
Code :
varCanalDDE = DDEInitiate("MSAccess", strNomApplication) Le code a t-il changé avec ACC2010 ? Est ce un problème de réferences ? Elles sont cochées dans cet ordre:
Comme toujours d'avance merci |
||||
|
|
00
|
|
|
#2 | ||
![]() ![]() Maintenance données produits Inscription : décembre 2005 Messages : 3 939 ![]() |
Bonsoir,
Il ne doit pas s'agir d'un problème de référence puisque DDEInitiate et DDETerminate font partie du modèle objet Access. Ne connaissant rien à DDE je vais te proposer une solution alternative : Compter le nombre d'instances d'Access ayant ouvert la base de données. Code :
Si l'application exécute cette fonction en fournissant son propre nom complet, la valeur retournée sera 1 pour la première instance, 2 pour la deuxième, etc ... Donc si ... Code :
NbBaseInstances(Application.CurrentProject.FullName) A+ |
||
|
|
00
|
|
|
#3 |
|
Membre régulier
![]() Inscription : novembre 2010 Messages : 101 ![]() |
Bonjour LedZeppII et merci beaucoup pour la réponse,
Le problème c'est que cela ne fonctionne pas comme prévu ! J'ai essayé de décortiquer (autant que mes compétences me le permettent ) et j'ai constaté ceci :
J'ai pu décortiquer mais je ne suis pas suffisamment bon pour modifier... Merci pour un coup de pouce supplémentaire |
|
|
00
|
|
|
#4 | ||
![]() ![]() Maintenance données produits Inscription : décembre 2005 Messages : 3 939 ![]() |
Bonjour,
Très bon décorticage Le problème est que oProc.CommandLine ne retourne pas la même chose que chez moi. Et je ne vois pas pourquoi. Chez moi (Win XP / Acc.2007) oProc.CommandLine (la ligne de commande qui a servi à ouvrir la base de données) peut prendre deux formes : Citation:
Citation:
Conclusion : cette méthode n'est pas universelle. Désolé pour la fausse piste. En regardant de plus près ton premier message, je trouve très étrange que l'erreur n'ai pas été interceptée par L'erreur que tu cites est sensée se produire quand il n'y a qu'une seule instance de l'application, et être interceptée par le «On Error Resume Next». A+ |
||
|
|
00
|
|
|
#5 |
|
Membre régulier
![]() Inscription : novembre 2010 Messages : 101 ![]() |
Bonjour
Et encore merci pour l'interet que tu portes à mon problème. ![]() Je travaille en WinXP + ACC2010 et la db est destinée à tourner avec un runtime. En ce qui concerne mon 1er message j'avais bêtement fait un copier coller sur le site dont je fait réference. Ce code fonctionnait sur des versions précédentes avant 2003. Je laisse le fil ouvert des fois que quelqu'un aurrait une autre idée ... A votre bon coeur m'seuirs dames !! @+ |
|
|
00
|
|
|
#6 | ||
|
Expert Confirmé
![]() Diem VOVivre Inscription : avril 2006 Messages : 2 644 ![]() |
salut LedZeppII
toujours dans l'alternatif: Code :
donne le nombre de fenetre incluant en titre le texte 'montitre' |
||
|
|
00
|
|
|
#7 | ||
|
Membre régulier
![]() Inscription : novembre 2010 Messages : 101 ![]() |
Merci vodiem pour l'intéret porté à ma question
mais ...... pas mieux En effet, quelque soit le nombre de fois ou mon .accdb est lancé, la routine n'entre pas dans le : Code :
D'autre part à quoi sert Code :
ret = GetWindowText(hWnd, Titre_Fenetre, 255) J'ai également essayé de décortiquer cette fonction mais avec mon niveau je ne pige pas tout ![]() Merci encore !! |
||
|
|
00
|
|
|
#8 |
|
Expert Confirmé
![]() Diem VOVivre Inscription : avril 2006 Messages : 2 644 ![]() |
oui, tu peux zapper cette déclaration, j'ai épuré un code. ret doit être un nombre. il donne le length du titre pour tronquer Titre_Fenetre qui est préformaté à 255 caractères.
il te suffit pour trouver le bon titleName de rajouter une ligne au dessus du if du genre: pour lister l'ensemble des titres des fenêtres et trouver le bon titre de ton appli. |
|
|
00
|
|
|
#9 |
|
Membre régulier
![]() Inscription : novembre 2010 Messages : 101 ![]() |
Merci à tous pour vos réponses
![]() Cela ne fonctionne pas comme imaginé. Je vais donc pesser aux drogues dures |
|
|
00
|
|
|
#10 |
|
Expert Confirmé
![]() Diem VOVivre Inscription : avril 2006 Messages : 2 644 ![]() |
on t'as pas proposé:
-le controle du fichier d'ouverture d'accès au fichier (.laccdb pour acc2007) -utiliser un flag: une variable d'environnement/variable access/fichier... qui sont les solutions classique et plus facile mais peuvent engendrer des pb s'il y a un bug et que le flag n'est pas retiré. éventuellement fait une recherche au niveau système: y a longtemps de ca (windows 3..) on pouvait stipuler au système si un exécutable pouvait avoir qu'une seule instance: l'exécution d'une deuxième ré-affichait la première. avec la compatibilité ascendante il se peut qu'ils ont conserver cela mais malheureusement c'est trop vieux pour que je m'en souvienne. fais éventuellement un tour dans le forum approprié. bon courage, |
|
|
10
|
|
|
#11 |
![]() ![]() Maintenance données produits Inscription : décembre 2005 Messages : 3 939 ![]() |
Bonsoir JeanYves70, Bonsoir Vodiem
,Il y a une méthode qui fonctionne mais dont le message d'erreur est peu parlant : Code :
CurrentProject.Connection.Properties("Jet OLEDB:Connection Control") = 1 jusqu'à ce que le fichier de verrouillage (.ldb ou .laccdb) soit détruit. A+ |
|
|
10
|
|
|
#12 | |||
|
Membre Expert
![]() Michel Ingénieur développement logiciels Inscription : mai 2005 Messages : 1 584 ![]() |
bien le bonsoir à tous
voici une solution que j'ai utilisé dans le passé et qui me donnait satisafaction mettre dans uns module : Code :
Citation:
__________________
"tout le monde veut sauver la planète, mais personne ne veut descendre les poubelles." J Yanne |
|||
|
|
10
|
|
|
#13 |
|
Membre régulier
![]() Inscription : novembre 2010 Messages : 101 ![]() |
Bonjour à tous les 3,
Encore merci de l'intérèt que vous portez à mon problème.La solution à micniv fonctionne trés bien mais agit sur l'EXE et pour moi l'objectif initial était d'agir plutot sur le .mde ou en l'occurence pour 2010 sur l' .accde. Comme vous l'avez constaté le long des différents messages je décortique vos solutions afin de les adapter mais celle de micniv est plutot compliquée pour moi, l'autodidacte, cela va prendre du temps. |
|
|
00
|
|
|
#14 |
![]() ![]() Maintenance données produits Inscription : décembre 2005 Messages : 3 939 ![]() |
|
|
|
00
|
|
|
#15 |
|
Membre régulier
![]() Inscription : novembre 2010 Messages : 101 ![]() |
bonjour,
oui bien sur j'ai testé. Elle fonctionne bien et effectivement le message n'est pas trés parlant. C'est un peu dommage car j'aime bien pauffiner et indiquer un message parlant a mes utilisateurs. Mais c'est pas grave et je vais retenir ta solution. Par contre encore merci beaucoup pour toutes les réponses Cordialement JY |
|
|
00
|
|
|
#16 | ||||||
![]() ![]() Maintenance données produits Inscription : décembre 2005 Messages : 3 939 ![]() |
Bonjour,
Comme l'avais suggéré Vodiem, on peut aussi analyser le contenu du fichier de verrouillage (.ldb ou .laccdb). C'est une méthode que j'ai employée il y a longtemps pour simuler un mode exclusif. A chaque nouvelle connexion à une base de données Access, une entrée est ajoutée dans le fichier de verrouillage. Le principe de mon code est que le fichier de verrouillage ne doit pas contenir plus d'une entrée. Cette fonction est appelée par mon code : Code :
Code :
Si le nombre est supérieur à 1, la fonction renvoie un message avec le nom d'utilisateur Access et le nom de l'ordinateur de la première connexion. S'il n'y a qu'une connexion la fonction renvoie une chaîne vide. Au démarrage de mon application j'appelle la fonction VerifLDB() et je stocke le résultat dans une variable String. Je teste ensuite la longueur de cette variable. Egale à 0 -> Ok Supérieure à 0 -> j'affiche un message et je ferme l'application. Exemple : Code :
Le fichier de verrouillage peut contenir des entrées correspondant à des connexions fermées. Dans ce cas de figure mon code ne fonctionne pas. Il verra plus d'une connexion même s'il n'y en a qu'une de réellement active. Mais ça devrait suffire pour ton besoin. A+ |
||||||
|
|
10
|
|
|
#17 |
|
Membre régulier
![]() Inscription : novembre 2010 Messages : 101 ![]() |
Alors la je dis : Monsieur LedZeppII
![]() J'avais bien compris qu'il fallait chercher en direction du .ldb ou .laccdb mais j'étais bien loin de ce résultat. Non seulement ton code suffit à mon besoin mais il est au poil pour ce que je souhaite faire. Super et je te remercie encore pour l'intéret porté à mon problème et pour la persévérence de tes réponses.Merci et certainement à trés bientôt sur le forum |
|
|
00
|
|
|
#18 |
|
Expert Confirmé
![]() Diem VOVivre Inscription : avril 2006 Messages : 2 644 ![]() |
salut LedZeppII
, micniv et JeanYves70 après qq recherche il s'avère que l'idéal: trouver si le fichier est ouvert est assez difficile. d'après une source que j'ai trouvé (qui le permet en C), s'il n'est pas difficile d'obtenir les exécutables, la table contenant la structure de leurs fichiers ouverts pointe sur une adresse mémoire inaccessible directement: ce qui rends le codage plus complexe. un utilitaire permet d'obtenir cela en ligne de commande: "handle" de SYSINTERNALS. il serait possible ainsi en traitant le résultat renvoyé, de définir plus simplement si le fichier est ouvert mais il faudrait lever le message d'avertissement d'exécution "en tant qu'administrateur" :/ comme dit le proverbe sur les "handles" : jeux de main, jeux de vilain... ^^ mieux vaut donc se contenter des solutions plus conventionnelles. |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com