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

  1. #21
    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

  2. #22
    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.

  3. #23
    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.

  4. #24
    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.

  5. #25
    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
    1) Oui J'ai déjà essayé ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    HRESULT  hres = CoCreateInstance(&CProjet_CLSID,NULL, CLSCTX_INPROC_SERVER, &IID_IApplicationInterface,(void**)&pObj);
    Mais j'ai quand même l'erreur:
    il n'existe aucun constructeur approprié pour la conversion de "const IID *" en "_GUID"
    2)j'ai midl version 7.0 (Microsoft sdks v7.0).

  6. #26
    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. Es-tu sûr que tu compiles bien en C?
    2. J'utilise MIDL v6.00.0366 de Visual Studio 2005. Ma commande a été:
      midl e3.idl /h e3.h /proxy myfile_p.c /iid myiid.c /tlb mytlb.tlb >errors.txt.
      (depuis le Visual Studio 2005 command prompt)
      Je n'ai eu aucune erreur dans MIDL, seulement des warnings. Il m'a généré le .h, le iid.c et le .tlb, mais pas de proxy.
    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.

  7. #27
    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,
    Oui je compile en C (l'extension de mon fichier est bien .c).
    En fait il me souligne dans le code l'opérateur d'adresse '&' dans &CProjet_CLSID et &IID_IJobInterface.
    Lors de la génération du projet j'ai une seule erreur dans la fenêtre de sortie:
    error C2039: 'Open' : n'est pas membre de 'IJobInterface'
    Mais dans la fenêtre liste des erreurs j'ai :
    IntelliSense : il n'existe aucun constructeur approprié pour la conversion de "const IID *" en "_GUID"
    IntelliSense : il n'existe aucun constructeur approprié pour la conversion de "const CLSID *" en "_GUID"
    error C2039: 'Open' : n'est pas membre de 'IJobInterface'
    Si je met en commentaire la ligne qui provoque l'erreur 'Open' : n'est pas membre de 'IJobInterface' j'ai les erreurs suivantes:

    IntelliSense*: il n'existe aucun constructeur approprié pour la conversion de "const IID *" en "_GUID"
    IntelliSense*: il n'existe aucun constructeur approprié pour la conversion de "const CLSID *" en "_GUID"
    error LNK2001: symbole externe non résolu _IID_IJobInterface
    error LNK2001: symbole externe non résolu _CProjet_CLSID
    error LNK1120: 2 externes non résolus
    Pour Open il est bien dans la déclaration de l'interface IJobInterface, je ne sais pas pourquoi il ne le trouve pas.

    Merci d'avance.

  8. #28
    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 n'est pas normal que le code cherche à convertir en _GUID. Il y a une erreur là-dessus.

    Pour le Open, n'oublie pas qu'en C on doit utilise lpVtbl et repasser le pointeur de l'objet en premier paramètre.

    Ou bien, tu mets #define COBJMACROS avant le #include "e3.h" et tu pourras utiliser la macro IJobInterface_Open() qui fait ça pour toi.

    Quant aux erreurs de linkage, soit tu ajoutes le iid.c à ton projet, soit tu fais un #define INITGUID avant les includes dans un seul des fichiers du projet.

    Edit: Aaaaaaaaaaaaaaaaaah j'ai trouvé! Ton erreur, ce n'est pas le compilo C qui la signale, c'est intellisense!

    Et tu ne peux rien contre ça. Intellisense se croit toujours en C++. C'est un bug connu, qui existe au moins depuis Visual 2005, mais qui est devenu plus important dans Visual 2010 maintenant que les erreurs de Intellisense sont affichées.
    Et Micro$oft ne va pas lever le petit doigt parce qu'ils se moquent des programmeurs C.

    La bonne nouvelle, c'est que normalement les erreurs Intellisense n'empêchent pas ton programme de compiler.
    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.

  9. #29
    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,

    Voila j'ai fait ce que tu m'as dit et je n'ai plus l'erreur par rapport à Open.
    Mais maintenant le problème est que le cocreateinstance ne marche pas (je pense que les problèmes intellisence l’empêche de fonctionner), car je ne rentre pas dans la condition if(SUCCEDED(hres)), donc je ne peux pas travailler sur l'objet.
    Et je n'ai aucune erreur, donc je ne sais pas vraiment quoi faire.

    Merci d'avance.

  10. #30
    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
    Si SUCCEEDED(hres) est faux, alors hres contient la valeur d'erreur.

    Et je parie que cette valeur est égale à CO_E_NOTINITIALIZED, parce que tu n'as pas appelé CoInitialize().
    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.

  11. #31
    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.

  12. #32
    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.

  13. #33
    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

  14. #34
    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
    La DLL est-elle liée à MSCOREE.DLL ? Si oui, c'est une DLL .Net, qui doit être enregistrée avec RegAsm.exe (qui à ma connaissance, n'est pas dans le PATH) à la place.
    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.

  15. #35
    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,
    merci pour ta réponse.

    La Dll s'est bien enregistrée avec regasm, il me dit :Inscription des types réussie.
    Mais la valeur du HRESULT est toujours 80040154.

  16. #36
    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
    Dans ce cas, lis la doc de la *$^*ù£¨µ de DLL!
    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.

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