2010-06-26 3 views
2

Je crée une application qui ouvre les messages existants dans Outlook. L'utilisateur peut déjà exécuter Outlook ou non. Tout fonctionne bien si Outlook n'est pas en cours d'exécution, mais s'il est déjà en cours d'exécution, j'obtiens une erreur COM (80080005). L'Internet semble indiquer que cela peut se produire si le processus Outlook existant est exécuté avec un niveau d'autorisation supérieur à celui de l'application qui essaie de s'y lier.Connexion à un processus Outlook existant

Existe-t-il un autre moyen pour moi de demander à Outlook d'ouvrir un message, ou dois-je simplement m'assurer de faire correspondre les niveaux d'autorisation?

Merci,

-Patrick

EDIT Ajout de code à la question d'origine, comme le débordement de pile ne permet pas la mise en forme de sens dans les commentaires.

que je faisais à l'origine de ce qui suit:

var outlook = new Outlook.Application(); 

Cette ligne fonctionne dans tous les cas, sauf le cas où je l'ai lancé d'Outlook avant de lancer mon application. Dans ce cas, je reçois le code d'erreur 80080005 mentionné ci-dessus.

J'ai changé que ce soit un peu plus COM explicite:

Application outlook; 
try 
{ 
    outlook = (Application)Marshal.GetActiveObject("Outlook.Application"); 
} 
catch (COMException ex) 
{ 
    if (ex.ErrorCode == -2147221021) 
     outlook = new ApplicationClass(); 
    else 
     throw; 
} 

Cependant, ce code ne fonctionne toujours pas tout à fait - si Outlook est en cours d'exécution, je piège une exception dont ErrorCode est 0x800401E3 (MK_E_UNAVAILABLE). Mais quand je tente de créer le nouvel objet ApplicationClass, je reçois toujours le même code d'erreur 80080005.

J'ai aussi essayé de mettre ce qui suit dans le bloc catch au lieu de la ligne new ApplicationClass(), mais il n'y a aucune différence de comportement:

outlook = (Application) Activator.CreateInstance(
    Type.GetTypeFromProgID("Outlook.Application")); 

Répondre

2

Il s'avère que la cause du problème était le débogueur - je lançais Word à partir du débogueur de Visual Studio. Lors du lancement de Word via des chemins normaux, le code 80080005 disparaît.

-Patrick

0

Sans voir votre code, je devine, mais il semble que vous appelez CreateObject(). Vous devez appeler GetObject() si Outlook est déjà en cours d'exécution.

D'abord, utilisez GetObject pour voir si Outlook est déjà en cours d'exécution (vous devez saisir l'erreur).

+0

J'utilise C# Interop appels lib: nouvelle application(), etc. Merci pour le pointeur GetObject(). –

+1

Outlook est quelque peu étrange en ce que GetObject ("", "Outlook.Application") va démarrer une session si elle n'est pas déjà en cours d'exécution et * ne * pas retourner une erreur. – Fionnuala

+0

@Remou: Je ne le savais pas. Bonne info, merci. –

Questions connexes