Public shared sans module - variable singleton : identification d'instance d'objets

3/5 (6 avis)

Vue 4 137 fois - Téléchargée 328 fois


Description

un nom un peu barbare pour dire en fait : utiliser une variable entre différentes instances d'un objet

lorsque votre projet (form par exemple) utilise plusieurs instances d'une class ou d'un usercontrol, comment cet objet peut-il savoir laquelle de ces instances il représente?

c'est ici le but de cette source, un identifiant "unique" incrémentable, décrémentable, partagé entre un ou plusieurs modèles

le code est à copier directement dans votre objet

explications plus détaillées fournies avec le projet, code abondamment commenté

vous pouvez adapter le code sans trop de difficultés

Source / Exemple :


Private Function ReadMappingValue(ByVal hFileMappingObject As Long, ByRef lValue As Long) As Boolean
    If hFileMappingObject = 0 Then
'       mauvais param, renvoyé par le précédent CreateFileMapping
        Debug.Print "Erreur lors du CreateFileMapping"
    Else
        Dim lMVF As Long
        lMVF = MapViewOfFile(hFileMappingObject, FILE_MAP_READ, 0&, 0&, 0&)
        If lMVF = 0 Then
            Debug.Print "Erreur lors du MapViewOfFile"
        Else
'           lecture de la valeur
            Call CopyMemory(lValue, ByVal lMVF, 4&)
            
'           fermeture de la vue
            Call UnmapViewOfFile(lMVF)
            ReadMappingValue = True
        End If
    End If
End Function

Private Function WriteMappingValue(ByVal hFileMappingObject As Long, ByRef lValue As Long) As Boolean
    If hFileMappingObject = 0 Then
'       mauvais param, renvoyé par le précédent CreateFileMapping
        Debug.Print "Erreur lors du CreateFileMapping"
    Else
        Dim lMVF As Long
        lMVF = MapViewOfFile(hFileMappingObject, FILE_MAP_WRITE, 0&, 0&, 0&)
        If lMVF = 0 Then
'           erreur
            Debug.Print "Erreur lors du MapViewOfFile"
        Else
'           écriture de la valeur
            Call CopyMemory(ByVal lMVF, lValue, 4&)

'           fermeture de la vue
            Call UnmapViewOfFile(lMVF)
            WriteMappingValue = True
        End If
    End If
End Function

Conclusion :


merci à Renfield pour sa source PrevInstance qui m'a permis de comprendre le filemapping

Codes Sources

A voir également

Ajouter un commentaire Commentaires
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
28 juil. 2009 à 11:42
Excellent, Messire PCPT.
Voilà la méthode que j'aurai dû utiliser dans mon SysTray pour déterminer les constantes de Timer (instances multiples d'un UserControl) - Je la mettrais à jour ASAP.
C'est propre.
Merci.
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
28 juil. 2009 à 13:07
Voilà, je n'ai pas résisté longtemps pour mettre en application : http://www.vbfrance.com//code.aspx?ID=50355
Merci PCPT
Cette solution est quand même plus 'pro'
cs_Jack Messages postés 14007 Date d'inscription samedi 29 décembre 2001 Statut Modérateur Dernière intervention 28 août 2015 79
28 juil. 2009 à 17:15
Un petit détail qui a son importance :
La variable commune gérée ici perd sa valeur une fois que les objets qui lui faisait référence ont tous disparus.
En d'autre terme, cette variable ne vit que si au moins un objet y est rattaché.
PCPT Messages postés 13280 Date d'inscription lundi 13 décembre 2004 Statut Membre Dernière intervention 3 février 2018 47
28 juil. 2009 à 21:42
merci pour ton comm et ta note Jack ;)
content que çà te plaise et te serve

pour ton "détail", c'est normal (le dernier objet décrémentant ferme le mapping, c'est le but :p). le "1" n'a pas besoin de savoir qu/s'il y en a eu d'autres avant lui, tant qu'il est bien unique. à moins que j'ai mal compris ta remarque

bon dev ;)
nicolasq150784 Messages postés 51 Date d'inscription mercredi 24 juin 2009 Statut Membre Dernière intervention 23 avril 2010
23 avril 2010 à 14:20
Il est ou le .sln ?

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.