Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1716 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++] Appel à une méthode récupérée par pointeur

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Appel à une méthode récupérée par pointeur

n°830634
fatypunk
Java bien !
Posté le 24-08-2004 à 11:22:54  profilanswer
 

Le programme plante lamentablement lors de l'appel à la méthode Open de ITarmedValidator. Quelqu'un a-t-il une idée ?
 

Code :
  1. ...
  2. enum LanguageType{enGerman, enFrench, enItalian, enEnglish};
  3. ...
  4. struct ITarmedValidator : public IUnknown
  5. {
  6.     virtual HRESULT STDMETHODCALLTYPE Open(LanguageType enLanguage,
  7.                                            VARIANT_BOOL *pbStatus)=0;
  8. };
  9. ...
  10. ITarmedValidator * pITarmedValidator;
  11. DllCOM * tv_dll;
  12. ...
  13. tv_dll = new DllCOM(dll);
  14. ...
  15. void * pv;
  16. tv_dll->SwitchInterface(iid_ITarmedValidator, pv);
  17. pITarmedValidator = (ITarmedValidator *)pv;
  18. ...
  19. VARIANT_BOOL * p;
  20. HRESULT res;
  21. MessageBox(NULL, "ok 1", "open", 0);
  22. res = pITarmedValidator->Open(enFrench, p);
  23. ...


Méthode SwitchInterface de DllCOM :

Code :
  1. void DllCOM::SwitchInterface(IID iidNew, void * pv)
  2. {
  3.     pIUnknown->QueryInterface(iidNew, &pv);
  4. }


Message édité par fatypunk le 24-08-2004 à 13:53:42
mood
Publicité
Posté le 24-08-2004 à 11:22:54  profilanswer
 

n°830636
chrisbk
-
Posté le 24-08-2004 à 11:25:32  profilanswer
 

