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#] exception : cast


Sujet :

Windows Forms

  1. #1
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2004
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 230
    Par défaut [c#] exception : cast
    bonjour,
    je debute en c# et je fais un programme permettant d'uploader une image sur un ftp a intervalle regulié
    j'avais tout fais mais j'ai changé de composant COM (j'utilise DShowNET) en court de route j'ai du readapter tout le code et
    malheuresement il y a qqchose qui ne passe pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    System.InvalidCastException was unhandled
      Message="Unable to cast COM object of type 'System.__ComObject' to interface type 'DShowNET.ISampleGrabber'. This operation failed because the QueryInterface call on the COM component for the interface with IID '{6B652FFF-11FE-4FCE-92AD-0266B5D7C78F}' failed due to the following error: Cette interface n'est pas prise en charge (Exception from HRESULT: 0x80004002 (E_NOINTERFACE))."
      Source="DShowNET"
      StackTrace:
           at DShowNET.ISampleGrabber.SetCallback(ISampleGrabberCB pCallback, Int32 WhichMethodToCallback)
           at WindowsApplication1.Form1.captImg() in C:\Documents and Settings\Marc\Mes documents\Visual Studio 2005\Projects\WindowsApplication1\WindowsApplication1\Form1.cs:line 579
           at WindowsApplication1.Form1.capt() in C:\Documents and Settings\Marc\Mes documents\Visual Studio 2005\Projects\WindowsApplication1\WindowsApplication1\Form1.cs:line 628
           at WindowsApplication1.ThreadPhotoUpload.startUp(Object obj) in C:\Documents and Settings\Marc\Mes documents\Visual Studio 2005\Projects\WindowsApplication1\WindowsApplication1\ThreadPhotoUpload.cs:line 32
           at System.Threading.ThreadHelper.ThreadStart_Context(Object state)
           at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
           at System.Threading.ThreadHelper.ThreadStart(Object obj)
    la ligne fautive est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    hr = sampGrabber.SetCallback(this, 1); // int hr
    de la methode captImg qui est dans ma form principale appelé dans un autre Thread par reference :
    par contre quand je met un boutton sur la form et que je lui met comme action :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    captImg();// je n'ai aucune exception
    j'ai mis un messageBox juste avant linstruction fautive pour voir this
    et c'est le meme on dirait
    donc je ne comprend pas ou est le probleme

    voila
    merci

  2. #2
    Membre Expert Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Par défaut
    Signification de ton message d'erreur ('InvalidCastException') :
    Quand tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hr = sampGrabber.SetCallback(this, 1); // int hr
    ton 'this' n'est pas de type DShowNET.ISampleGrabber. Or la méthode 'SetCallback' attend un DShowNET.ISampleGrabber en paramètre.
    Si tu veux plus d'info, poste du code.

  3. #3
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2004
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 230
    Par défaut
    merci voici des morceau de code

    capture :
    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
            public void captImg(){
     
                int hr;
                Trace.WriteLine("!!BTN: toolBarBtnGrab");
     
                if (savedArray == null)
                {
                    int size = videoInfoHeader.BmiHeader.ImageSize;
                    if ((size < 1000) || (size > 16000000))
                        return;
                    savedArray = new byte[size + 64000];
                }
     
              //  toolBarBtnSave.Enabled = false;
                Image old = pictureBox1.Image;
                pictureBox1.Image = null;
                if (old != null)
                    old.Dispose();
     
               // toolBarBtnGrab.Enabled = false;
                captured = false;
                //MessageBox.Show(""+this);
                hr = sampGrabber.SetCallback(this, 1);
    }
    thread qui appel la methode :
    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
    class ThreadPhotoUpload 
        {
            private login logg;
            private Form1 princ;
            public ThreadPhotoUpload(Form1 formm, login log)
            {
                this.logg = log;
                this.princ = formm;
                Thread t = new Thread(new ParameterizedThreadStart(startUp));
                t.Start((object)new PrinFL(formm,logg));
            }
            public void startUp(object obj)
            {
                PrinFL p =(PrinFL) obj;
                login alogin = p.getLogin();
                Form1 form = p.getForm();
     
                while (true)
                    {
                        Random rand = new Random();
                        int ale = rand.Next();
                    string name = ale + "_" + alogin.slogin + ".jpg";
                    princ.captImg();
                      princ.saveIn(name);
                        Form1.ff.upload(name);
                          string rep =HTMLUtils.getHtml("#######");
                      //MessageBox.Show(rep);
                    File.Delete(name);
                    Thread.Sleep(alogin.freq);
     
     
                }
            }
     
        }
    autre methode :
    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
       /// <summary> sample callback, NOT USED. </summary>
             int ISampleGrabberCB.SampleCB(double SampleTime, IMediaSample pSample)
             {
                 Trace.WriteLine("!!CB: ISampleGrabberCB.SampleCB");
                 return 0;
             }
     
             /// <summary> buffer callback, COULD BE FROM FOREIGN THREAD. </summary>
             int ISampleGrabberCB.BufferCB(double SampleTime, IntPtr pBuffer, int BufferLen)
             {
                 if (captured || (savedArray == null))
                 {
                     Trace.WriteLine("!!CB: ISampleGrabberCB.BufferCB");
                     return 0;
                 }
     
                 captured = true;
                 bufferedSize = BufferLen;
                 Trace.WriteLine("!!CB: ISampleGrabberCB.BufferCB  !GRAB! size = " + BufferLen.ToString());
                 if ((pBuffer != IntPtr.Zero) && (BufferLen > 1000) && (BufferLen <= savedArray.Length))
                     Marshal.Copy(pBuffer, savedArray, 0, BufferLen);
                 else
                     Trace.WriteLine("    !!!GRAB! failed ");
                 this.BeginInvoke(new CaptureDone(this.OnCaptureDone));
                 return 0;
             }
    EDIT : le prog bug a princ.captImg();

  4. #4
    Membre Expert Avatar de Mose
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    1 143
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 1 143
    Par défaut
    Tu vois la ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hr = sampGrabber.SetCallback(this, 1); // int hr
    Bon.. bein l'erreur que tu as, et comme je l'ai expliqué (sans résultat visiblement) dans mon post précédent :
    * Le premier paramètre de la méthode SetCallback, à savoir, ici, 'this' n'est PAS BON.
    * En effet, la méthode 'SetCallback', nécessite comme premier paramètre un objet qui implémente l'interface DShowNET.ISampleGrabber.
    * Or toi tu lui passe en paramètre un objet de type Form1, qui très visiblement n'implémente pas cette interface.

    Est-ce-que tu sais ce qu'est un cast ? une interface ? implémenter ?

  5. #5
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2004
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 230
    Par défaut
    oui je connais les notions dont tu parle je suis novice en c# pas en progrmmation

    ce que je ne comprend dans mon proleme c'est pourquoi cela marche quand j'appel l amethode a partir d'un boutton de la form et pas du Thread alors que j'ai une reference meme de la Form?

    merci de t'interesser a moi
    si tu le veut je peux mettre toutes les sources

  6. #6
    Nouveau candidat au Club
    Inscrit en
    Mai 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 2
    Par défaut
    J'ai exactement le même problème. C'est seulement lorsque j'appel la méthode setcallback d'une autre thread que la thread de la fenêtre principale que ça ne fonctionne pas. Est-ce que quelqu'un a trouvé une solution?

  7. #7
    Nouveau candidat au Club
    Inscrit en
    Mai 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Mai 2007
    Messages : 2
    Par défaut
    Il semble absolument nécessaire de faire les appels vers DirectShow de la thread principale (celle où se trouve la gestion des messages.) Alors, la solution pour faire une capture d'image à partir d'une autre thread est de programmer cette thread pour qu'elle envoit un message vers la thread principale. La thread principale en recevant ce message devra faire un appel à la méthode setcallback. Pour communiquer avec la thread principale, on peut utiliser la méthode BeginInvoke ou Invoke de la form principale.

  8. #8
    Membre expérimenté
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2004
    Messages
    230
    Détails du profil
    Informations personnelles :
    Âge : 35
    Localisation : Canada

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2004
    Messages : 230
    Par défaut
    ca fait usine a gaz quand meme mais je pense qu'il vaut mieu faire comme ca qu'utiliser WIA ...

Discussions similaires

  1. erreur Class Cast Exception
    Par friedamichelle dans le forum Langage
    Réponses: 3
    Dernier message: 25/05/2008, 16h54
  2. Equals dans objet remote: Identity/ServerIdentity cast exception
    Par joebarthib dans le forum Windows Forms
    Réponses: 1
    Dernier message: 13/02/2007, 14h20
  3. [resourceBundle] cast exception
    Par jeb001 dans le forum Struts 1
    Réponses: 2
    Dernier message: 13/01/2007, 19h31
  4. Class cast exception
    Par gloglo dans le forum Langage
    Réponses: 3
    Dernier message: 09/01/2007, 18h26
  5. Réponses: 12
    Dernier message: 25/07/2005, 14h49

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