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

Evenements COM : Erreur du __hook


Sujet :

Windows

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 11
    Points : 10
    Points
    10
    Par défaut Evenements COM : Erreur du __hook
    Bonjour,

    J'ai un petit probleme pour implémenter l'evennement COM IWinHttpRequestEvents::OnResponseFinished ...

    Ci-Dessous mon code et le message d'erreur ...

    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
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    
    #include "stdafx.h"
    #include <string>
    #include "test2.cpp"
    #include <httprequest.h>
    
    #define _ATL_ATTRIBUTES 1
    #include <atlbase.h>
    #include <atlcom.h>
    
    using namespace std;
    
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    
    	IWinHttpRequest* pIWhttp;
    	IUnknown* pIu;
    
    	HRESULT hr;
    	
    	BSTR            bstrResponse = NULL;
        VARIANT         varFalse;
        VARIANT         varEmpty;
        
        VariantInit(&varFalse);
        V_VT(&varFalse)   = VT_BOOL;
        V_BOOL(&varFalse) = VARIANT_FALSE;
    
        VariantInit(&varEmpty);
        V_VT(&varEmpty) = VT_ERROR;
    
    	
    
    	CoInitialize(NULL);
    	hr = CoCreateInstance(CLSID_WinHttpRequest,NULL,CLSCTX_INPROC_SERVER,IID_IWinHttpRequest,(LPVOID*)&pIWhttp);
    	pIWhttp->QueryInterface(IID_IUnknown,(LPVOID*)&pIu);
    
    	Rep r;
    	r.StartHook(pIu);
    
    	BSTR bstrMethod  = SysAllocString(L"GET");
    	BSTR bstrUrl = SysAllocString(L"http://www.google.com");
    
        //  Create an HTTP request.
    	hr = pIWhttp->Open(bstrMethod,bstrUrl,varFalse);
    
        //  Send the HTTP request.
    	hr = pIWhttp->Send(varEmpty);
        
        //  Retrieve the response text.
    	hr = pIWhttp->get_ResponseText(&bstrResponse);
    
    
    	//WCHAR* blabla(Test::RecorderDrive());
    
    	//printf("test");
    	return 0;
    }
    
    
    [event_receiver(com,false)]
    class Rep
    {
    public:
    	void OnResponseFinished()
    	{
    		//rien
    	}
    
    	void StartHook(IUnknown* pIu)
    	{
    		__hook(&IWinHttpRequestEvents::OnResponseFinished,pIu,&Rep::OnResponseFinished);
    	}
    };
    Et le message d'erreur du compilateur :
    error C3706: 'IWinHttpRequestEvents': must be a COM interface to fire COM events

    Apparement, la ligne de l'erreur semble etre la ligne du __hook, mais je ne vois pas ce qu'il ne va pas ...

    Si vous avez une idée !

    Cordialement,
    Guillaume

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    D'après la doc du message d'erreur, l'interface doit avoir été définie avec des attributs (les trucs entre crochets) ou avoir été importée à partir d'une Type Library.
    Si httprequest.h ne déclare pas correctement les interfaces, elles ne pourront pas être utilisées avec __hook().

    La seule solution que je verrais, c'est renoncer au Compiler COM Support et essayer manuellement avec les interfaces liées aux événements COM (s'il y en a)...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    D'après la doc du message d'erreur, l'interface doit avoir été définie avec des attributs (les trucs entre crochets) ou avoir été importée à partir d'une Type Library.
    J'ai généré moi meme "httprequest.h" car il n'était pas dans mon sdk, il y avait que httprequest.idl (j'ai généré ca avec la commande midl).

    Je pense que mon code doit marcher si j'importe direcement dans mon code le fichier IDL avec #import <httprequest.idl> ...

    Mais le compilateur ne veux pas fonctionner dans ce cas :
    fatal error C1083: Cannot open type library file: 'c:\program files\microsoft sdks\windows\v6.0\include\httprequest.idl': Error loading type library/DLL.

    Donc je comprend rien ... Pourquoi le fichier IDL est bien compilé quand je fait un midl.exe manuellement, et pourquoi ca ne marche pas dans visual studio ...

    Bref, toujours pas de solution ...
    Guillaume

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    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 369
    Points : 41 519
    Points
    41 519
    Par défaut
    C'est le fichier .tlb généré par MIDL qu'il faut importer, pas le .idl...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2005
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    Ok, j'ai donc fait un #import <httprequest.tlb>.
    J'ai modifier le mode d'instanciation de IWinHttpRequest comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	WinHttp::IWinHttpRequestPtr pIWhttp(__uuidof(WinHttp::WinHttpRequest));
    C'est quand meme vachement plus court que de faire un coCreateIntance ... Faudra que je pense plus souvent à utiliser directement les TLB :-)

    Bon, mais ce ne change rien à mon probleme ... Le hook à désormais cette tete :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    __hook(&WinHttp::IWinHttpRequestEvents::OnResponseFinished,pIu,&Rep::OnResponseFinished);
    Toujours l'erreur : error C3706: 'IWinHttpRequestEvents': must be a COM interface to fire COM events ...

    Quelqu'un peut-il m'expliquer clairement comment il ferai pour gérer les evenement émis pas un objet COM ? Peut etre que le __hook n'est pas la meilleur solution ...
    Je n'ai jamais été tres aguéri avec COM, et n'ai jamais joué avec les events, donc ceci explique cela ...

    Merci,
    Guillaume

Discussions similaires

  1. Récuperer evenements Com
    Par PsyKo BoY dans le forum Débuter
    Réponses: 3
    Dernier message: 28/10/2008, 15h23
  2. [hostarea.com] Erreur Incompréhensible après hébergement
    Par Siguillaume dans le forum Autres hébergeurs
    Réponses: 2
    Dernier message: 12/01/2008, 09h40
  3. Evenement JBarMenu erreur
    Par zulot dans le forum Interfaces Graphiques en Java
    Réponses: 2
    Dernier message: 23/11/2007, 16h12
  4. [DLL Com+] Erreur lors de l'installation
    Par [DreaMs] dans le forum Langage
    Réponses: 3
    Dernier message: 26/09/2007, 14h54
  5. [COM] Utilisation de COM() => Erreur Apache
    Par hisy dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 01/03/2006, 10h31

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