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 !

Sujet : PARTAGE DE VARIABLES ENTRE INSTANCES [ Divers / General ] (bouv)

mercredi 2 juillet 2008 à 11:25:15 | PARTAGE DE VARIABLES ENTRE INSTANCES

bouv

Membre Club
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 à la source de Renfield qui fait exactement ce que je souhaite mais en VB6 (et que je n'arrive pas à passer en .NET)

Merci d'avance

Bonne prog
++

mercredi 2 juillet 2008 à 13:17:07 | Re : PARTAGE DE VARIABLES ENTRE INSTANCES

Renfield

Administrateur CodeS-SourceS
le portage semble possible... (je suis en train de le faire)

une fois les conversions classqiues faires (Property a replacer, Long => Int)
etc
le délicat concerne ici les CopyMemory.

j'ai là viré la partie Cryptage...

mercredi 2 juillet 2008 à 13:31:53 | Re : PARTAGE DE VARIABLES ENTRE INSTANCES

bouv

Membre Club
Salut,

Oui en effet le gros problème vient de CopyMemory et ZeroMemory

La partie cryptage n'est effectivement pas quelques chose de nécessaire dans cette classe. Chacun restant libre de crypter ces données avant de les envoyer au stream.

En tout cas il s'agit d'une super nouvelle si tu entreprends cette conversion car je m'y suis cassé les dents et c'est quelque chose auquel je tenais.

Tiens moi au courant.

Bonne prog
++

mercredi 2 juillet 2008 à 14:17:20 | Re : PARTAGE DE VARIABLES ENTRE INSTANCES

Renfield

Administrateur CodeS-SourceS
j'ai réussi.... reste à .Netiser un peu plus la chose


les CopyMemory virés, remplacés par des :
' On ajoute la taille des données en début de mapping (après la taille du mapping)
Marshal.WriteInt32(pMem, 4, nLength)

pMeme en IntPtr, les autres Long en Integer...

et quelques astuces de cet acabi

mercredi 2 juillet 2008 à 14:21:14 | Re : PARTAGE DE VARIABLES ENTRE INSTANCES

bouv

Membre Club
Tu es un chef.

J'attend avec impatience la version ".Netisée"

Bonne prog
++

mercredi 2 juillet 2008 à 15:20:56 | Re : PARTAGE DE VARIABLES ENTRE INSTANCES

Renfield

Administrateur CodeS-SourceS
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



Cette discussion est classé dans : net, variables, partage, instances


Répondre à ce message

Sujets en rapport avec ce message

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 Comment faire des variables globales en vb.net [ par novicevb ] J'ai une variable publique dans un login. J'ai déclarer un module pour sauvegarder ma valeur. Et je perd la valeur de ma variable dans le module et da Les variables d'environnement en VB.net [ par sebaznar ] Salut,J'ai besoin de modofier les variables d'environnement pendant l'éxécution d'un programme; et que ces modifs soient de suite prises en compte par variables d'environnement avec VB.NET [ par sebaznar ] Je veux modifier les variables d'environnement au vours d'un programme et que ce dernier ait pris les modifications en compte ...Salut. Partage de modules en .NET [ par Spip ] Spipje souhaiterais partager Un module dans plusieurs programmes. Ceci etai faisable facilement en VB6 (voirlien sur ce site) http://www.vbfrance.com/ Variables globales en VB.NET [ par mastercatz ] BonjourJe n'arrive pas à declarer des variables communes à tous mes forms dans un programme. Les var sont publiques mais impossible de les voir à part Emplacement de mes projet dans VB.net [ par David2410 ] Bonjour, J'ai créer un nouveau projet dans Visual Studio .net sur un partage réseau.Lorsque je l'ouvre j'ai un message qui m'averti que le projet se t [.NET] Modifier une collection [ par niluje ] Je souhaiterai modifier une collection, mais je bute sur un problème.En effet dans cette collection je place des instances de classes. Et donc en fait Passage de variables en form en vb.net [ par hotips ] Bonjour tout le monde, J'ai un problème pour passer une variable entre deux fenetres (form) sous vb.net. Sous vb6 tout était facile, ici ca ne foncti VB .NET partage d'application [ par VenCYcloP ] Bonjour, mon programme utilise deux fichier .dll du framework, est-il possible de faire partager ce programme sur d'autre ordi qui n'ont pas le fram


Nos sponsors

Sondage...

CalendriCode

Décembre 2008
LMMJVSD
1234567
891011121314
15161718192021
22232425262728
293031    

Consulter la suite du CalendriCode

Téléchargements

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



Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel BAÏSE, 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,390 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é.