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

Visual C++ Discussion :

[VC++.net 2003] Problème de cast


Sujet :

Visual C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 135
    Points : 62
    Points
    62
    Par défaut [VC++.net 2003] Problème de cast
    Bonjour,

    J'ai une fonction fourni par un fabricant de caméra, pour afficher un flux vidéo dans une fenêtre MFC:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    errChk(imaq1394Plot((GUIHNDL)hWnd, (void *)ImaqBuffer, 0, 0, AcqWinWidth, AcqWinHeight,CanvasLeft, CanvasTop, plotFlag));
    Le fabricant m'a dit que cette fonction prenait le Handle HWND de ma fenêtre mais qu'il fallait la caster avec:

    Le compilo me dit qu'il n'est pas d'accord, alors j'essai de faire ça plus proprement:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    GUIHNDL hWndTemp;
     
    hWndTemp = reinterpret_cast < GUIHNDL >(hWnd);
    errChk(imaq1394Plot(hWndTemp, (void *)ImaqBuffer, 0, 0, AcqWinWidth, AcqWinHeight,CanvasLeft, CanvasTop, plotFlag));
    résultat, toujour le même, il me dit :

    'reinterpret_cast': impossible de convertir de 'HWND CmyClasse::*' en 'GUIHNDL'
    la definition de GUIHNDL : typedef uInt32 GUIHNDL
    la definition de uInt32 : typedef unsigned long uInt32

    Est-ce que mon problème est un simple soucis de mauvaise déclaration de pointeur ou est-ce qu'il y a une meilleur façon pour caster des Handles en MFC?

    merci pour l'aide, je vois le bout du tunnel pour ce projet..

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    'reinterpret_cast': impossible de convertir de 'HWND CmyClasse::*' en 'GUIHNDL'
    Ton hWnd n'est pas un vrai HWND, c'est un HWND * qui ne peut pointer que vers un HWND se trouvant dans un objet CmyClasse.

    Par contre, c'est bizarre que le reinterpret_cast foire. L'un des deux types est peut-être bien une classe d'objet complexe, en vérité...

    Essaie peut-être ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    GUIHNDL hWndTemp;
    HWND hWnd2 = hWnd;
    hWndTemp = reinterpret_cast< GUIHNDL >(hWnd2);
    Normalement, le HWND est déclaré par:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    DECLARE_HANDLE(hWnd);
    /* qui signifie: */
    typedef struct HWND__ * hWnd;

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 135
    Points : 62
    Points
    62
    Par défaut
    Voila comment je déclare mon handle:

    dans la classe:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public:
     
        HWND hWnd;
    Voila comment je lie mon handle à ma fenêtre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    GetDlgItem(IDC_AQUI_IMAGE, &hWnd);
    Essaie peut-être ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    GUIHNDL hWndTemp; 
    HWND hWnd2 = hWnd; 
    hWndTemp = reinterpret_cast< GUIHNDL >(hWnd2);
    le résultat est tjrs identique:

    'reinterpret_cast': impossible de convertir de 'HWND CmyClasse::*' en 'HWND'
    Je comprends vraiment pas ce qui cloche... ça doit être un truc vraiment stupide!!

    merci pour ton aide

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 135
    Points : 62
    Points
    62
    Par défaut
    j'avais pas vue, il y avait un autre message:

    référence non-conforme à un membre non static 'CmyClasse::hWnd'
    si ça peut t'aider..

  5. #5
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    OK, il me manquait bien la déclaration et la seconde erreur.

    Ces informations me disent que hWnd est une variable d'instance de classe (et non une variable locale à une fonction comme je le croyais) et que tu tentes de l'utiliser depuis une fonction static (une fonction qui n'est donc pas liée à une instance de classe).

    Donc, pas trente-six solutions: Tu dois déclarer la fonction non-static ou lui passer l'objet en paramètre.

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    135
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 135
    Points : 62
    Points
    62
    Par défaut
    Ok, c bon, merci beaucoup pour ton aide. Comme tu l'a dit, il faut que je puisse acceder à ma variable membre qui n'est pas accessible car je l'appel d'une fonction static Thread. Alors j'ai crée un pointeur sur ma classe que j'ai lié à une variable passé en paramètre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    CmyClasse  *pThis=reinterpret_cast< CmyClasse   *>( pvParam);
    et grace à ça, j'ai acccès à ma variable hWnd:

    et donc maintenant le cast s'effectu sans soucis:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (GUIHNDL) pThis->hWnd
    Voilà, merci beaucoup pour le coup de main, ça ma fais drolement avancer.

  7. #7
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 379
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 379
    Points : 41 573
    Points
    41 573
    Par défaut
    OK, tant mieux

    PS: si pvParam est un void*, tu peux remplacer le reinterpret_cast par un static_cast. Je te conseille de le faire, car il vaut mieux utiliser les casts les plus restrictifs quand on le peut: ça évite les erreurs...

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

Discussions similaires

  1. [VB.NET 2003] Problème de Dataset
    Par Kropernic dans le forum Windows Forms
    Réponses: 4
    Dernier message: 04/09/2007, 14h14
  2. [VB.NET 2003] problème de MAJ d'une DB
    Par Kropernic dans le forum Windows Forms
    Réponses: 1
    Dernier message: 28/08/2007, 10h44
  3. [Visual Studio .Net 2003]Problème d'édition de liens
    Par Mindiell dans le forum Visual C++
    Réponses: 10
    Dernier message: 25/05/2007, 23h43
  4. Réponses: 6
    Dernier message: 10/04/2007, 23h50
  5. Réponses: 2
    Dernier message: 05/05/2006, 15h10

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