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 Forms Discussion :

[C# 1.1] - UserControl dans Internet Explorer


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut [C# 1.1] - UserControl dans Internet Explorer
    Bonjour à tous,

    Je developpe actuellement un UserControl qui servira d'ActiveX dans Internet Explorer. Je me suis basé sur ce tutorial :WinFormsIeSourcing

    Je dois utiliser les fonctions audio de l'api de Windows ansi qu'un SOCKET pour transmettre et reçevoir le son. Au début j'ai eu des problème avec la sécurité mais j'ai résolu le tout en créant une permission dans LocalIntranet_Zone (FullTrust) pour mon serveur local c'est à dire http://localhost/*.

    BIEN !
    Jusqu'ici tout va pour le mieux. Ensuite j'ai ouvert un Socket pour me connecter sur mon serveur, encore là tout va bien. Après je lance une nouvelle Thread

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    // Get IP and port of remote host
    IPEndPoint ep = new IPEndPoint(Dns.Resolve(m_IPAddress).AddressList[0], m_PortNumber);
     
    // Connect
    m_ClientSocket.Connect(ep);
     
    // Start received thread
    Thread clientThread = new Thread(new ThreadStart(ReceiveThread));
    clientThread.Name = "Client thread";
    clientThread.Start();
     
    // L'exécution retour à l'ActiveX...

    Et voilà le code de la thread :
    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
     
    // Client is running
    m_bIsRunning = true;
     
    // Client is running
    m_bIsThreadStopped = false;
     
    // While client is running then read incomming data
    while (m_bIsRunning)
    {
        // Start receive thread
        try
        {
            byte[] buffer = new byte[this.m_ReceiveBufferSize];
            int iBytesCount = this.m_ClientSocket.Receive(buffer, 0, this.m_ReceiveBufferSize, SocketFlags.None); ;
            if (iBytesCount == 0)
    	break;
     
            // Raise data sent event
            ClientDataReceivedEvent( new MemoryStream( buffer, 0, iBytesCount ) );
        }
        catch (Exception ex)
        {
    		if (m_bIsRunning)
                ClientErrorOccuredEvent( ex );
            break;
        }
    }
     
    // Thread end
    m_bIsRunning = false;
     
    // Client disconnected
    ClientDisconnectedEvent();
     
    // Thread stopped
    m_bIsThreadStopped = true;
    Le problème c'est que DÈS que j'appel la méthode Socket.Receive l'ActiveX gèle mon browser complètement... J'ai essayé de lancer la Thread sans lui faire faire de Socket.Received (juste des sleeping...) et cela gèle aussi !!!

    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
     
    // Client is running
    m_bIsRunning = true;
     
    // Client is running
    m_bIsThreadStopped = false;
     
    // While client is running then read incomming data
    while (m_bIsRunning)
    {
        // Start receive thread
        try
        {
            // Raise data sent event
            Thread.Sleep( 100 );
        }
        catch (Exception ex)
        {
    		if (m_bIsRunning)
                ClientErrorOccuredEvent( ex );
            break;
        }
    }
    Vous pourriez me dire ce qu ne vas pas ?
    Pourtant si je test mon ActiveX en WinForm tout fonctionne très bien.
    Merci à tous.

  2. #2
    Rédacteur
    Avatar de Erakis
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Octobre 2003
    Messages
    523
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Octobre 2003
    Messages : 523
    Par défaut
    Après quelques tests je me suis rendu compte que l'application ne répondait plus durant plus d'une minute et demi. Ensuite tout fonctionnait bien.

    Pour ceux que ça intéresse, j'ai trouvé une solution à ce problème (google)

    Il suffit de rajouter ce code dans le constructeur du composant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    System.Configuration.ConfigurationSettings.GetConfig("system.net/settings");
    Lien google : Solution 1

    Cause :
    This might be due to an application config file download which happens when
    any app using System.Net networking classes ( socket, httpwebrequest ) is
    run from a browser.

    If you use a network sniffer, you will see an http request go out for the
    app config file. This causes the 60s delay.

    You can work around this by doing a
    you do any network library API call.
    Ou voici un autre solution (encore dans le constructeur du composant)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    string loaderPage = System.Reflection.Assembly.GetExecutingAssembly().CodeBase.Replace(".dll", ".aspx");
    HttpWebRequest request = (HttpWebRequest)WebRequest.Create(loaderPage);
    Lien google : Solution 2
    Yea, it seems to be a problem with IP stack initialization within IE. The
    problem manifests itself when you try to connect the first time - TCP or UDP
    does not matter. I found a workaround it but it beats me why this way is any
    better than any other.
    J'espère que ceci en aidera quelqu'un

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/04/2006, 19h49
  2. Affichage des liens dans internet Explorer
    Par totojak dans le forum IE
    Réponses: 1
    Dernier message: 06/09/2005, 15h42
  3. Erreur dans internet explorer
    Par jnic00 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 30/08/2005, 09h01
  4. [BCB 5.0] Ajouter un bouton dans internet explorer
    Par GthrDns dans le forum C++Builder
    Réponses: 2
    Dernier message: 01/02/2004, 22h54
  5. Comment récupérer les adresses WWW dans Internet Explorer ?
    Par chaours dans le forum Web & réseau
    Réponses: 7
    Dernier message: 03/09/2003, 14h27

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