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

C Discussion :

Instanciation d'un objet COM en C


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 29
    Par défaut Instanciation d'un objet COM en C
    Bonjour à tous,
    J'aimerai crée un objet COM, en utilisant la fonction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CoCreateInstance(
    REFCLSID rclsid, /*Class identifier (CLSID) of the object */
    LPUNKNOWN pUnkOuter,
    /*Pointer to whether object is or isn’t part of an aggregate */
    DWORD dwClsContext,
    /*Context for creating the object*/
    REFIID riid,
    /*Reference to the identifier of the interface (a pointer in C, a reference variable in C++*/
    LPVOID * ppv
    /*Indirect pointer to requested interface if successful, NULL otherwise*/);
    Sauf que je ne sais pas trop quoi mettre comme paramètre.
    Je sais que le CLSID est l'identifiant unique de l'objet et je l'ai trouvé dans la base de registre,mais par contre pour l'interface je ne sais pas.
    j'ai fait des recherches mais ça reste un peu flou pour moi, si quelqu'un a un exemple pour m'aider.
    Je vous remercie d'avance.

  2. #2
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    Je sais que le CLSID est l'identifiant unique de l'objet et je l'ai trouvé dans la base de registre,mais par contre pour l'interface je ne sais pas.
    Ce n'est pas bien de fouiller dans le registre. Pour utiliser un composant COM, il faut la doc de ce composant, il ne suffit pas de connaître son id de classe et les ids de ses différentes interfaces. Sans doc, c'est perdu d'avance. Quel classe veux-tu instancier néanmoins, au cas où je pourrais t'indiquer où trouver la doc.

  3. #3
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    Petite notion de "vocabulaire" : Tu ne veux pas créer un objet COM mais l'instancier.

    Avec Visual Studio, il y a un outil nommé OLEViewer.
    Il permet de charger l'objet COM (dll ou exe) et de voir les prototype des interfaces.

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 29
    Par défaut
    Bonjour et merci pour vos réponses,

    Melem: le but de mon travail est de faire communiquer deux logiciels via les objets COM.
    Pour l'instant j'ai crée un projet sous Visual Studio et j’essaie déjà de communiquer avec un seul logiciel.
    Pour les deux logiciels j'ai la doc fournie.

    fregolo52 : peux-tu stp me dire ou se trouve cet outil, j'ai Visual Studio 2010, et c'est ma première utilisation donc je ne le maitrise pas bien.
    Merci pour la correction du vocabulaire.

    Merci pour votre aide.

  5. #5
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    je n'ai pas 2010 sous la main.
    Mais sous 2005, dans le menu "Tools" tu dois y trouver Ole View.
    Si tu ne l'as pas télécharge-le, c'est plus simple (que de retrouver dans le setup de Visual pour cocher la bonne option).

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 29
    Par défaut
    j'ai installé OLEView, j'ai trouvé le logiciel qui m’intéresse dans "type libraries",
    j'ai trouvé le uuid qui correspond au CLSID(je pense), et plusieurs interfaces,
    qui correspondent aux classes citées dans la doc du logiciels.
    Mais j'ai pas trouvé les autres paramètres de la fonction CoCreateInstance().
    Une idée de ou ils se trouvent?

    Merci d'avance.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    • pUnkOuter est nul puisque tu ne fais pas d'aggrégation
    • Pour ClsCtx ça dépend de ce que supporte le composant. S'il contient une clé InprocServer32, tu peux l'instancier en CLSCTX_INPROC_SERVER
    • riid et ppv vont ensemble: Tu y mets le GUID de l'interface et un pointeur vers ton pointeur (le B-A-BA de COM, quoi).
    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.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 29
    Par défaut
    Merci Médinoc pour ta réponse,

    riid et ppv vont ensemble: Tu y mets le GUID de l'interface et un pointeur vers ton pointeur (le B-A-BA de COM, quoi)
    Pour le GUID de l'interface je l'ai, mais pour le pointeur vers mon pointeur je ne sais pas ce qu'il faut mettre, si tu peux m'expliquer un peu plus stp.

    Voila ce que je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    DEFINE_GUID( clsid,
    0x21143c01, 0xdddf, 0x11d0, 0xab, 0x8f, 0x0, 0x0, 0xc0, 0x14, 0x8f, 0xdb);
     
    /* {06F1BAD0-DD14-11d0-AB8F-0000C0148FDB}  */
    DEFINE_GUID(riid,
    0x6f1bad0, 0xdd14, 0x11d0, 0xab, 0x8f, 0x0, 0x0, 0xc0, 0x14, 0x8f, 0xdb);
     
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow )
    {
    	HRESULT  hres = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, riid, ???);
     
    }
    Merci pour ton aide.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Tu dois avoir le fichier d'en-tête qui définit l'interface (si tu as juste une Type Library, en C, tu es dans la M*** mais tu peux plus ou moins reconstituer le fichier .idl avec OLEVIEW, puis recompiler le .idl pour obtenir un .h).

    Et ensuite:
    Code C : 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
     
    DEFINE_GUID( CLSID_LA_CLASSE_EN_QUESTION,
    0x21143c01, 0xdddf, 0x11d0, 0xab, 0x8f, 0x0, 0x0, 0xc0, 0x14, 0x8f, 0xdb);
     
    /* {06F1BAD0-DD14-11d0-AB8F-0000C0148FDB}  */
    DEFINE_GUID(IID_L_INTERFACE_EN_QUESTION,
    0x6f1bad0, 0xdd14, 0x11d0, 0xab, 0x8f, 0x0, 0x0, 0xc0, 0x14, 0x8f, 0xdb);
     
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow )
    {
    	/*(Insérer appel à CoInitialize() ici)*/
     
    	ILInterfaceEnQuestion * pObj = NULL;
    	HRESULT  hres = CoCreateInstance(
    		CLSID_LA_CLASSE_EN_QUESTION, 
    		NULL, 
    		CLSCTX_LOCAL_SERVER, 
    		IID_L_INTERFACE_EN_QUESTION,
    		(void**)&pObj
    		);
     
    	if(SUCCEEDED(hres))
    	{
    		/*
    		Travail sur l'objet
    		...
    		*/
     
    		/*Libération de l'objet, version C*/		
    		pObj->lpVtbl->Release(pObj), pObj=NULL;
    	}
     
    	/*(Insérer appel à CoUninitialize() ici)*/
     
    	return 0;
    }
    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.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 29
    Par défaut
    Est ce tu as un exemple stp parce que la je suis perdue

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 29
    Par défaut
    Merci beaucoup pour ton aide, je vais essayer ce que tu m'as dit et je te tiens informé.

  12. #12
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 29
    Par défaut
    Bonjour Médinoc,
    je voulais savoir si il me manque les autres fichiers générés par MIDL: fichier_i.c, fichier_p.c, dlldata.c, fichier.tlb, pour le bon fonctionnement de mon projet??
    car je veux tester la communication avec mon logiciel en essayant d'ouvrir un fichier, mais j'ai des erreurs (sachant que j'ai juste le fichier.h que tu m'as généré):
    voila le code main.cpp:
    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
     
    DEFINE_GUID(CProjet_CLSID,
    0x21143c01, 0xdddf, 0x11d0, 0xab, 0x8f, 0x0, 0x0, 0xc0, 0x14, 0x8f, 0xdb);
     
    DEFINE_GUID(IID_IJobInterface,
    0x146C3C3D, 0x4F7D, 0x408F, 0xAE, 0x35, 0x5D, 0x3F, 0x83, 0xE7, 0xDE, 0x52);
     
    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,LPSTR lpCmdLine,int nCmdShow)
    {
    	IJobInterface *pObj = NULL;
    	BSTR pname;
    	IDispatch **obj;
    	HRESULT  hres = CoCreateInstance(
    		CProjet_CLSID, 
    		NULL, 
    		CLSCTX_LOCAL_SERVER, 
    		IID_IJobInterface,
    		(void**)&pObj
    		);
     
    	if(SUCCEEDED(hres))
    	{
    		pname = (BSTR("schéma.e3s"));
     
    		pObj->Open(pname,0);
    }
     
    }
    Et voila les erreurs:
    >c:\visual studio 2010\projects\myprojet\myprojet\mymain.cpp(8): error C2065: 'CProjet_CLSID'*: identificateur non déclaré
    1>c:\visual studio 2010\projects\myprojet\myprojet\mymain.cpp(9): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut
    1>c:\visual studio 2010\projects\myprojet\myprojet\mymain.cpp(9): error C2078: initialiseurs trop nombreux
    1>c:\visual studio 2010\projects\myprojet\myprojet\mymain.cpp(11): error C2065: 'IID_IJobInterface'*: identificateur non déclaré
    1>c:\visual studio 2010\projects\myprojet\myprojet\mymain.cpp(12): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut
    1>c:\visual studio 2010\projects\myprojet\myprojet\mymain.cpp(12): error C2374: 'DEFINE_GUID'*: redéfinition*; initialisation multiple
    1>c:\visual studio 2010\projects\myprojet\myprojet\mymain.cpp(8)*: voir la déclaration de 'DEFINE_GUID'
    1>c:\visual studio 2010\projects\myprojet\myprojet\mymain.cpp(12): error C2078: initialiseurs trop nombreux
    1>c:\visual studio 2010\projects\myprojet\myprojet\mymain.cpp(15): error C2146: erreur de syntaxe*: absence de ';' avant l'identificateur 'WinMain'
    1>c:\visual studio 2010\projects\myprojet\myprojet\mymain.cpp(15): error C2065: 'HINSTANCE'*: identificateur non déclaré
    1>c:\visual studio 2010\projects\myprojet\myprojet\mymain.cpp(15): error C2146: erreur de syntaxe*: absence de ')' avant l'identificateur 'hInstance'
    1>c:\visual studio 2010\projects\myprojet\myprojet\mymain.cpp(15): error C4430: spécificateur de type manquant - int est pris en compte par défaut. Remarque*: C++ ne prend pas en charge int par défaut
    1>c:\visual studio 2010\projects\myprojet\myprojet\mymain.cpp(15): error C2059: erreur de syntaxe*: ')'
    1>c:\visual studio 2010\projects\myprojet\myprojet\mymain.cpp(16): error C2143: erreur de syntaxe*: absence de ';' avant '{'
    1>c:\visual studio 2010\projects\myprojet\myprojet\mymain.cpp(16): error C2447: '{'*: en-tête de fonction manquant (liste formelle à l'ancien format*?)
    1>
    1>ÉCHEC de la build.
    1>
    Si je change l'extension du fichier main en .c j'ai l'erreur suivante:
    fatal error C1853: Le fichier d'en-tête précompilé 'Debug\MyProjet.pch' est issu d'une version antérieure du compilateur, ou l'en-tête précompilé est en C++ et vous l'utilisez en C (ou inversement)
    Pourtant moi mon code est en c.

    Merci d'avance

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Pense à inclure <windows.h> et compagnie.
    Il faudra qu'un de tes fichiers source inclue <initguid.h> ou tu auras des erreurs de linkage.

    Si tu es en local_server, il y a des chances que tu aies besoin des proxys (fichiers .c supplémentaires génèrent ça) en effet, mais ce n'est pas certain.
    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.

  14. #14
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 29
    Par défaut
    Bonjour Médinoc,
    désolée je vais t’embêter encore.

    J'ai deux problèmes que je n'arrive pas à résoudre:

    1)J'ai des erreurs dans mon cocreateinstance(), et je ne sais pas quoi faire:
    error C2440: 'fonction'*: impossible de convertir de 'const GUID' en 'const IID *const '
    warning C4024: 'CoCreateInstance'*: types différents pour le paramètre formel et réel 1
    error C2440: 'fonction'*: impossible de convertir de 'const GUID' en 'const IID *const '
    warning C4024: 'CoCreateInstance'*: types différents pour le paramètre formel et réel 4
    (le code est le même que le post précédent)
    J'ai essayé de mettre & devant REFCLSID , et REFIID mais ça ne change rien.

    2)Pour la génération des fichiers avec midl.exe, je n'arrive toujours pas :

    j'ai fait :
    midl /proxy myfile_p.c e3.idl
    midl /iid myiid.c e3.idl
    midl /tlb mytlb.tlb e3.idl

    Mais j'ai des erreurs comme ce que je t'ai montré la dernière fois.(c'est bien ce qu'il faut faire?)
    et Est ce que ça marche chez toi?

    Merci beaucoup pour ton aide.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    1) En C, il faut utiliser &CProjet_CLSID et &IID_IJobInterface, et ça devrait marcher (ou du moins, avoir une erreur différente)

    2) Quelle est ta version de MIDL, en fait?
    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.

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 29
    Par défaut
    Bonjour Médinoc,
    j'ai bien mis CoInitialize(NULL) avant le cocreateInstance().
    la valeur de hres est 80040154, j'ai trouvé que ça correspond à REGDB_E_CLASSNOTREG, Class not registered. je ne sais pas quelle classe il faut enregistrer.

    Merci.

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 395
    Par défaut
    Il faut enregistrer la DLL qui contient les classes, avec regsvr32.
    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.

  18. #18
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 29
    Par défaut
    Bonjour Médinoc,
    Par rapport à la Dll qui contient les classes, ou est ce que je peux la trouver?
    j'ai essayé avec le fichier .dll indiqué par ActiveX Inspector mais regsvr32 me
    retourne:
    le module a été chargé mais le point d'entrée DllRegisterServer est introuvable.
    Vérifier que c'est bien un fichier Dll ou OCX valide, et réessayez.
    Merci d'avance

Discussions similaires

  1. Instanciation de l'objet COM
    Par Greenzy dans le forum Langage
    Réponses: 0
    Dernier message: 03/12/2012, 10h35
  2. [COM] Problème d'instanciation d'objet COM
    Par lpapouk dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 02/07/2008, 15h14
  3. objet Com probleme d'instanciation
    Par orelien60110 dans le forum Apache
    Réponses: 3
    Dernier message: 15/03/2007, 13h13
  4. [COM] Problème Instanciation de l'objet COM
    Par ludobado dans le forum Bibliothèques et frameworks
    Réponses: 1
    Dernier message: 14/11/2006, 11h06
  5. instancier objet COM
    Par Someonelse dans le forum MFC
    Réponses: 2
    Dernier message: 14/11/2005, 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