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

API, COM et SDKs Delphi Discussion :

[COM]DispInvoke renvoie E_NOTIMPL mais pas la méthode Invoke. . .


Sujet :

API, COM et SDKs Delphi

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut [COM]DispInvoke renvoie E_NOTIMPL mais pas la méthode Invoke. . .
    bonjour,

    je veux instancier un objet à partir d'un composant COM freeware très simple (Base64 de XStandard) pas de façon classique mais en émulant CoCreateInstance
    l'objet IDispatch est correctement instancié avec IClassFactory en appelant DllGetClassObjet - jusque là tout va bien...
    je voudrais en suite de ce code appeler une méthode de cet objet
    comme il s'agit d'un appel en "late binding", cette méthode est normalement appelée via la méthode générique Invoke de l'objet IDispatch - ce code est fonctionnel
    pour contourner certaines limitations, je cherche à appeler cette même méthode à partir de la fonction DispInvoke en lui fournissant l'interface ITypeInfo correspondant à la coclass choisie mais cette fonction me renvoie le code ole E_NOIMPL qui signifie qu'il ne reconnait pas la méthode que je lui demande d'exécuter

    en résumé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    hr:=DispInvoke(@ITest,coTypeInfo,aDispIDs[0],DISPATCH_METHOD,Params,@ReturnValue,nil,@ParamError);
    hr:=ITest.Invoke(aDispIDs[0],GUID_NULL,LOCALE_SYSTEM_DEFAULT,DISPATCH_METHOD,Params,@ReturnValue,nil,@ParamError);
    la ligne 1 me renvoie E_NOIMPL alors que la ligne 2 fonctionne nickel
    (coTypeInfo étant l'objet ITypeInfo de la coclass à partir de laquelle ITest a été instancié)
    j'ai dû louper une marche dans le labyrinthe COM mais je ne vois pas laquelle...
    any ideas ?
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  2. #2
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    là comme ça je ne sais pas, mais le @ devant ITest me semble douteux
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  3. #3
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    j'ai eu le même réflexe mais la déclaration du param dans activex.pas est bien pointer
    ce qui est curieux c'est que le fait de le typer en IDispatch ne change rien au message d'erreur... mais bon

    d'un autre côté, la fonction api équivalente à la méthode GetIDsOfNames fonctionne elle, aussi bien que ladite méthode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    hr:=ITest.GetIDsOfNames(GUID_NULL,@aNames,1,LOCALE_SYSTEM_DEFAULT,@aDispIDs);
    hr:=DispGetIDsOfNames(coTypeInfo,@aNames,1,@aDispIDs);
    les 2 lignes me renvoient bien la même ID
    donc...
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  4. #4
    Expert éminent
    Avatar de Paul TOTH
    Homme Profil pro
    Freelance
    Inscrit en
    Novembre 2002
    Messages
    8 964
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Freelance
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Novembre 2002
    Messages : 8 964
    Par défaut
    une interface EST un pointeur, c'est même un pointeur sur un pointeur...je pense donc que le @ est vraiment de trop
    Developpez.com: Mes articles, forum FlashPascal
    Entreprise: Execute SARL
    Le Store Excute Store

  5. #5
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    une interface EST un pointeur, c'est même un pointeur sur un pointeur...
    bouleversante découverte
    comme je l'ai déjà indiqué, j'ai modifié la déclaration de la fonction et testé la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    function DispInvoke(This: IDispatch; tinfo: ITypeInfo; dispidMember: TDispID;
      wFlags: Word; var params: TDispParams; varResult: PVariant;
      excepinfo: PExcepInfo; puArgErr: PInteger): HResult; stdcall;external 'oleaut32.dll';
     
    hr:=DispInvoke(ITest,coTypeInfo,aDispIDs[0],DISPATCH_METHOD,Params,@ReturnValue,nil,@ParamError);
    même sanction...E_NOIMPL
    et comme la doc msdn mentionne un void FAR* c'est à dire un pointeur non typé générique, ça peut être tout et n'importe quoi
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

  6. #6
    Rédacteur
    Avatar de omen999
    Profil pro
    Inscrit en
    Février 2006
    Messages
    1 302
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 1 302
    Par défaut
    bon bin la (re)lecture attentive des fondamentaux m'a permis de repérer la marche que j'avais loupée...
    DispInvoke attend l'objet ITypeInfo de l'interface ciblée pas de sa coclass
    par ailleurs, c'est bien l'interface IDispatch et non un pointeur vers celle-ci qui est attendue
    j'avais bien testé les deux mais séparément...
    ce qui m'avait induit en erreur, c'est que la fonction GetIDsOfNames fonctionne elle correctement aussi bien avec le typeinfo de la coclass que celui de l'interface
    ce qui ne devrait pas être le cas
    merci monsieur paul et à bientôt
    nomen omen, nemo non omen - Consultez la FAQ VBScript et les cours et tutoriels VBScript
    le plus terrible lorsqu'une voiture renverse un piéton, c'est que ce sont les freins qui hurlent. (ramón)
    pas de questions techniques par mp

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

Discussions similaires

  1. Réponses: 2
    Dernier message: 09/10/2009, 19h25
  2. Réponses: 10
    Dernier message: 17/02/2009, 15h51
  3. Serveur COM marche avec .cpp mais pas avec .lib
    Par sylvain.cool dans le forum C++
    Réponses: 4
    Dernier message: 26/06/2008, 10h54
  4. domain.com fonctionne mais pas www.domain.com
    Par sebbbz dans le forum Domaines
    Réponses: 1
    Dernier message: 10/12/2007, 08h51
  5. COM : _com_ptr_t ca marche mais je ne comprend pas pourquoi
    Par dockurt2k dans le forum Visual C++
    Réponses: 4
    Dernier message: 21/08/2006, 12h28

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