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++Builder Discussion :

Ouvrir simplement Outlook. [OLE]


Sujet :

C++Builder

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Par défaut Ouvrir simplement Outlook.
    Bonjour tout le monde,


    Je cherche a développer un générateur d'email. J'ai déjà manié excel avec C++ Builder sans souci. J'utilise la version XE2, et office 2007.

    J'ai bien sur suivis la FAQ builder, qui pour excel a fonctionné a merveille, hormis certain souci avec les WideString remplaçant des AnsiString.

    La j'utilise le code basique de la FAQ a savoir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    	try
    	{
    		vMSOutlook = Variant::GetActiveObject("Outlook.Application");
    	}
    	catch(...)
    	{
    		vMSOutlook = Variant::CreateObject("Outlook.Application");
    	}
    	vEspaceDeNom = vMSOutlook.OleFunction("GetNameSpace", "MAPI");
    Suite a la derniére ligne j’obtiens une Exception :

    "Type de variable incorrect"

    J'ai pourtant simplement copier collé.

    Vous avez une idée ? Merci.

  2. #2
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Salut Traxsilver
    Le programme fonctionne
    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
     
    //---------------------------------------------------------------------------
    #include <vcl.h>
    #pragma hdrstop
    #include "Unit1.h"
    #include "utilcls.h"
    //---------------------------------------------------------------------------
    #pragma package(smart_init)
    #pragma resource "*.dfm"
    TForm1 *Form1;
    Variant vMSOutlook, vEspaceDeNom;
    //---------------------------------------------------------------------------
    __fastcall TForm1::TForm1(TComponent* Owner)
            : TForm(Owner)
    {
    }
    //---------------------------------------------------------------------------
    void __fastcall TForm1::Button1Click(TObject *Sender)
    {
     try
     {
    // ici ci outlook n'est pas charge il y a une erreur, relancer par Run cette erreur n'est generee quand mode pas a pas
      vMSOutlook = Variant::GetActiveObject("Outlook.Application");
     }
     catch(...)
     {
      vMSOutlook = Variant::CreateObject("Outlook.Application");
     }
     vEspaceDeNom = vMSOutlook.OleFunction("GetNameSpace", "MAPI");
    }
    //---------------------------------------------------------------------------

  3. #3
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Par défaut
    Merci de ta réponse Blondelle.

    Mais pourtant nos 2 codes sont identique. Et pourtant a la ligne 10 j'ai bien une exeption.
    Pour pouvoir exporter tout ca j'ai fait un fichier C++ appart avec dans le .h :

    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
     
    #ifndef UtilisezOutlookH
    #define UtilisezOutlookH
    #include <System.Classes.hpp>
    #include <Vcl.StdCtrls.hpp>
    #include <utilcls.h>class UseOutlook
    {
    	private :
    		Variant vMSOutlook, vEspaceDeNom, vDossierReception, olFolderInbox;
    		Variant  vobjNewMail, chemin;
    	public  :
    		bool Envoyez(WideString dest, WideString copie, WideString sujet, TMemo* contenue) ;
    		UseOutlook() ;
    		OuvrirOutlook() ;
    		~UseOutlook() ;
    };
    #endif
    Et dans le 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
    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
    55
    56
    57
    58
     
    #pragma hdrstop
     
    #include "UtilisezOutlook.h"
    #pragma package(smart_init)
    UseOutlook::UseOutlook()
    {
    	//ouvre outlook
       /*	try
    	{
    		vMSOutlook = Variant::GetActiveObject("Outlook.Application");
    	}
    	catch(...)
    	{
    		vMSOutlook = Variant::CreateObject("Outlook.Application");
    	}
    	vEspaceDeNom = vMSOutlook.OleFunction("GetNameSpace", "MAPI");
    	vEspaceDeNom.OleFunction("Logon", "", "", true, true);  */
    }
    //---------------------------------------------------------------------------
    UseOutlook::~UseOutlook()
    {
    	//destructeur qui ferme outlook
    	vEspaceDeNom.OleFunction("Logoff");
    	vMSOutlook.OleFunction("Quit");
    }
    //---------------------------------------------------------------------------
    UseOutlook::OuvrirOutlook()
    {
    	//ouvre outlook
     
     try
     {
    // ici ci outlook n'est pas charge il y a une erreur, relancer par Run cette erreur n'est generee quand mode pas a pas
    	vMSOutlook = Variant::GetActiveObject("Outlook.Application");
     }
     catch(...)
     {
    	vMSOutlook = Variant::CreateObject("Outlook.Application");
     }
     vEspaceDeNom = vMSOutlook.OleFunction("GetNameSpace", "MAPI");
    	//vEspaceDeNom.OleFunction("Logon", "", "", true, true);
    }
    //---------------------------------------------------------------------------
    bool UseOutlook::Envoyez(WideString dest, WideString copie, WideString sujet, TMemo *contenue)
    {
    	//la pour envoyer le message
    	//vEspaceDeNom = vMSOutlook.OleFunction("GetNameSpace", "MAPI");  //deja dans ouvrir()
    	vobjNewMail = vMSOutlook.OleFunction("CreateItem", 0);
    	vobjNewMail.OleFunction("Display");
    	for(int i = 0 ; i <= contenue->Lines->Count; i++)
    	{
    		vobjNewMail.OlePropertySet("Body",contenue->Lines[0][i] );
    	}
    	vobjNewMail.OlePropertySet("Subject", sujet);
    	vobjNewMail.OlePropertySet("To", dest);
    	return true ;
    }
    Peut etre le probleme vient du fait que le code soit séparé. J'ai pourtant toujours utilisé excel par le meme principe, une classe dédiée, et un objet instancier dynamiquement dans mon programme.
    Je vais donc essayer d'intégrer le code directement dans la Form pour faire un test. Et je reviens poster les résultats.

  4. #4
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    Essaye le morceau de code que je t'ai poste il faut juste poser un TButton sur une Form vierge.
    En mode teste il va y avoir une exeption sur la ligne ci dessous ce qui est normal si outlook n'est pas actif, quand le code est compile en .exe l'erreur ne se voie plus, c'est un comportement normal, c'est juste pour signaler que l'on passe sur le Try / Catch, pour continuer le teste faire Run ou F9
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vMSOutlook = Variant::GetActiveObject("Outlook.Application");

  5. #5
    Membre averti
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Par défaut
    J'avais bien compris que la première ligne génére une exception car outlook n'est pas ouvert, si je l'ouvre au préalable je n'ai pas l’exception. J'ai donc fais un nouveau projet comme tu le suggérais avec juste un bouton. Le résultat est le meme j'ai une exception a l'exécution de cette ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     vEspaceDeNom = vMSOutlook.OleFunction("GetNameSpace", "MAPI");
    Voici la capture :

    exeption_outlook.jpg


    L’exception survient bien apres le point d'arret qu'on voit sur la capture.

  6. #6
    Rédacteur
    Avatar de blondelle
    Homme Profil pro
    Inscrit en
    Mars 2006
    Messages
    2 738
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 738
    Par défaut
    dans la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    vEspaceDeNom = vMSOutlook.OleFunction("GetNameSpace", "MAPI");
    vEspaceDeNom est un variant ainsi que vMSOutlook
    GetNameSpace est une fonction outlook reste MAPI
    Je pense que la gestion unicode de XE est en cause, je ne peux pas t'aider plus je ne possede pas XE

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

Discussions similaires

  1. Ouvrir simplement un fichier distant ?
    Par thierry.d dans le forum NetBeans
    Réponses: 0
    Dernier message: 04/04/2011, 10h58
  2. impossible d'ouvrir microsoft outlook
    Par bendesarts dans le forum Outlook
    Réponses: 1
    Dernier message: 14/06/2010, 19h51
  3. ouvrir le outlook de PDA ou l'emulateur
    Par dourid9 dans le forum C#
    Réponses: 0
    Dernier message: 12/09/2009, 18h23
  4. Réponses: 5
    Dernier message: 17/04/2008, 11h53
  5. ouvrir contact outlook depuis un formulaire
    Par patgame dans le forum Modélisation
    Réponses: 4
    Dernier message: 21/08/2007, 00h13

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