IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Windows Presentation Foundation Discussion :

Communication entre vb6 et wpf.


Sujet :

Windows Presentation Foundation

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Par défaut Communication entre vb6 et wpf.
    Bonjour à tous,

    à l'origine j'ai une appli vb6, celle ci appel une appli flash qui par la méthode fscommand renvoi des infos à l'application vb6.
    Je suis en train de remplacer l'appli flash par une appli wpf mais je n'ai pas encore trouvé le moyen pour retourner des infos à l'appli vb6.

    Auriez vous une solution, une piste ou une idée s'il vous plait?

    Merci.

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    Salut,

    J'ai bien trouvé quelque chose sur de l'interop vb6 / .net :
    http://blogs.microsoft.co.il/blogs/l...9/23/3323.aspx

    Je ferais pas mieux sur ce sujet
    Bon courage.

  3. #3
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Par défaut
    Sinon, tu dois pouvoir rajouter une passerelle supplémentaire en WindowsForms:

    VB 6 => .NET / WinForms => WPF

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Par défaut
    Merci des réponses.

    Citation Envoyé par Thomas Lebrun Voir le message
    Sinon, tu dois pouvoir rajouter une passerelle supplémentaire en WindowsForms:

    VB 6 => .NET / WinForms => WPF
    Du style:
    VB6 appel un WindowsForm qui lance le wpf.
    Le WindowsForm récupère un évènement du wpf et prévient le vb6.
    ?
    Donc il me reste à savoir comment:
    VB6 appel un WindowsForm qui ...
    ... prévient le vb6.d'un évènement particulier avec passage d'argument
    Bon je vais travailler sur ça.
    Si quelqu'un a une piste je suis quand même preneur

    PS:
    Sinon, pourquoi se serait faisable en WinForms et non en WPF?
    Les deux utilisent le même framework non?
    Les principales différences sont surtout situés au niveau graphique non?

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Par défaut
    En gros, tu veux faire de la communication entre les deux (appli wpf et appli vb6) et dans les deux sens, c'est ça ?

    Dans ce cas, ce post explique comment faire.

    La méthode mise en place dans la réponse, on voit un override de la méthode WndProc, or WndProc n'a pas vraiment d'équivalent en WPF. La solution est donc WinForm.
    Ceci dit ce lien peut peut-être te permettre de le faire en WPF (à voir) :
    http://www.steverands.com/2009/03/19...proc-wpf-apps/

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Par défaut
    Merci Binoo.

    Citation Envoyé par binoo Voir le message
    En gros, tu veux faire de la communication entre les deux (appli wpf et appli vb6) et dans les deux sens, c'est ça ?
    Oui en gros.
    Depuis vb6 appeler une appli wpf où l'utilisateur ferait sa petite soupe, puis clique sur un bouton ok, et l'appli vb6 récupère le résultat de la petite soupe.
    Ce qui manque au vb6 c'est la gestion d'évènement quoi.

    Bref je vais voir ce que tu m'as passé.

  7. #7
    Membre éclairé
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    537
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 537
    Par défaut
    J'ai essayé ceci:

    VB6 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
     
    Option Explicit
     
    '////////////////////////////////////////////////////////////////////////////////////////////////////
    Const WM_APP As Long = 32768
    Private Const GWL_WNDPROC = (-4)
    Private procOld As Long
     
    Private Declare Function CallWindowProc Lib "USER32.DLL" Alias "CallWindowProcA" _
        (ByVal lpPrevWndFunc As Long, ByVal hWnd As Long, ByVal uMsg As Long, _
        ByVal wParam As Long, ByVal lParam As Long) As Long
     
    Private Declare Function SetWindowLong Lib "USER32.DLL" Alias "SetWindowLongA" _
        (ByVal hWnd As Long, ByVal nIndex As Long, ByVal dwNewLong As Long) As Long
     
    Private Declare Sub CopyMemory Lib "KERNEL32.DLL" Alias "RtlMoveMemory" _
        (ByVal pDst As Long, ByVal pSrc As Long, ByVal ByteLen As Integer)
     
    Private Declare Sub ZeroMemory Lib "KERNEL32.DLL" Alias "RtlZeroMemory" _
        (ByVal pDst As Long, ByVal ByteLen As Integer)
     
    Public Sub SubclassWindow(ByVal hWnd As Long)
        procOld = SetWindowLong(hWnd, GWL_WNDPROC, AddressOf SubWndProc)
    End Sub
     
    Public Sub UnsubclassWindow(ByVal hWnd As Long)
        procOld = SetWindowLong(hWnd, GWL_WNDPROC, procOld)
    End Sub
     
    Private Function SubWndProc( _
            ByVal hWnd As Long, _
            ByVal iMsg As Long, _
            ByVal wParam As Long, _
            ByVal lParam As Long, ByVal retour As String) As Long
     
        If hWnd = Form1.hWnd Then
            If iMsg = WM_APP Then
     
                'Dim inf As TestInfo
                ' Copy First Field (label)
                'Call CopyMemory(VarPtr(inf), lParam, 4)
                ' Copy Second Field (count)
                'Call CopyMemory(VarPtr(inf) + 4, lParam + 4, 4)
     
                Dim strInfo As String
                strInfo = retour
                Call MsgBox(strInfo, vbOKOnly, "WM_APP Received!")
     
                ' Clear the First Field (label) because it is a string
                'Call ZeroMemory(VarPtr(inf), 4)
                ' Do not have to clear the 2nd field because it is an integer
     
                SubWndProc = True
                Exit Function
            End If
        End If
     
        SubWndProc = CallWindowProc(procOld, hWnd, iMsg, wParam, lParam, retour)
    End Function
    '///////////////////////////////////////////////////////////////////
    Private Sub Command1_Click()
        Dim aClass As Class1
        Set aClass = New TestInterOP.Class1
        aClass.Test Me.hWnd
    End Sub
    C#:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using CSMessageLibrary;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
     
    namespace TestInterOP
    {
        [ComVisible(true)]
        public interface IClass1
        {
     
        }
     
        [ComVisible(true)]
        public class Class1 : IClass1
        {
            TestSenderSimple monTest = new TestSenderSimple();
     
            public Class1()
            { }
     
            public void Test(int TheHandle)
            {
                MessageBox.Show("ça passe");
                monTest.hostwindow = TheHandle;
                MessageBox.Show("ça passe toujours");
                monTest.DoTest(1);
            }
        }
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    using System;
    using System.Collections.Generic;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.Windows.Forms;
     
    namespace CSMessageLibrary
    {
        [ComVisible(true)]
        public interface ITestSenderSimple
        {
            // NOTE: Can't use IntPtr because it isn't VB6-compatible
            int hostwindow { get; set; }
            void DoTest(int number);
        }
     
        [ComVisible(true)]
        public class TestSenderSimple : ITestSenderSimple
        {
            public TestSenderSimple()
            {
                MessageBox.Show("ça passe encore");
                m_HostWindow = IntPtr.Zero;
                m_count = 0;
            }
     
            IntPtr m_HostWindow;
            int m_count;
     
            #region ITestSenderSimple Members
            public int hostwindow
            {
                get { return (int)m_HostWindow; }
                set { m_HostWindow = (IntPtr)value; }
            }
     
            public void DoTest(int number)
            {
                m_count++;
     
                // WM_APP is 0x8000 (32768 decimal)
                MessageBox.Show("ça passe encore et encore");
                IntPtr retval = SendMessage(m_HostWindow, 0x8000, (IntPtr)m_count, (IntPtr)number,"42");
            }
            #endregion
     
            [DllImport("user32.dll", CharSet = CharSet.Auto)]
            extern public static IntPtr SendMessage(IntPtr hwnd, uint msg, IntPtr wparam, IntPtr lparam,string TheWay);
        }
    }
    Toutes mes messagebox apparaissent.
    Mais dans le vb6 ça ne revient pas à SubWndProc.

Discussions similaires

  1. [Débutant] Communication entre deux fenêtres (WPF, MVVM)
    Par viktor56 dans le forum Windows Presentation Foundation
    Réponses: 2
    Dernier message: 29/11/2014, 14h48
  2. [WPF - MVVM] Communications entre ViewModels
    Par NeoKript dans le forum Windows Presentation Foundation
    Réponses: 9
    Dernier message: 06/02/2012, 14h06
  3. [C#][WPF] Communication entre Threads
    Par Floco dans le forum Windows Presentation Foundation
    Réponses: 17
    Dernier message: 14/04/2011, 19h54
  4. [WPF][WCF] Communication entre deux applications
    Par DotNET74 dans le forum Windows Presentation Foundation
    Réponses: 3
    Dernier message: 16/08/2010, 20h54
  5. Communication entre Vb6 et Sql Server 2000
    Par r.mehdi dans le forum VB 6 et antérieur
    Réponses: 1
    Dernier message: 06/05/2008, 07h23

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo