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 :

[Com] Interface IDispatch.Invoke


Sujet :

Windows

  1. #1
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut [Com] Interface IDispatch.Invoke
    Salut,
    j'ai qq questions concernant la méthode Invoke de l'interface IDispatch :
    (Delphi 5 Sous XP, contexte automation )
    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
    C :
    
    HRESULT Invoke( 
      DISPID  dispIdMember,      
      REFIID  riid,              
      LCID  lcid,                
      WORD  wFlags,              
      DISPPARAMS FAR*  pDispParams,  
      VARIANT FAR*  pVarResult,  
      EXCEPINFO FAR*  pExcepInfo,  
      unsigned int FAR*  puArgErr  
    );
    
    Delphi :
    
        function Invoke(DispID: Integer; const IID: TGUID; LocaleID: Integer; 
          Flags: Word; var Params; VarResult, ExcepInfo, ArgErr: Pointer): HResult;stdcall;
    j'aimerai savoir si obligatoirement on doit gérer les différentes valeurs du paramètre Flags : DISPATCH_METHOD,DISPATCH_PROPERTYGET,... ?

    Est-ce le serveur qui prendre en considération le paramètre ExcepInfo ?

    Les méthodes appelées par invoke peuvent-elles

    • être de type Function ou bien le paramètre VarResult est-il utilisé dans ce cas là ?
      contenir des paramétres Out ? et si oui leurs gestion se fait-elle par le paramètre Params de type TDispParams ?

    Merci

    ps
    J'avais posté à l'origine dans le forum Delphi mais je n'ai pas eu de réponse.

  2. #2
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Personne n'a d'info pratique sur le sujet ?
    ou je poste un nouveau msg dans un forum C++ par exemple ?

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Salut
    Je ne sais pas si celà peut t'aider, mais j'utilise ce code tiré de MSDN :
    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
    STDMETHODIMP CMyAddin::PutProperty(LPDISPATCH pDisp, LPOLESTR pszName, VARIANT* pvValue)
    {
       if (NULL == pDisp) return E_POINTER;
       if (NULL == pvValue) return E_POINTER;
    
       DISPID dwDispID;
    	DISPID dispidPut = DISPID_PROPERTYPUT;
    	DISPPARAMS dispparams = {NULL, NULL, 1, 1};
    	dispparams.rgvarg = pvValue;
    	dispparams.rgdispidNamedArgs = &dispidPut;
    
    	HRESULT hr = pDisp->GetIDsOfNames(IID_NULL, &pszName, 1, LOCALE_USER_DEFAULT, &dwDispID);
    	if(SUCCEEDED(hr)) {
    
    		if (pvValue->vt == VT_UNKNOWN || pvValue->vt == VT_DISPATCH || 
    			(pvValue->vt & VT_ARRAY) || (pvValue->vt & VT_BYREF))
    		{
    			hr = pDisp->Invoke(dwDispID, IID_NULL, LOCALE_USER_DEFAULT,
    				DISPATCH_METHOD | DISPATCH_PROPERTYPUTREF, &dispparams,
                NULL, NULL, NULL);
    			if (SUCCEEDED(hr)) return hr;
    		}
    
    		hr = pDisp->Invoke(dwDispID, IID_NULL, LOCALE_USER_DEFAULT,
    			   DISPATCH_METHOD | DISPATCH_PROPERTYPUT, &dispparams,
                NULL, NULL, NULL);
       }
    
    	return hr;
    }
    
    STDMETHODIMP CMyAddin::CallMethod(LPDISPATCH pDisp, LPOLESTR pszName, VARIANT* pvResult, UINT cArgs, VARIANTARG* rgVarParams)
    {
        if (NULL == pDisp) return E_POINTER;
    
        DISPID dwDispID;
        DISPPARAMS dispparams = {NULL, NULL, 0, 0};
        dispparams.rgvarg = rgVarParams;
        dispparams.cArgs = cArgs;
    
        HRESULT hr = pDisp->GetIDsOfNames(IID_NULL, &pszName, 1, LOCALE_USER_DEFAULT, &dwDispID);
        if(SUCCEEDED(hr)) {
    
            hr = pDisp->Invoke(dwDispID, IID_NULL, LOCALE_USER_DEFAULT,
                    DISPATCH_METHOD, &dispparams, pvResult, NULL, NULL);
    
            if (FAILED(hr)) 
    		{
    			hr = pDisp->Invoke(dwDispID, IID_NULL, LOCALE_USER_DEFAULT,
                        DISPATCH_METHOD | DISPATCH_PROPERTYGET, &dispparams, pvResult, NULL, NULL);
            }
        }
    	return hr;
    }
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Merci,
    mais cela ne m'aide pas.
    Pour ce qui est de l'appel et de son utilsation pas de pb sous Delphi , par contre les implémentation que j'ai pu analysé ne prennent pas en compte certain aspect et le SDK n'est pas trés prolixe sur le sujet ou je n'ai pas trouvé la bonne page.

    Pour le paramètre ExcepInfo j'ai trouvé je pense, on le gére si on souhaite lever une exception. Cette exception est traité dans la méthode qui appel Invoke.
    Pour le rester je cherche ...

  5. #5
    Rédacteur


    Profil pro
    Inscrit en
    Janvier 2003
    Messages
    7 171
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2003
    Messages : 7 171
    Points : 15 060
    Points
    15 060
    Billets dans le blog
    1
    Par défaut
    Pour info
    j'avais la réponse sous le nez %-(

    cf . unité ComObj : procédure DispatchInvoke

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

Discussions similaires

  1. [COM] Interface refusée dans un activeX
    Par Nalfouille dans le forum MFC
    Réponses: 1
    Dernier message: 27/03/2006, 13h58
  2. [Interfaces] IDispatch et DispInterfaces
    Par Clorish dans le forum Langage
    Réponses: 2
    Dernier message: 19/12/2005, 09h57
  3. [Virtual Pascal] [Win32] Objets COM - Interface IShellLink
    Par Alcatîz dans le forum Autres IDE
    Réponses: 5
    Dernier message: 27/10/2005, 21h19
  4. Réponses: 9
    Dernier message: 03/03/2005, 14h36
  5. Objet COM et interface
    Par pio_forum dans le forum Windows
    Réponses: 7
    Dernier message: 08/11/2004, 17h25

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