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

  1. #1
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Points : 59
    Points
    59
    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
    Points : 3 766
    Points
    3 766
    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");
    }
    //---------------------------------------------------------------------------
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  3. #3
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Points : 59
    Points
    59
    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
    Points : 3 766
    Points
    3 766
    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");
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  5. #5
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Points : 59
    Points
    59
    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
    Points : 3 766
    Points
    3 766
    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
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  7. #7
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Points : 59
    Points
    59
    Par défaut
    Merci pour ton analyse. J'ai effectivement eu un certain nombre de souci avec la gestion unicode. Mais en general c'est seulement si je remplace une variable det ype WideString en paramètre d'une fonction OLE. Pour Excel tout fonctionne bien pourtant.

    Exemple de code OLE présent dans le meme projet :

    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
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
     
     
    #pragma hdrstop
     
    #include "Lireexcel.h"
     
    #pragma package(smart_init)
    //---------------------------------------------------------------------------
    Inexcel::Inexcel(WideString nomduexcel,WideString lefeuillet)
    {
    	BaseName = nomduexcel ;
    	vCell = "" ;
    	feuillet = lefeuillet ;
    	data_cellule = range = "" ;
    	ouvrirexcel() ;
    }
    //---------------------------------------------------------------------------
    Inexcel::~Inexcel()
    {
    	//destructeur qui ferme excel
    	// fermer par la croix pareil que fermer
    	try
    	{
    		vMSExcel.OleFunction("Quit");
    		vMSExcel = Unassigned; //libere les resources
    	}
    	catch(Exception &exception)
    	{
    		//rien on s'en tappe defois il veux pas liberer les resources.
    		// Free le fera plus tard.
        }
    }
    //---------------------------------------------------------------------------
    void Inexcel::ouvrirexcel()
    {
    	//on ouvre l'instance excel en lecture seule
    	vMSExcel = Variant::CreateObject("Excel.Application");
    	vMSExcel.OlePropertySet("Visible", false);
     
    	//on charge le fichier
    	vSeparator = 4;
    	vReadOnly = true ;
    	vFileName = BaseName ;
    	vXLWorkbooks = vMSExcel.OlePropertyGet("Workbooks");
    	vXLWorkbook = vXLWorkbooks.OleFunction("Open", vFileName, Unassigned, vReadOnly);
     
    	//on déclare sur quel feillet on travaille
    	vSheetName = feuillet;
    	vWorksheet = vXLWorkbook.OlePropertyGet("Worksheets",vSheetName);
     
     
    }
     
    //---------------------------------------------------------------------------
    WideString Inexcel::readcell(WideString lacase)
    {
    	//ici lis ce qu'il y'a dans la cellule
    	vRange = lacase ;
    	try
    	{
    		//on test defois qu'on est fermé excel
    		vCell = vWorksheet.OlePropertyGet("Range", vRange);
    	}
    	catch(Exception &exception)
    	{
    		//si excel a été fermé on le réouvre
    		ouvrirexcel() ;
    		vCell = vWorksheet.OlePropertyGet("Range", vRange);
    	}
    	data_cellule = vCell.OlePropertyGet("Value");
    	if(data_cellule == "") data_cellule = "N/A" ;
    	return data_cellule ;
    }
    //---------------------------------------------------------------------------
    WideString Inexcel::findcell(WideString text)
    {
    	//ici on cherche la cellule qui corespond a text
    	try
    	{
    		//on test defois qu'on est fermé excel
    		vRange = vWorksheet.OlePropertyGet("UsedRange");
    	}
    	catch(Exception &exception)
    	{
    		//si excel a été fermé on le réouvre
    		ouvrirexcel() ;
    		vRange = vWorksheet.OlePropertyGet("UsedRange");
    	}
    	vCell = vRange.OleFunction("Find", text) ;
    	if(	vCell.VInteger != 0 )
    	{
    		//on recup son emplacement excel
    		range = vCell.OlePropertyGet("Address", false, false);
    	}
    	else
    	{
    		// on as pas trouver la recherche
    		range = "" ;
    	}
    	return WideString(range) ;
     
    }
    //---------------------------------------------------------------------------
    WideString Inexcel::findnext()
    {
    	//ici on cherche la prochaine cellule qui corespond
    	//a ce qu'on as deja chercher
    	try
    	{
    		//on test defois qu'on est fermé excel
    		vRange = vWorksheet.OlePropertyGet("UsedRange");
    	}
    	catch(Exception &exception)
    	{
    		//si excel a été fermé on le réouvre
    		ouvrirexcel() ;
    		vRange = vWorksheet.OlePropertyGet("UsedRange");
    	}
    	vCellnext = vRange.OleFunction("FindNext", vCell) ;
    	if(	vCellnext.VInteger != 0 )
    	{
    		//on recup son emplacement excel
    		range = vCellnext.OlePropertyGet("Address", false, false);
    	}
    	else
    	{
    		// on as pas trouver le serveur
    		range = "" ;
    	}
        vCell = vCellnext ;
    	return WideString(range) ;
     
    }
    //---------------------------------------------------------------------------
    unsigned int Inexcel::nbrlignes()
    {
    	//determine le nombre de lignes
    	//s'arrete a la premiére ligne vide de la collone A
     
    	unsigned int  nbrligne = 0 ;
    	while(readcell("A"+UIntToStr(nbrligne+1))!="N/A")
    	{
    		nbrligne ++ ;
    	}
    	return nbrligne ;
     
    }
    //---------------------------------------------------------------------------
    Donc si la gestion unicode est en cause, cela voudrais dire que XE réalise des conversion implicite avec mes chaines de caractère avant de les envoyer a la fonction OLE. Mais pourquoi certaine serait impacté et d'autre fonctionne parfaitement ...?

  8. #8
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    La je vois pas, outlook est bien installe et tu peux l'utiliser normalement
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  9. #9
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Points : 59
    Points
    59
    Par défaut
    Oui oui, c'est pas la dernière c'est une version 2007. Peut être que c'est trop récent. Je pense que certain poste de l'entreprise on encore une version Office 2003 je vais essayer dessus. Mais je ne pourrais pas le faire avant lundi.

    Merci beaucoup pour tes réponses claire est rapide Blondelle.

  10. #10
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    La version de teste etait la 2003 et BCB6, je ne pense pas qu'une version plus recente pose probleme.
    Tu a bien parametre tes numero de compte Pop3, Smtp, Mots de passe, tu peu envoyer et recevoir avec outlook en direct, si oui je seche.
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  11. #11
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Points : 59
    Points
    59
    Par défaut
    Ben je suis en exchange pas en pop3. Je vais créer un profil en pop3 pour verifier ....

  12. #12
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Points : 59
    Points
    59
    Par défaut
    Defois que d'autre personne ai le meme problème j'ai trouvé une autre manière d'attaquer outlook :

    TOutlookApplication

    J'arrive a trouver quelque exemple en delphi, mais il m'est assez compliqué de les traduire en C++. Alors je patauge légèrement.... Mais je persiste !

    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
    TFMain.BitBtnSendMailClick(Sender: TObject);
    Var
    oOutLook:TOutLookApplication;
    NSpace:NameSpace;
    MyMail:MailItem;
    begin
    oOutLook:=TOutLookApplication.Create(nil);
    NSpace:=oOutLook.GetNamespace('MAPI');
    NSpace.Logon('MyName','MyPwd',false,false);
    MYMail:=oOutlook.CreateItem(olMailItem) as MailItem;
    MYMail.Recipients.Add('boubou2024@scarlet.be');
    MYMail.Subject := 'Offfre de prix';
    MYMail.Body := 'Corps du message envoyé'+#13#10;
    MYMail.Display(False);
    end;
    Lorseque je déclare une variable de type MailItem j'obtiens le message suivant :

    E2352 Impossible de créer une instance de la classe abstraite '_MailItem'

    Je comprend pas vraiment ce que cela signifie.

  13. #13
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    Si je ne me trompe pas TOutlookApplication est un composant a placer sur la Form qui se trouve dans le repertoire Office2K pour BCB6
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  14. #14
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Points : 59
    Points
    59
    Par défaut
    Effectivement, il existe une compostant comme celui la. Hors sur ma version de XE2 elle ne sont pas d'origine, j'ai donc rajouter le composant, et meme la version Office XP. Mais n'ayant aucune doc intégré j'essaye de comprendre comment ca fonctionne. Je trouve certaine chose mais seulement sur des forum américain.

  15. #15
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    TOutlookApplication c'est juste la version Early Binding de "Excel.Application",
    tu n'auras pas différence pa rapport à l'utilisation en Late Binding via OLE Variant comme tu le faisais déjà !

    As-tu testé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vEspaceDeNom = vMSOutlook.OleFunction("GetNameSpace", L"MAPI");
    Le L devant "" indique des chaines wchar_t* et non char*

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


    Citation Envoyé par Traxsilver Voir le message
    Merci pour ton analyse. J'ai effectivement eu un certain nombre de souci avec la gestion unicode. Mais en general c'est seulement si je remplace une variable det ype WideString en paramètre d'une fonction OLE. Pour Excel tout fonctionne bien pourtant.

    Donc si la gestion unicode est en cause, cela voudrais dire que XE réalise des conversion implicite avec mes chaines de caractère avant de les envoyer a la fonction OLE. Mais pourquoi certaine serait impacté et d'autre fonctionne parfaitement ...?
    Il effectue des conversions implicite de char*\AnsiString vers WideString ou UnicodeString mais le paramètre étant un Variant, il reçoit un char* donc pas de conversion !

    Seul les paramètres sont concernés !
    name dans OleFunction est un String, cela appelle le constructeur UnicodeString(char*),
    les paramètres P1 à P32 sont des Variant, il n'y a pas de conversion !
    tu n'as pas remarqué mais dans ton code Excel, tu ne passe jamais directement une chaîne constante mais une variable WideString (celle en paramètre de fonction, je suppose qu'il en va de même pour les membres de la classe)

    Avant, tout était AnsiString, à l'époque de la Rédaction de la FAQ, il devait y avoir un mécanisme pour forcer le WideString, entre le TVariant, le VARIANT, le Variant et le OleVariant, les comportements d'affectation était différents, possible qu'entre les versions Ansi et Unicode, il y a eu des changement à ce sujet !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  16. #16
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Points : 59
    Points
    59
    Par défaut
    J'arrive en joie sur le forum me disant que je pourais répondre a mon probleme moi meme mais non ... Grand maitre ShaiLeTroll est deja passé par la.

    En analysant les code d'adaptation de TOutlookApplication j'en ai deduis l'histoire de conversion implicite et avec ce code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vEspaceDeNom = vMSOutlook.OleFunction("GetNameSpace", WideString("MAPI"));
    cela fonctionne !!! Merci !!!

    Et en plus tu m'explique comment la chaine "GetNameSpace" passe sans soucis et "MAPI" necessite une conversion explicite en WideString. Mais je ne suis pas arrivé a metre la main sur le prototypage des fonction pour comprendre quelle variable envoyer a cette fonction. Tu as vraiment fouillé le .h pour savoir ca ??

  17. #17
    Expert éminent sénior
    Avatar de ShaiLeTroll
    Homme Profil pro
    Développeur C++\Delphi
    Inscrit en
    Juillet 2006
    Messages
    13 459
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Développeur C++\Delphi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2006
    Messages : 13 459
    Points : 24 873
    Points
    24 873
    Par défaut
    Effectivement, j'ai lu autoargs.h et utilcls.h mais j'ai surtout juste fait un recherche sur OleFunction dans l'aide de C++Builder 6 qui m'a indiqué où chercher
    Pour GetNameSpace et toutes les fonctions de Outlook, il y a la MSDN, c'est vaste, tordu et pénible !
    Souvent expliqué via du VBA (déjà tout en wide) ou en C# (surement wide aussi par défaut)

    En Delphi, on a pas besoin d'appeler OleFunction ou SetProperty, c'est implicite (il doit analyser le code pour voir des appels de fonction ou des affectations), du coup le code Early et Late est quasiment identique, c'est vrai qu'en C++Builder, c'est nettement plus pénible (et pas très lisible)

    Je n'ai pas encore fait d'OLE en C++Builder, mes derniers essais remonte à Excel 2010 avec D7 (pour forcer le type XLS et non XLSX)
    Par contre, avant, on avait QUE des AnsiString dans le pilotage OLE, je ne sais pas trop comment il passait de AnsiString à WideString, surement une bidouille dans le Variant
    Là comme on mélange du Wide et Ansi, il doit s'y perdre !
    Aide via F1 - FAQ - Guide du développeur Delphi devant un problème - Pensez-y !
    Attention Troll Méchant !
    "Quand un homme a faim, mieux vaut lui apprendre à pêcher que de lui donner un poisson" Confucius
    Mieux vaut se taire et paraître idiot, Que l'ouvrir et de le confirmer !
    L'ignorance n'excuse pas la médiocrité !

    L'expérience, c'est le nom que chacun donne à ses erreurs. (Oscar Wilde)
    Il faut avoir le courage de se tromper et d'apprendre de ses erreurs

  18. #18
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    Pour la conversion Unicode il faut tester " StringToOleStr " " WideString " .......
    Pour convertir un variant il y a tout un lot de conversion possible par exemple tire de l'aide en ligne
    " VarToStr " Convertit un objet variant en objet AnsiString.
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

  19. #19
    Membre du Club
    Inscrit en
    Avril 2008
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Avril 2008
    Messages : 76
    Points : 59
    Points
    59
    Par défaut
    Merci a vous pour toutes ces réponses.

    J'avais deja eu des soucis avec les conversions des unicode, surtout qd je suis passé de BC5 ( version de mes etudes ) a celle de ma boite la XE2. Tout mes ancien code a base de "AnsiString" ne fonctionnais plus. Mais le plus grand souci est de connaitre le type de valeur que ce genre de fonction OLE attend. Et dans l'aide d'XE2 il n'y as plus rien sur les OLE. Ou sinon je ne suis pas arrivé a le trouver.


    Il me reste maintenant juste 3 souci a résoudre:
    1 trouver comment ajouter des gens en copie
    appartir de ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vobjNewMail.OlePropertySet("To", dest);
    2 ajouter plusieur ligne a Body
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vobjNewMail.OlePropertySet("Body",WideString(contenue->Lines[0][i])
    car cette ligne de code efface le corp de message a chaque appel.
    A la base j'utilise un TMemo pour stoker le corps de mon mail.
    Dans une boucle je voulais ajouter ligne par ligne le contenue du TMemo dans le body du mail.
    3 et envoyé.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    vobjNewMail.OleFunction("Send");
    Ca me renvoie que la fonction n'existe pas.

  20. #20
    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
    Points : 3 766
    Points
    3 766
    Par défaut
    Pour ajouter le contenu du TMemo peut etre comme ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    vobjNewMail.OlePropertySet("Body",WideString(Memo1->Lines->Text);
    Pour plusieurs destinataires en plus de " To " il y a " Cc " ou " BCc ", je n'ai pas trouve le separateur entre les diverses adresses
    Pour " Send " je cherche aussi pourquoi cela ne marche pas
    Pense aussi a la conversion pour l'unicode
    --
    Plutot que d'essayer de réinventer la roue, apprenons à nous en servir

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

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