Bonjour,
J'ai un problème assez étrange que je n'arrive pas à comprendre. On a une vieille application écrite en Pascal qui a besoin de faire des opérations sur Outlook mais la librairie utilisée pose des problèmes avec les versions 64 bits. La direction a prit la décision d'utiliser une autre application écrite en C# qu'on a sous la main qui utilise Microsoft.Office.Interop.Outlook qui sera alors appelée par l'application en Pascal en ligne de commande. Maintenant le problème c'est que cette application C# ne réagit pas pareil si on la lance depuis cette application Pascal ou depuis n'importe quoi d'autre...
Exemple, l'application C# ne fait qu'une seule chose, elle ouvre Outlook et prépare un mail. J'ai désactivé les arguments dans cette application pour être certain donc il suffit de lancer l'application et le mail est près à partir avec un mail, un objet et un message. Si outlook est ouvert, ça marche. Si outlook est fermé, ça marche. Maintenant je lance l'application à partir de l'application Delphi en utilisant ShellExecuteEx. Si outlook est fermé, ça marche. Si outlook est ouvert, Exception que voici :
Cette application C# marche très bien quand elle est lancée à la main, très bien quand elle est lancée depuis CMD, powershell, une autre application C#... Que ce soit avec outlook 32 ou 64bits, ouvert ou fermé, 100% de réussite à chaque fois.
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 Exception : { "ClassName": "System.Runtime.InteropServices.COMException", "Message": "Opération non disponible (Exception de HRESULT : 0x800401E3 (MK_E_UNAVAILABLE))", "Data": null, "InnerException": null, "HelpURL": null, "StackTraceString": " à System.Runtime.InteropServices.Marshal.GetActiveObject(Guid& rclsid, IntPtr reserved, Object& ppunk)\r\n à System.Runtime.InteropServices.Marshal.GetActiveObject(String progID)\r\n à MgMail.Program.GetOutlookInstance()\r\n à MgMail.Program.Main(String[] args)", "RemoteStackTraceString": null, "RemoteStackIndex": 0, "ExceptionMethod": "8\nGetActiveObject\nmscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089\nSystem.Runtime.InteropServices.Marshal\nVoid GetActiveObject(System.Guid ByRef, IntPtr, System.Object ByRef)", "HResult": -2147221021, "Source": "mscorlib", "WatsonBuckets": null }
Lancée depuis Pascal avec ce code, ça ne marche que si outlook est fermé. Dès que l'application doit négocier avec Outlook, ça plante.
L'application Pascal elle ne me lève aucune erreur...
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 Function RunAsAdmin(hWnd : HWND; aFile : String; aParameters : String) : Boolean; Var Sei : TShellExecuteInfoA; begin Fillchar(sei,SizeOf(sei),0); sei.cbSize := SizeOf(sei); sei.Wnd := hWnd; sei.fMask := SEE_MASK_FLAG_DDEWAIT or SEE_MASK_FLAG_NO_UI; sei.lpfile := PChar(aFile); sei.lpVerb := 'runas'; sei.lpParameters := PChar(aParameters); sei.nShow := SW_HIDE; RunAsAdmin:=ShellExecuteEx(@sei); end;
J'espère que quelqu'un pourra m'aider car là je suis bloqué bloqué avec cette histoire...
Edit: je pensais que ça pouvais venir des droits alors j'ai ajouté un fichier manifest à l'application Pascal mais même lancée en mode administrateur ça ne marche que si outlook est fermé.
Cordialement,
Merci
Partager