Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Outlook
Outlook Forum d'entraide sur Microsoft Office Outlook
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 07/06/2007, 17h08   #1
Invité de passage
 
Inscription : mars 2007
Messages : 15
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 15
Points : 4
Points : 4
Par défaut Outlook COM Addin VC++ avec Redemption

Bonjour

Je suis en train d'essayer d'accéder aux destinataires d'un Mail dans un Addin COM Outlook en MSVC++ avec Redemption.

J'ai rencontré pas mal de problèmes, résolus au fur et à mesure, mais il en reste un.

Compte-rendu succint de mes épreuves :

Pour brancher Redemption sur Outlook il suffit en théorie de faire Redemption.RDOSession.MAPIOBJECT=Outlook.Application.GetNamespace("MAPI").MAPIOBJECT

- sauf que ceci n'est supporté qu'à partir de Outlook 2002
pour 2000, il faut utiliser RDOSession.Logon()

- sauf qu'en C++, les paramètres de Logon ne sont pas optionnels, il faut les passer, et "" ou 0 (zéro) ne sont pas des valeurs correctes pour des paramètres optionnels, il faut utiliser vtMissing !

- penser à faire un RDOSession.Logoff() à un moment (est-ce nécessaire?)

tout ceci fut acquis après pas mal de recherches pas simples sur internet où on ne trouve quasiment que des exemples en VB ou en C#

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
STDMETHODIMP CMyAddin::raw_OnStartupComplete(LPSAFEARRAY *custom)
{
	.../...
	m_pNameSpace = m_pApplication->GetNamespace(L"MAPI");
	hr = MAPILogonEx( 0, "", "", 0, &m_pMAPISession );
 
	m_pRDOSession.CreateInstance(__uuidof(Redemption::RDOSession));
	if (IsOutlook2000())
		m_pRDOSession->Logon(vtMissing,vtMissing,vtMissing,
			vtMissing,vtMissing,vtMissing);
	else
		m_pRDOSession->MAPIOBJECT=m_pNameSpace->MAPIOBJECT;
}
Ensuite, il suffit, toujours en théorie, de faire
Redemption::IRDOMailItemPtr = m_pRDOSession->GetMessageFromID(Outlook::_MailItem.EntryID)
et à partir de là, on a accès aux destinataires sans provoquer l'affichage de la fenêtre de sécurité.

C'est là que j'ai un problème :
GetMessageFromID me sort en erreur avec le code 0x80040201 et le texte donné par VCExpress en débug : "An event was unable to invoke any of the subscribers"...
Incompréhension totale jusqu'à ce que j'apprenne que 0x80040201 est AUSSI le code de MAPI_E_UNKNOWN_ENTRYID ! Merci Visual C++ pfff...

Donc mon problème est relativement simple : GetMessageFromID ne trouve pas l'item avec l'EntryID donné, sauf que bien sûr, cet EntryID est correct.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
CMailItem::CMailItem(Outlook::_MailItem *pParent)
{
	m_pParent = pParent;
	m_pParent->AddRef();
	m_Type = MAILITEM;
 
	try
	{
		m_pRedemptionParent =
			g_pAddIn->getRDOSession()->GetMessageFromID(
				pParent->EntryID, vtMissing, vtMissing);
	} catch(...)
	{
		m_pRedemptionParent = NULL; // erreur 0x80040201 systématique 
	}
}
Et là je suis bloqué.

J'ai pas mal embêté Dmitry (l'auteur de Redemption) avec mes questions, parce que je ne trouvais rien de tout çà sur le Net...

- donc j'appelle à l'aide ici (pourquoi GetMessageFromID ne marche-t-il pas ?)

- mais aussi je publie mon avancement afin que d'autres éventuellement puissent en profiter et passent moins d'heures à chercher en vain.

Merci de votre aide.
Sxilderik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2007, 12h11   #2
Invité de passage
 
Inscription : mars 2007
Messages : 15
Détails du profil
Informations forums :
Inscription : mars 2007
Messages : 15
Points : 4
Points : 4
Solutions :

Dans mon cas, le status MAPI_E_UNKNOWN_ENTRYID était correct car Redemption ne connaissait rien des Stores

Citation:
Envoyé par Dmitry Streblechenko
The error is MAPI_E_UNKNOWN_ENTRYID. Since you are creating a new session, the stores were never loaded and hence did not get a chance to register themselves with the MAPI session.
Try to pass both entry id and store id when calling GetMessageFromID or open the stores first (e.g. you can loop through the RDOSession.Stores collection and read each store’s Name property).
J'ai donc écrit

Code :
1
2
3
4
5
6
7
	try {
		m_pRedemptionParent = g_pRDOSession->GetMessageFromID(
			pParent->EntryID,
			((Outlook::MAPIFolder)pParent->Parent)->StoreID,
			vtMissing);
	}
	catch(...) {}
et ça a marché.

Par contre, quand j'ai essayé la seconde méthode indiquée, j'ai eu des problèmes :

Code :
1
2
3
4
5
6
7
	Redemption::iRDOStoresPtr stores=g_pRDOSession->Stores;
	for (long i=1;i<=stores->Count;i++)
	{	
		Redemption::IRDOStore *store=stores->Item(i, vtMissing);
		// exception ici, sur le store->Name : (E_UNEXPECTED)
		Trace("Store #%ld : %s\n",i,ConvertBSTR(store->Name).c_str());
	}
Je ne comprenais pas, j'ai commenté et passé outre.

Mais j'avais ce même genre de comportement sur d'autres choses d'apparence anodine, quand la lumière s'est faite :
J'utilisais indifféremment des "pointeurs normaux" et des "smart pointers" ; le compilateur ne disait rien, les surcharges C++ masquant toute cette cuisine trop efficacement (au passage, je hais un petit peu le C++, enfin, ses dérives et abus trop faciles, je suis vieille école, le C pur et dur).
Donc, en remplaçant dans tous les endroits du code au comportement étrange xxx *truc par xxxPtr truc, tout s'est mis à marcher !

(par exemple, dans le code cité, avec store déclaré en Redemption::IRDOStore *, ça plante, alors que s'il est déclaré en Redemption::IRDOStorePtr, ça marche)

Voilà, j'espère que ces témoignages de galère aideront d'autres explorateurs du monde brumeux du C++.

Amike !
Sxilderik est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/06/2007, 13h20   #3
Responsable Word

 
Avatar de Heureux-oli
 
Homme Olivier Lebeau
Contrôleur d'industrie
Inscription : février 2006
Messages : 17 351
Détails du profil
Informations personnelles :
Nom : Homme Olivier Lebeau
Âge : 47
Localisation : Belgique

Informations professionnelles :
Activité : Contrôleur d'industrie
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : février 2006
Messages : 17 351
Points : 29 264
Points : 29 264
Merci pour ta réponse !
__________________
J'ai pas encore de décodeur, alors, postez en clair ! Comment mettre une balise de code ?
Débutez en VBA

Mes articles


Dans un MP, vous pouvez me dire que je suis beau, ... mais si c'est une question technique je ne la lis pas ! Vous êtes prévenus !
Heureux-oli est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 11h26.


 
 
 
 
Partenaires

Hébergement Web