Outlook über OLE steuern?
-
Hallo,
ich möchte Outlook 2007 gern über OLE steuern, da ich keine Komponenten verwenden möchte. Ich habe über die SuFu folgenden Code gefunden://Outlook soll geöffnet werden Variant vOutlook,vRootFolder,vKalenderFolder,vKalenders,vKalender,vKalenderName,vTermin; double dStartDatum = StrToDateTime("11.12.2012 07:30:00"); double dEndDatum = StrToDateTime("11.12.2012 08:00:00"); int iKalenders,iAntw,iFolders; int olFolderCalendar = 0x09; int olAppointmentItem = 0x1A; //ShowMessage("Achtung, Outlook muss geöffnet sein!"); try { vOutlook = CreateOleObject("Outlook.Application"); vRootFolder = vOutlook.OleFunction("GetNameSpace", "MAPI"); vKalenderFolder = vRootFolder.OleFunction ("GetDefaultFolder", olFolderCalendar); vKalenders = vKalenderFolder.OlePropertyGet ("Folders"); iKalenders = vKalenders.OlePropertyGet ("Count"); vKalender = vKalenderFolder.OlePropertyGet("Folders"); vKalenderName = vKalender.OlePropertyGet("Name"); vTermin=vOutlook.OleFunction("CreateItem", olAppointmentItem); //Betreff vTermin.OlePropertySet("Subject", "Mein Termin"); //Ort vTermin.OlePropertySet("Location","Großer Beratungsraum"); //Startdatum vTermin.OlePropertySet("Start",dStartDatum); //Endedatum vTermin.OlePropertySet("end",dStartDatum); //Text vTermin.OlePropertySet("Body","Das ist der Text!"); //Anzeige als (Kategorie) vTermin.OlePropertySet("Categories","Frei"); //speichern vTermin.OleFunction("Save"); } catch(...){} ShowMessage("Termin wurde nicht eingetragen!"); //vOutlook.OleFunction("Quit"); vOutlook = Unassigned;
Beim Ausführen bekomme ich in folgender Zeile
vKalenderName = vKalender.OlePropertyGet("Name");
den Fehler
Erste Gelegenheit für Exception bei $7C812AFB. Exception-Klasse EOleSysError mit Meldung 'Unbekannter Name'. Prozess Outlook.exe (6024)
Gibt es ggf. eine kompakte Zusammenfassung der OLE-Funktionen von Outlook?
Denn ich kann mit dem Fehler leider nichts anfangenDanke und Gruß
Torsten
-
Ob das jetzt für Outlook geht, kann ich nicht sagen, aber in Word und Excel kannst du einfach den VBA-Editor öffnen und dann dort die Hilfe anzeigen. Die Office-Schnittstelle, die VBA benutzt, ist exakt dieselbe, die du über OLE ansteuerst.
-
Ok, in der (Excel & Word)-Hilfe unter VBA wird für "OlePropertyGet" nichts gefunden! Im www habe ich auch noch nix passendes gefunden...
-
Bei der allgemeinen Frage kann ich momentan auch nicht helfen, aber der Code scheint doch einen konkreten Fehler zu haben. Du willst sowohl die Kalenderliste als auch einen einzelnen Kalender über den identischen Funktionsaufruf vKalenderFolder.OlePropertyGet ("Folders") ermitteln, das kann ja nicht funktionieren. Für das Selektieren des einzelnen Kalenders würde man doch etwas in der Art erwarten, dass der Index der Kalenderliste verwendet wird.
-
Ich verstehe den Code so, dass in Zeile 16 die Anzahl der verfügbaren Kalender gelesen wird. Dieser Wert gibt mir immer 0 zurück, wobei ich zwei Kalender zur Verfügung habe.
Also ist doch an dieser Stelle (vermutlich schon weiter oben) etwas nicht korrekt???
-
Ja, es wäre zu kontrollieren, ob die Funktionsaufrufe in Zeile 12 bis 15 überhaupt korrekte Ergebnisse liefern.
Das ändert nichts daran, dass Zeile 17 so eigentlich nicht funktionieren kann.Hast du mal den Link zu Hand, aus dem dein Beispielcode stammt?
-
Den Code habe ich hier gefunden: http://www.c-plusplus.net/forum/265420
Aus Zeile 17 habe ich das "...,1 )" entfernt, da die 1 leider "außerhalb des Array-Index" ist. Ist ja auch klar, da mir "..."Count"" 0 ausgiebt. Also findet er doch gar keinen Kalender?
-
Wie gesagt, man müsste erstmal prüfen, ob die vorhergehenden Aufrufe erfolgreich waren. Hier wird so eine Auswertung diskutiert: http://borland.public.cppbuilder.activex.narkive.com/ioMlTzuP/outlook-automation-and-return-values
Ich benutze selbst kein MS Office und kann deshalb nicht testen, was der Debugger für die Variants ausspucken sollte.
-
torsten_156 schrieb:
Ok, in der (Excel & Word)-Hilfe unter VBA wird für "OlePropertyGet" nichts gefunden!
Das ist ja auch eine C++Builder-Funktion. Die Dinge, deren Namen du an CreateOleObject(), OleFunction(), OlePropertySet/Get() übergibst, die stehen womöglich in der Outlook-VBA-Hilfe, aber sicher nicht in der Word- oder Excel-VBA-Hilfe.
-
Selbst in der Outlook-VBA-Hilfe habe ich dazu nichts gefunden
Gruß
Torsten
-
Hallo,
ich habe es nun fast geschafft. Der Termin wird wie gewünscht in meinem Outlook-Kalender eingetragen, Teilnehmer zugefügt
Die Teilnehmer stehen auch in meinem Kalender, nur leider werden diese nicht darüber benachrichtigtDa fehlt wohl noch so etwas wie "sende den Termin"
Hier mein jetziger Code:
//Outlook soll geöffnet werden Variant vOutlook,vTermin; double dStartDatum = StrToDateTime("29.12.2012 10:30:00"); double dEndDatum = StrToDateTime("29.12.2012 11:00:00"); //ShowMessage("Achtung, Outlook muss geöffnet sein!"); try { vOutlook = CreateOleObject("Outlook.Application"); vTermin=vOutlook.OleFunction("CreateItem", 1); //olAppointmentItem //Betreff vTermin.OlePropertySet("Subject", "Ein Testtermin via OLE-Automation"); //Ort vTermin.OlePropertySet("Location","Großer Beratungsraum"); //Startdatum vTermin.OlePropertySet("Start",dStartDatum); //Endedatum vTermin.OlePropertySet("End",dEndDatum); //Text vTermin.OlePropertySet("Body","Das ist der Text!"); //Anzeige als (Kategorie) vTermin.OlePropertySet("Categories","Frei"); //Erinnerung vTermin.OlePropertySet("ReminderSet",true); //Erinnerungszeit vTermin.OlePropertySet("ReminderMinutesBeforeStart", 30); //Teilnehmer einladen... vTermin.OlePropertyGet("Recipients").OleProcedure("Add","testuser@test.com"); //speichern vTermin.OleFunction("Save"); } catch(...) { ShowMessage("Termin wurde nicht eingetragen!"); } //vOutlook.OleFunction("Quit"); vOutlook = Unassigned;
Wie gesagt, soweit klappt alles. Bis auf das Senden...
Gruß
Torsten
-
Ich habe da im www noch etwas Code gefunden, der womöglich das Problem mit dem Senden des Termins löst. Leider komme ich nicht ganz dahinter, wie ich das nach C++ portieren kann. Vieleicht kann mir ja jemand dabei helfen...
Variant Outlook; Outlook = CreateOleObject("Outlook.Application"); AppointmentItem newAppointment = ("Outlook.AppointmentItem"); this.CreateItem(Outlook.OlItemType.olAppointmentItem); newAppointment.Start = DateTime.Now.AddHours(2); newAppointment.End = DateTime.Now.AddHours(3); newAppointment.Location = "ConferenceRoom #2345"; newAppointment.Body = "We will discuss progress on the group project."; newAppointment.AllDayEvent = false; newAppointment.Subject = "Group Project"; newAppointment.Recipients.Add("Roger Harui"); Outlook.Recipients sentTo = newAppointment.Recipients; Outlook.Recipient sentInvite = null; sentInvite = sentTo.Add("Holly Holt"); sentInvite.Type = (int)Outlook.OlMeetingRecipientType.olRequired; sentInvite = sentTo.Add("David Junca "); sentInvite.Type = (int)Outlook.OlMeetingRecipientType.olOptional; sentTo.ResolveAll(); newAppointment.Save(); newAppointment.Display(true);
Was ich meine, fängt ab Zeile 12 an.
Gruß Torsten
-
Ich benötige da mal eure Hilfe. Wie ich lesen konnte, sollte man mal im Outlook den Macro-Recorder mitlaufen lassen. Nur leider gibt es den in der Office-Version 2007 nicht mehr. Aber in Office97 soll es den noch geben. Hat jemand diese Version noch auf dem Rechner? Wenn ja, kann mir dann jemand den Code aufzeichnen???
Vielen Dank