Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum. Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

PARTAGE DE VARIABLES...


Information sur la source

Catégorie :API Classé sous : partage, variables, crypto, communication Niveau : Débutant Date de création : 19/09/2006 Date de mise à jour : 19/09/2006 15:14:00 Vu / téléchargé: 3 944 / 534

Note :
10 / 10 - par 5 personnes
10,00 / 10

  • 1

  • 2

  • 3

  • 4

  • 5

  • 6

  • 7

  • 8

  • 9

  • 10

Commentaire sur cette source (22)
Ajouter un commentaire et/ou une note


Description

Bonjour,

Suite a une demande sur le forum, je vous met ce code a disposition.

Il s'agit d'enregistrer en mémoire des valeurs (String) qui doivent être accessibles depuis chaque instance du programme.
Ici, on peut même y accéder depuis tout programme qui utilise la même MAPKEY (cf code de la classe)
 

Source

  • Private Values As SharedValues
  • Private Sub Form_Load()
  • Set Values = New SharedValues
  • End Sub
  • Private Sub CcTxtSource_Change()
  • Values("Text1") = CcTxtSource.Text
  • End Sub
  • Private Sub CcBtnRead_Click()
  • CcTxtResult.Text = Values("Text1")
  • End Sub
  • Private Sub CcTxtPassword_Change()
  • Values.Password = CcTxtPassword.Text
  • Values("Text1") = CcTxtSource.Text
  • End Sub
Private Values As SharedValues

Private Sub Form_Load()
    Set Values = New SharedValues
End Sub

Private Sub CcTxtSource_Change()
    Values("Text1") = CcTxtSource.Text
End Sub

Private Sub CcBtnRead_Click()
    CcTxtResult.Text = Values("Text1")
End Sub

Private Sub CcTxtPassword_Change()
    Values.Password = CcTxtPassword.Text
    Values("Text1") = CcTxtSource.Text
End Sub

Fichier Zip

Pour les "Membres Club", vous pouvez télécharger directement un fichier contenu dans le zip sans télécharger le zip en entier !

Télécharger le zip

Historique

19 septembre 2006 15:14:00 :
Ajout du cryptage des méthodes Load et Unload

Commentaires et avis

signaler à un administrateur
Commentaire de bouv le 19/09/2006 08:49:06

Trop 'Class' ^^

Merci

signaler à un administrateur
Commentaire de MadM@tt le 19/09/2006 12:55:11

Ah ouais c'est pas mal ça, je me suis toujours demandé comment faire

Par contre tu devrais peut etre appeler la source "partage de variables..." ça serait peut etre plus clair, car la j'avais aucune idée du code sur lequel j'allait tomber quand j'ai cliqué dessus (enfin j'ai vu renfield, j'ai pas hésité ^^)

++

signaler à un administrateur
Commentaire de violent_ken le 19/09/2006 13:39:11