ben normal, hein, pv est pas initialisé entre sa déclaration et la ou tu le cast en ITarmed (ton switchInterface modifie le contenue d'une var locale). Pis d'ailleurs tu le delete apres (?)

n°830641
fatypunk
Java bien !
Posté le 24-08-2004 à 11:30:14  profilanswer
 

chrisbk a écrit :

ben normal, hein, pv est pas initialisé entre sa déclaration et la ou tu le cast en ITarmed (ton switchInterface modifie le contenue d'une var locale). Pis d'ailleurs tu le delete apres (?)


 
Non le delete après c'est une bourde que j'ai ajouté au message... corrigé

n°830643
chrisbk
-
Posté le 24-08-2004 à 11:31:42  profilanswer
 

si j'etais toi :
 

Code :
  1. tv_dll->SwitchInterface(iid_ITarmedValidator, &pv);
  2. ...
  3. void DllCOM::SwitchInterface(IID iidNew, void** pv)
  4. {
  5.       pIUnknown->QueryInterface(iidNew, pv);
  6. }

n°830645
fatypunk
Java bien !
Posté le 24-08-2004 à 11:32:29  profilanswer
 

Il est initialiser dans CreateInstance (j'avais pas posté)

Code :
  1. tv_dll = new DllCOM(dll);
  2.     tv_dll->CreateInstance(clsid_TarmedValidator);
  3.     ITarmedValidator * pITarmedValidator;
  4.    
  5.     void * pv;
  6.     tv_dll->SwitchInterface(iid_ITarmedValidator, pv);
  7.     pITarmedValidator = (ITarmedValidator *)pv;
  8.     VARIANT_BOOL * p;
  9.     HRESULT res;
  10.     res = pITarmedValidator->Open(enFrench, p);


Code :
  1. void DllCOM::CreateInstance(CLSID clsid)
  2.     void * pv;
  3.     switch (CoCreateInstance(clsid, NULL, CLSCTX_ALL, iid_IUnknown, &pv))
  4.     {
  5.     case S_OK :
  6.         MessageBox(NULL, "ok", "CreateInstance", 0);
  7.         break;
  8.     case REGDB_E_CLASSNOTREG :
  9.         MessageBox(NULL, "REGDB_E_CLASSNOTREG", "CreateInstance", 0);
  10.         break;
  11.     case CLASS_E_NOAGGREGATION :
  12.         MessageBox(NULL, "CLASS_E_NOAGGREGATION", "CreateInstance", 0);
  13.         break;
  14.     case E_NOINTERFACE :
  15.         MessageBox(NULL, "E_NOINTERFACE", "CreateInstance", 0);
  16.         break;
  17.     }
  18.     pIUnknown = (IUnknown *)pv;
  19. }


Message édité par fatypunk le 24-08-2004 à 13:51:20
n°830650
fatypunk
Java bien !
Posté le 24-08-2004 à 11:34:08  profilanswer
 

Ah oui j'ai compris je crois...

n°830656
fatypunk
Java bien !
Posté le 24-08-2004 à 11:37:47  profilanswer
 

Ah bein non, ca marche toujours pas :

Code :
  1. void DllCOM::SwitchInterface(IID iidNew, void ** pv)
  2. {
  3.     pIUnknown->QueryInterface(iidNew, pv);
  4. }


Code :
  1. tv_dll = new DllCOM(dll);
  2.     tv_dll->CreateInstance(clsid_TarmedValidator);
  3.     ITarmedValidator * pITarmedValidator;
  4.    
  5.     void * pv;
  6.     tv_dll->SwitchInterface(iid_ITarmedValidator, &pv);
  7.     pITarmedValidator = (ITarmedValidator *)pv;
  8.     VARIANT_BOOL * p;
  9.     HRESULT res;
  10.     res = pITarmedValidator->Open(enFrench, p);


Message édité par fatypunk le 24-08-2004 à 13:51:46
n°830657
chrisbk
-
Posté le 24-08-2004 à 11:38:56  profilanswer
 

ben verifie le retour de ton QueryInterface, ce genre de truc

n°830663
fatypunk
Java bien !
Posté le 24-08-2004 à 11:43:58  profilanswer
 

chrisbk a écrit :

ben verifie le retour de ton QueryInterface, ce genre de truc


 
Il renvoie bien S_OK...

n°830677
lsdYoYo
gravity powered
Posté le 24-08-2004 à 12:05:14  profilanswer
 

Code :
  1. struct ITarmedValidator : public IUnknown
  2. {
  3.     virtual HRESULT STDMETHODCALLTYPE Open(LanguageType enLanguage,
  4.                                            VARIANT_BOOL *pbStatus)=0;
  5. };


Je suis pas mauvais en C mais encore débutant en C++, mais il me semble que tu défini (ou redéfini) une méthode virtuelle pure ("virtual method() = 0;" ). Ce type de déclaration est employé dans des classes abstraites. Elles ne peuvent pas être employées directement mais uniquement via une classe dérivée dans laquelle il faut obligatoirement redéfinir les méthodes virtuelles pures. Sinon, c'est un peu comme si tu appelais une fonction via un pointeur NULL.
Il faut donc que tu écrives le code de la méthode Open().

mood
Publicité
Posté le 24-08-2004 à 12:05:14  profilanswer
 

n°830690
fatypunk
Java bien !
Posté le 24-08-2004 à 12:20:46  profilanswer
 

lsdyoyo a écrit :

Je suis pas mauvais en C mais encore débutant en C++, mais il me semble que tu défini (ou redéfini) une méthode virtuelle pure ("virtual method() = 0;" ). Ce type de déclaration est employé dans des classes abstraites. Elles ne peuvent pas être employées directement mais uniquement via une classe dérivée dans laquelle il faut obligatoirement redéfinir les méthodes virtuelles pures. Sinon, c'est un peu comme si tu appelais une fonction via un pointeur NULL.
Il faut donc que tu écrives le code de la méthode Open().


 
La méthode fait partie de la classe contenue dans la dll compilée que j'utilise. Si je devais ré-écrire le code de la dll, elle ne me servirait à rien...
 
Il est cependant obligatoire de la déclarer, sinon le compilo râlerait pour classe et méthode inconnnues...
 
Maintenant peut-être que ma facon de procéder est fausse, je suis pas un spécialiste...


Message édité par fatypunk le 24-08-2004 à 13:30:42
n°830805
fatypunk
Java bien !
Posté le 24-08-2004 à 13:55:18  profilanswer
 

chrisbk a écrit :

ben verifie tes appels, la tronche du pointeur retouré, ou exactement ca plante, comment ca plante...


 
Ca plante sur l'appel à Open.
Et comment tu vérifie la tronche du pointeur ?


Message édité par fatypunk le 24-08-2004 à 13:56:01
n°830808
chrisbk
-
Posté le 24-08-2004 à 13:57:04  profilanswer
 

fatypunk a écrit :

Et comment tu vérifie la tronche du pointeur ?


 
avec un fin debugueur ? Si ca plante *lors* de l'appel et que ton ptr a l'air valide alors verifie ta declaration de ptranslatemachin, des fois que ca debloquerait dans les vtables


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++] Appel à une méthode récupérée par pointeur

 

Sujets relatifs
aide fonction qui appel l'événment OnActivate chaque 3 minuteshorloge donnant l'heure du serveur. meilleure méthode ?
Tas, pile et pointeur[Java - Servlet] Methode Init() non executee
appel des variables php dans une fonction php2 constructeurs : un qui appel l'autre...
[JAVA] JNI et JDK 1.4: Appel de méthodes Java depuis une fonction Cla methode split
méthode de creation de logiciel embarquéAppeler la méthode d'une classe par un String
Plus de sujets relatifs à : [C++] Appel à une méthode récupérée par pointeur


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR