2010-12-14 2 views
1

Ich habe eine VBit-Anwendung mit 32 Bit, die eine COM-Komponente verwendet, um Outlook zu automatisieren, um eine E-Mail zu senden. Voraussetzung ist, dass die E-Mail im Ordner "Gesendete Objekte" in Outlook angezeigt werden muss. Zu allem Überfluss darf die Anwendung nicht die üblichen Sicherheits-, Warn- oder Bestätigungsmeldungen anzeigen.32bit VB6-Anwendung muss 64bit Outlook automatisieren, um eine E-Mail zu senden, ohne den Benutzer zu fragen

Diese Anwendung funktionierte ohne Probleme, bis 64-Bit-Office kam. Es gibt keine Möglichkeit für einen 32-Bit-Prozess, ein 64-Bit-Outlook zu automatisieren.

Die Idee kam ich mit war die folgende:

  1. Swap aus der COM-Komponente mit einem .NET WCF-Client, der in der CCW läuft (.NET vorgibt COM zu sein)

  2. Diese COM-Komponente ruft einen WCF-Dienst auf, der unter Verwendung von netTcpBinding als 64-Bit-Prozess ausgeführt wird.

  3. Der WCF-Dienst (als lokales System ausgeführt wird) startet dann eine 64-Bit- Konsolenanwendung als Anwender und nutzt die Extended MAPI Bibliothek die E-Mail zu senden.

Der Grund für den dritten Schritt ist zweifach:

  1. MAPI zur Bestätigung bitten, wenn Sie es sagen, eine E-Mail zu senden. Erweiterte MAPI nicht. Das bedeutete wir mussten eine C++ Extended MAPI-Bibliothek mit den richtigen 64bit Header-Dateien von Microsoft kompilieren, und " das aus unserem .NET-Code aufrufen".

  2. Imitieren (Begriff lose verwendet) der Benutzer in WCF führt zu der falschen Registrierung Bienenstock laden. Mit anderen Worten, wenn Extended MAPI versucht, das -Profil von HKCU zu laden, schlägt es fehl. Diese bedeutete, dass wir einen neuen Prozess starten mussten, um im Wesentlichen den richtigen Benutzer "RunAs" zu geben.

Das alles tatsächlich in der Praxis funktioniert, aber ich brauche einige Erklärungen für die folgenden:

Wenn ich die Konsole-Anwendung mit allen benötigten Informationen in Befehlszeilenparameter ausführen, schlägt MAPI einzuloggen. Wenn ich jedoch denselben Code wie eine Windows-Anwendung mit 1 Formular mit genau demselben Code in der OnLoad() - Methode des Formulars kompiliere, ist es erfolgreich. Kann mir jemand erklären warum?

Um die „WinForms“ Anwendung von dem WCF-Dienst ausgeführt, wenn der Benutzer angemeldet aktuell (nicht LOCAL SYSTEM) Ich habe folgende, um die richtigen Token zu erhalten:

sessionID = (int)WTSGetActiveConsoleSessionId(); 
ret = WTSQueryUserToken(sessionID, out currentToken); 

Gibt es eine Möglichkeit, um dies? Sicher wäre es besser, WCFs eingebauten Identitätswechsel zu verwenden.

+1

Bei der 64-Bit-Version von Office wird nach Problemen gefragt. Wenn Kompatibilität ein Problem ist, gehen Sie mit der 32-Bit-Version. 64-Bit-Versionen bieten nur einen Vorteil im Umgang mit extrem großen Dokumenten (insbesondere Tabellen). 64 ist nicht immer besser als 32. Siehe auch http://blogs.technet.com/b/office2010/archive/2010/02/23/understanding-64-bit-office.aspx: "Aus diesen Gründen empfehlen wir zu laufen 32-Bit-Office 2010 sogar auf 64-Bit-Windows-Betriebssystemen für bessere Kompatibilität ". Weitere Informationen finden Sie hier: http://msdn.microsoft.com/en-us/library/ee691831%28office.14%29.aspx –

+0

Sie können nicht immer wählen, was ein Benutzer ausführt. – Joe

+0

Joe hat Recht. Unsere Benutzer erhalten ihre Computer von den Händlern mit jedem Betriebssystem und jeder Version von Office, die sie gerne pushen möchten, vorkonfiguriert. Wir haben keine Kontrolle darüber. – CSharpDevCT

Antwort

1

Es gibt keine Möglichkeit für einen 32-Bit-Prozess ein 64-Bit-Outlook

nicht ganz richtig zu automatisieren, wenn Sie das COM-Objekt außerhalb des Prozesses zu schaffen, es wird funktionieren. Zu den Optionen gehört das Erstellen einer kleinen .exe, die als Factory für Ihre COM-Objekte dient.

Siehe this SO post

Verwandte Themen