Salut, je tombe sur cette source un peu par hasard (squattage du centre IF à midi, et titre  de la source qui m'a attiré) et je n'ai pas pu encore tester (cause of Linux), mais çà semble vraiment intéressant.
Il est clair que c'est beaucoup mieux que de créer un *.txt... ;)

@+

signaler à un administrateur
Commentaire de eldim le 20/09/2006 08:21:47

Bonjour,

C'est vraiment génial ce truc là !!!

Bravo

signaler à un administrateur
Commentaire de Warning le 20/09/2006 13:33:50 administrateur CS

Un seul mot: Super ! Et aussi super bonne idée.

signaler à un administrateur
Commentaire de Mayzz le 20/09/2006 18:39:21

Il y a aussi sous VB les fonctions SaveSetting et GetSetting pour ceux qui ne connaissent pas mais le principe est tout autre et l'on ne peut accèder à la configuration que par le proramme l'ayant enregistrer(pas de partage) mais ca évite API, registre et fichier, sinon bravo pour ce code ! Je trouve ca très utile.

signaler à un administrateur
Commentaire de violent_ken le 20/09/2006 18:41:26

"mais ca évite API, registre et fichier"

Le principe de SaveSettings et GetSettings est justement d'écrire dans le registre...

@+

signaler à un administrateur
Commentaire de CADRATURE le 21/09/2006 13:25:43

Super

signaler à un administrateur
Commentaire de Renfield le 21/09/2006 13:36:49 administrateur CS

ravi que ca plaise...

Il s'agissait, dans le cas de la demande du Forum, de mémoriser le Login/Pass... et de ne pas lui demander de montrer patte blanche a chaque   instanciation du programme

signaler à un administrateur
Commentaire de MadM@tt le 21/09/2006 19:07:16

Ah ouais mais dans ce cas ça crée un problème de sécurité la non ?
car soit y'a moyen de récupérer le mot de passe et le login,soit il s'agit d'une variable boolean genre true : loggé, false : pas loggé, mais dans ce cas y'a surement aussi moyen de récupérer sa valeur et de la modifier ? (c'est une question lol)

signaler à un administrateur
Commentaire de asimengo le 21/09/2006 20:42:21

@Renfield:
'# Pour que plusieurs programmes puissent échanger ces valeurs, il suffit de modifier la clé ci dessous :
Private Const MAPKEY As String = "SharedValues"

Peux-tu être plus clair sur ton commentaire ci-dessus.

signaler à un administrateur
Commentaire de bouv le 21/09/2006 20:57:58

ASIMENGO>>Il faut connaitre la valeur affectée à MAPKEY pour lire les valeurs. Si tu changes pour
Private Const MAPKEY As String = "MonLogiciel"
Seul celui qui cherche avec la valeur 'MonLogiciel' pourra lire ces données.

MADM@TT>>Renfield à dernièrement ajouté une fonction de cryptage des données pour mieux sécuriser le procédé.

signaler à un administrateur
Commentaire de MadM@tt le 21/09/2006 23:32:03

Ahhh ok ^^

signaler à un administrateur
Commentaire de Renfield le 22/09/2006 03:54:34 administrateur CS

on peux même en ouvrir un autre (un autre 'MAPKEY')
en utilisant la méthode Load....

reste que quelque soit son nom, en espionnant le logiciel, les APIs utilisées, etc, on pourras toujours trouver que le logiciel ouvre un File mapping (et même en obtenir le contenu).

comme le précise bouv, en ajoutant un Password (par le biai de la propriété du même nom), les données sont cryptées dans le file Mapping.
sans ce Password lors de la lecture...

signaler à un administrateur
Commentaire de asimengo le 22/09/2006 10:36:57

Par rapport au commentaire de MAYZZ, les clés et valeurs sont-elles conservées même après le redémarrage du PC?
Avec savesetting les clés et valeurs sont retrouvées même après le redémarage du PC.

Le file mapping est-il physique?

signaler à un administrateur
Commentaire de Renfield le 22/09/2006 10:43:57 administrateur CS

non...
si toutes les instances de la classe ShareValues sont coupées, on perds les infos...

vous pouvez sauvegarder le Stream, et de le restaurer a votre guise

signaler à un administrateur
Commentaire de Mayzz le 22/09/2006 12:03:38

violent_ken :

je voulais dire en fait que ça évite de taper les API pour accéder au registre. c'est juste des fonctions incluses dans vb ça évite de taper trop de code  =) Dsl je me suis mal exprimé

signaler à un administrateur
Commentaire de violent_ken le 22/09/2006 13:14:53

MAYZZ ==> Ok ;) Mais la méthode du SaveSettings (pour des sauvegardes temporaires) est quand même assez mauvaise (ajout de clés pas forcément utiles).
@+

signaler à un administrateur
Commentaire de bouv le 22/09/2006 14:58:52

Il me semble qu'il y ai un petit problème.

Dans Get Stream, si je met un point d'arret sur
CopyMemory ByVal sBuffer, ByVal pMem + 8, nLength

Je me rend compte que le Buffer est quasiment enregistré en clair. Ou du moins on peut distinguer mon Login et mon Password.

signaler à un administrateur
Commentaire de asimengo le 22/09/2006 19:16:55

@Renfield: ça te dirais t'ajouter des fonctions d'enregistrement/restauration du Stream? en espérant que ses infos soient illisibles dans le fichier.

signaler à un administrateur
Commentaire de bouv le 22/09/2006 23:04:26

ASIMENGO>>L'acces au stream est public...
Public Property Get Stream() As String
Public Property Let Stream(ByRef Value As String)

signaler à un administrateur
Commentaire de Renfield le 02/07/2008 15:20:53 administrateur CS

version .NET :  (pas forcément optimale, hein, je tatonne ^^)
mais ca fonctionne...

Imports System.Runtime.InteropServices

Public Class SharedValues
    ' Pour que plusieurs programmes puissent échanger ces valeurs, il suffit de modifier la clé ci dessous :
    Private Const MAPKEY As String = "SharedValues"
    ' Taille du tampon (8 Ko)
    Private Const MAPSIZE = &H2000&

    Private Const SECTION_MAP_READ As Integer = &H4
    Private Const SECTION_MAP_WRITE As Integer = &H2
    Private Const FILE_MAP_READ As Integer = SECTION_MAP_READ
    Private Const FILE_MAP_WRITE As Integer = SECTION_MAP_WRITE
    Private Const INVALID_HANDLE_VALUE As Integer = &HFFFFFFFF
    Private Const PAGE_READWRITE As Integer = &H4

    Private Declare Function CloseHandle Lib "kernel32.dll" (ByVal hObject As Integer) As Integer
    Private Declare Function CreateFileMapping Lib "kernel32.dll" Alias "CreateFileMappingA" (ByVal hFile As Integer, ByVal lpFileMappingAttributes As Integer, ByVal flProtect As Integer, ByVal dwMaximumSizeHigh As Integer, ByVal dwMaximumSizeLow As Integer, ByVal lpName As String) As Integer
    Private Declare Function MapViewOfFile Lib "kernel32.dll" (ByVal hFileMappingObject As Integer, ByVal dwDesiredAccess As Integer, ByVal dwFileOffsetHigh As Integer, ByVal dwFileOffsetLow As Integer, ByVal dwNumberOfBytesToMap As Integer) As Integer
    Private Declare Function OpenFileMapping Lib "kernel32.dll" Alias "OpenFileMappingA" (ByVal dwDesiredAccess As Integer, ByVal bInheritHandle As Integer, ByVal lpName As String) As Integer
    Private Declare Function UnmapViewOfFile Lib "kernel32.dll" (ByRef lpBaseAddress As IntPtr) As Integer
    Private Declare Sub ZeroMemory Lib "kernel32.dll" Alias "RtlZeroMemory" (ByVal Destination As IntPtr, ByVal Length As Integer)

    Private mhMap As Integer
    Private msName As String
    Private mnSize As Integer

    Public ReadOnly Property Name() As String
        Get
            Name = msName
        End Get
    End Property

    Public ReadOnly Property Size() As Integer
        Get
            Size = mnSize
        End Get
    End Property

    Public Sub New()
        Load(MAPKEY, MAPSIZE)
    End Sub

    Public Sub New(ByRef vsName As String)
        Load(vsName, MAPSIZE)
    End Sub

    Public Sub New(ByVal vnSize As Integer)
        Load(MAPKEY, vnSize)
    End Sub

    ' Cette méthode permet de changer de mappage, ou de changer la taille de celui-ci...
    Public Sub New(ByRef vsName As String, ByVal vnSize As Integer)
        Load(vsName, vnSize)
    End Sub

    Private Sub Load(ByRef vsName As String, ByVal vnSize As Integer)
        Dim pMem As IntPtr
        ' Si un mappage est ouvert, on le ferme...
        If mhMap Then
            CloseHandle(mhMap)
        End If

        ' On enregistre le nom du mappage
        msName = vsName
        ' Et on tente d'ouvrir le mappage
        mhMap = OpenFileMapping(FILE_MAP_READ Or FILE_MAP_WRITE, 0, msName)
        If mhMap = 0 Then
            ' Le mappage n'existe pas ?
            ' Nous allons donc le créer. Il aura la taille demandée par l'utilisateur.
            mnSize = vnSize
            ' Création du mappage
            mhMap = CreateFileMapping(INVALID_HANDLE_VALUE, 0, PAGE_READWRITE, 0, mnSize, msName)
            If mhMap Then
                ' Le premier Integer dans le fichier sera la taille du mappage.
                ' Tout le reste est remplit par des 0
                pMem = MapViewOfFile(mhMap, FILE_MAP_WRITE, 0, 0, 0)
                If pMem Then
                    Marshal.WriteInt32(pMem, 0, mnSize)
                    ZeroMemory(New IntPtr(pMem.ToInt32 + 4), mnSize - 4)
                    UnmapViewOfFile(pMem)
                End If
            End If
        Else
            ' Le mappage existe déjà. Nous lisons la taille de celui-ci
            pMem = MapViewOfFile(mhMap, FILE_MAP_READ, 0, 0, 0)
            If pMem Then
                mnSize = Marshal.ReadInt32(pMem, 0)
                UnmapViewOfFile(pMem)
            End If
        End If
    End Sub

    Public Sub Unload()
        ' Fermeture du mappage
        If mhMap Then
            CloseHandle(mhMap)
            mhMap = 0
        End If
    End Sub

    ' Permet de récupérer une valeur en particulier du Stream.
    Public Property Value(ByVal vsName As String) As String
        Get
            Value = vbNullString
            Try
                For Each sPair As String In Stream.Split(vbNullChar)
                    If sPair.StartsWith(vsName & "=") Then
                        Value = sPair.Substring(vsName.Length + 1)
                        Exit For
                    End If
                Next sPair
            Catch e As NullReferenceException
            End Try
        End Get
        Set(ByVal value As String)
            Try
                Dim xsParts() As String = Stream.Split(vbNullChar)
                For i As Integer = 0 To xsParts.GetUpperBound(0)
                    If xsParts(i).StartsWith(vsName & "=") Then
                        ' Sinon, on modifie l'élement de notre tableau
                        xsParts(i) = vsName & "=" & value
                        ' Et on reconstruit le Stream
                        Stream = Join(xsParts, vbNullChar)
                        Exit Property
                    End If
                Next i
                Stream = Join(xsParts, vbNullChar) & vbNullChar & vsName & "=" & value
            Catch e As NullReferenceException
                Stream = vsName & "=" & value
            End Try
        End Set
    End Property

    ' Permet de récupérer le Stream enregistré dans le mapping
    Public Property Stream() As String
        Get
            Dim pMem As IntPtr

            Stream = vbNullString
            pMem = MapViewOfFile(mhMap, FILE_MAP_READ, 0, 0, 0)
            If pMem Then
                ' On récupère la taille effective des données
                Dim nLength As Integer = Marshal.ReadInt32(pMem, 4)
                If nLength > 0 Then
                    Dim xbData As Char() = New String(" ", nLength).ToCharArray
                    Marshal.Copy(New IntPtr(pMem.ToInt32 + 8), xbData, 0, nLength)
                    Stream = New String(xbData, 0, nLength)
                End If
                UnmapViewOfFile(pMem)
            End If
        End Get
        Set(ByVal value As String)
            Dim pMem As IntPtr
            pMem = MapViewOfFile(mhMap, FILE_MAP_WRITE, 0, 0, 0)
            If pMem Then
                Dim xbData As Char() = value.ToCharArray
                ' On regarde si le mapping est assez grand pour contenir les données
                If xbData.Length < mnSize Then
                    ' Tous les autres bits sont remis à 0
                    ZeroMemory(New IntPtr(pMem.ToInt32 + 8 + xbData.Length), mnSize - 8 - xbData.Length)
                    ' On ajoute la taille des données en début de mapping (après la taille du mapping)
                    Marshal.WriteInt32(pMem, 4, xbData.Length)
                    ' Et, s'il y a des données, on les ajoutes dans le mapping
                    If xbData.Length > 0 Then
                        Marshal.Copy(xbData, 0, New IntPtr(pMem.ToInt32 + 8), xbData.Length)
                    End If
                End If
                UnmapViewOfFile(pMem)
            End If
        End Set
    End Property
End Class

Ajouter un commentaire

Discussions en rapport avec ce code source dans le forum

Partage de variable entre plusieurs applications [ par CochonPerdu ] Bonjour, Tout d'abord, je sais que cette question a plus ou moins déjà été posée mais elle est vieille (mois de Janvier) et je doute recevoir un jour Partage intempestif de variables statiques entre deux instances. [ par g_clairet_2 ] Bonjour, Je suis en stage et ça fait que 4 mois que je débute sur vb6. Je dois faire une appli qui lance une deuxième instance d'elle-même au démarr PARTAGE DE VARIABLES ENTRE INSTANCES [ par bouv ] Bonjour,Je cherche à partager des valeurs entre 2 instances d'une application en VB.Net.Si la question n'est pas très clair vous pouvez jetter un oeil Partage de variables.... [ par cyrilp ] Messieurs, mesdames,J'ai une grande question pour vous...Est-il possible de partager une variable entre plusieurs applications (VB ou pas VB d'ailleur Partage avec les api [ par LoupBlanc ] Existe t il une API capable de partager des répertoire, a l'instar de la commande net share de dos.Merci à tous. Communication modem [ par kalin ] Salut,Comment dois-je faire pour récupérer le numéro de téléphone de la personne qui m'appelle ?merci Very Mega Super URGENT !!! Partage [ par LoupBlanc ] Existe t il une dll qui permette de partager un repertoir.Merci de votre aide COMMENT CONCATENER UNE VARIABLE ? [ par Nadscript ] Salut toous le monde !je cherche à faire une concatène d'une variable pour créer des variables dynamiquement.par exemple: j'ai plusieurs variables qui envoyer des variables dans une autre form appartenant au meme projet [ par andrea06 ] Bonjour,Comme le dit le titre de mon message je voudrais envoyer la valeur de trois variables que j'ai dans une form1 dans une form2 du meme projet?co OCX Multi-instances [ par Rene ] J'ai créé un contrôle ActiveX qui utilise des Form se partageant des variables publiques d'un module.Pb dans un projet utilisant plusieurs instances d


Nos sponsors

Sondage...

CalendriCode

Juillet 2009
LMMJVSD
  12345
6789101112
13141516171819
20212223242526
2728293031  

Consulter la suite du CalendriCode

Téléchargements

Logiciels à télécharger sur le même thème :

Comparez les prix Nouvelle version

Photothèque Nouveau !



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés
Temps d'éxécution de la page : 0,889 sec

Google Coop CodeS-SourceS Google Coop CodeS-SourceS


Certaines images présentes sur le site (notament certains avatars) sont issues des collections IconShock, donc si vous souhaitez utiliser ces icons vous devez les acheter, ne les copiez pas et ne utilisez pas dans vos sites et applications sans les avoir commandé.