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

MFC Discussion :

[MFC/Outlook] Erreur lors de la création d'un contact


Sujet :

MFC

  1. #1
    Membre éclairé Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    Par défaut [MFC/Outlook] Erreur lors de la création d'un contact
    Bonjour à tous,
    Je souhaiterais parcourir une base de donnée (Pervasive), trouver un contact particulier dans cette base (par exemple Nom = MARTIN) et créer un contact Outlook en récupérant les informations dans la base.

    Pour ce faire j'utilise les classe CDatabase et CRecordset ainsi que le modèle objet de Outlook.

    Voici mon code (qui n'est pas encore complet) :
    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
     //On parcourt la table pour trouver le contact que l'on veut créer sous Outlook	
            while (!spRecordSetContact.IsEOF())
    	{
    		if(strcmp((const char *)spRecordSetContact.m_ChefSv.Trim(), "Bouli") == 0)
    		{	
    			CContactItem NewContact;
    			CUserProperties NewContactProperties = NewContact.get_UserProperties();
    			AfxMessageBox(_T("Création en cours..."));
    			NewContact.put_LastName(CString(spRecordSetContact.m_NomCnt.Trim()));
    			NewContact.put_Email1Address(CString(spRecordSetContact.m_MelCnt.Trim()));
    			//CUserProperty NewField = NewUserProperties.Add(_T("CodTie"), 1, vVariant, vDisplay); //1 = Type Text
    			//NewContact.Save(); //On sauvegarde le nouveau contact
    			//spItem.Add();
    		}
    		spRecordSetContact.MoveNext();
    	}
    Donc je recherche le contact dont le chef de service est "Bouli", tout marche bien seulement ma table contient 3 contacts, le 2eme contact est celui que je veux créer. Tout fonctionne jusqu'à ce que la ligne en rouge génère une erreur (à l'exécution) lors de l'accès au dernier contact de la table.
    Je ne comprend pas d'où cela peut venir car je parcourt ma table avec le même type de boucle un peu plus haut dans mon programme et cela fonctionne parfaitement.

    Si quelqu'un a une idée.
    Merci.

  2. #2
    Membre éclairé Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    Par défaut
    Après plusieurs tests, si j'enlève tous le bloc "if", la boucle fonctionne correctement et aucune erreur n'est générée.

    Le recordset n'est utilisé qu'en lecture, je ne pense donc pas que cela vienne de lui.

    A partir du moment ou je ne met pas la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CUserProperties NewContactProperties = NewContact.get_UserProperties();
    En commentaire, l'erreur est générée.

  3. #3
    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 la classe CContactItem est bien la classe de smart pointers, alors NewContact est un smart pointer qui ne pointe sur rien du tout...
    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.

  4. #4
    Membre éclairé Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    Par défaut
    Bonjour,
    Effectivement, seulement je souhaite créer un contact de toute pièce et remplir ses champs grâce à ma table.
    Comment faire alors pour créer un Contact puis l'ajouter à Outlook ?
    Merci.

  5. #5
    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 doit y avoir une méthode New, Create ou Add dans la classe qui fait la liste de contacts, ou un truc du genre. Regarde dans la doc du modèle objet Outlook...
    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.

  6. #6
    Membre éclairé Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    Par défaut
    Bonjour,
    La classe CContactItem ne contient pas de fonction d'ajout ou de création ce qui me semble logique car un contact ne se crée pas tous seul

    J'ai donc regardé la classe du dessus "CItem" qui elle contient une fonction "Add" dont voici le prototype :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    LPDISPATCH CItems::Add(Variant &Type)
    Je suppose donc que le Type est le type d'objet que l'on veut créer, dans notre cas un CContactItem.
    Reste plus qu'a trouvé la valeur correspondante au CContactItem...
    Pour le moment je n'ai rien trouvé dans la msdn..

    Merci.

  7. #7
    Membre éclairé Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    Par défaut
    Voila j'ai trouvé, voici la table de correspondance de olItemType :
    http://msdn.microsoft.com/en-us/library/aa911356.aspx

    Et voici la doc de la fonction add :
    http://msdn.microsoft.com/en-us/library/bb220348.aspx

  8. #8
    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
    Note: apparemment, Add() est exposé par CItems, pas CItem...
    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. #9
    Membre éclairé Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    Par défaut
    Oui oui excuse moi, c'est un oublie, c'est bien CItems..
    Sinon il se passe quelque chose de bizarre, voici mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    VARIANT vContactItem;
    vContactItem.vt = VT_INT;
    vContactItem.intVal = 2;
     
    CContactItem NewContact = spItem.Add(vContactItem);
    spItem étant la collection de tous mes contacts Outlook.

    Ce code me semble correct seulement il me génère l'erreur "Paramètre Incorrect" à l'exécution...

    Une idée ?

    Merci

  10. #10
    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
    Déjà, renomme ton pointeur intelligent en spItems pour indiquer qu'il pointe bien sur une collection.
    Ensuite, essaie de voir en passant explicitement un pointeur sur le VARIANT, plutôt que le passer directement.
    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. #11
    Membre éclairé Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    Par défaut
    Toujours la même erreur...

  12. #12
    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
    Peux-tu montrer plus de code ?

    PS: La doc la plus récente et la plus complète sur OlItemType est celle-ci.
    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. #13
    Membre éclairé Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    Par défaut
    Voici mon code (j'ai surement pas du faire ce que tu pensais..) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    VARIANT *vContactItem;
    vContactItem = new VARIANT;
    vContactItem->vt = VT_INT;        
    vContactItem->intVal = 2;
    CContactItem NewContact = spItems.Add(*vContactItem);
    C'est pas à ça que tu pensais ? (C'est vrai que ça revient à la même chose que de le passer directement..)

  14. #14
    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
    Est-ce que ceci compile? (et marche ?)
    Code C++ : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    VARIANT vContactItem;
    vContactItem.vt = VT_INT;
    vContactItem.intVal = 2;
     
    CContactItem NewContact = spItem.Add(&vContactItem);
    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. #15
    Membre éclairé Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    Par défaut
    Non cela ne compile pas :
    "Impossible de convertir le paramètre 1 de 'VARIANT' en 'VARIANT &' "

  16. #16
    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
    Puis-je voir la déclaration et l'initialisation de spItem ?
    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.

  17. #17
    Membre éclairé Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    Par défaut
    Bien sûr, la voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    CApplication spAppli;
    CMAPIFolder spFolder;
    CNameSpace spNameSpace;
    
    spAppli.CreateDispatch(_T("Outlook.Application"));
    
    spNameSpace = spAppli.GetNamespace(_T("MAPI"));
    
    spFolder = spNameSpace.GetDefaultFolder(10); //10 = Folder Contacts
    
    CItems spItems(spFolder.get_Items());
    PS : Je ne pense pas que cela vienne de la car l'ensemble du programme fonctionne et j'utilise plusieurs fois spItems

  18. #18
    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 doit s'être passé un truc bizarre lors de mon import, car je n'ai pas les mêmes prototypes que toi.

    Chez moi, CItems::Add() prend un LPDISPATCH en paramètre au lieu d'un VARIANT &, alors que la doc parle bien d'un VARIANT...
    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.

  19. #19
    Membre éclairé Avatar de SmOkEiSBaD
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    234
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2008
    Messages : 234
    Par défaut
    Voici l'intégralité de mon code :

    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
     
    CApplication spAppli;
    	CMAPIFolder spFolder;
    	CNameSpace spNameSpace;
    	CString sTest;
     
    	VARIANT vVariant, vValue, vDisplay, vContactItem;   
    	vVariant.vt = VT_BOOL;           //vVariant est un booléen servant dans la fonction CUserProperties::Find
    	vVariant.boolVal = VARIANT_TRUE; //vVariant = True signifie que l'on recherche une "custom properties"
    	vValue.vt = VT_BSTR;             //vValue est une CString servant à récupérer la valeur du champ IDG5 
    	vDisplay.vt = VT_INT;
    	vDisplay.intVal = 1;             //vDisplay est un Int qui permet de choisir le type d'affichage des champs perso que l'on crée.
    	vContactItem.vt = VT_INT;        //vContactItem est un Int qui permet de créer un objet de type CContactItem
    	vContactItem.intVal = 2;
     
    	//Création d'un smart pointer sur une application Outlook
    	spAppli.CreateDispatch(_T("Outlook.Application"));
    	AfxMessageBox(_T("Application Outlook ouverte"));
     
    	//Récupération du Namespace
    	spNameSpace = spAppli.GetNamespace(_T("MAPI"));
     
    	//Récupération du répertoire des contacts
    	spFolder = spNameSpace.GetDefaultFolder(10);
     
    	//Récupération des contacts et de leurs informations
    	AfxMessageBox(_T("Traitement des contacts..."));
    	CItems spItems(spFolder.get_Items()); //On récupère l'ensemble des contacts dans une collection d'objet
     
    	AfxMessageBox(_T("Creation d'un nouveau contact Outlook à partir de la base"));
     
    	//On parcourt la table pour trouver le contact que l'on veut créer sous Outlook
    	while (!spRecordSetContact.IsEOF())
    	{
    		if(strcmp((const char *)spRecordSetContact.m_ChefSv.Trim(), "Bouli") == 0) //Filtre de recherche
    		{	
    			CContactItem NewContact = spItems.Add(vContactItem);
     
    		}
    	spRecordSetContact.MoveNext();
    	}
    	spRecordSetContact.MoveFirst(); //On revient à la première ligne
    Le recordset que j'ai fonctionne parfaitement, je l'utilise également à d'autres endroit de mon code sans aucun problème.

  20. #20
    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
    Et que se passe-t-il si tu passes vMissing à la place?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    COleVariant vMissing(DISP_E_PARAMNOTFOUND, VT_ERROR);
    CContactItem spNewContact = spItems.Add(vMissing);
    PS: Sinon, tu peux toujours renoncer aux wrappers MFC pour utiliser ceux du Compiler COM Support à la place : Je viens de trouver comment les faire marcher...
    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.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 4
    Dernier message: 21/02/2006, 16h47
  2. Réponses: 1
    Dernier message: 15/12/2005, 09h45
  3. Réponses: 1
    Dernier message: 26/05/2005, 12h24
  4. message d'erreur lors de la création de la base
    Par ber_jp dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 20/05/2004, 12h15
  5. message d'erreur lors de la création d'une base
    Par franculo_caoulene dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 16/04/2004, 15h47

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