Win32 Aufgaben Outlook
-
Hallo,
ich suche nach einer Möglichkeit Aufgaben aus Outlook auslesen zu können. Man möge mich korrigieren, wenn ich da irre. So wie ich mir das vorstellen, müsste ich da mapi aufrufe nutzen, die wiederum ihrerseits aus der pst Datei auslesen.
Problem ist, dass es sehr wenig Informationen zu dieser Problematik gibt. Oder stelle ich die falschen Fragen? ... Mag sein. Vielleicht weiß jemand eine gute Quelle, und mag mir diese mitteilen.
Ist es überhaupt sinnvoll Extended MAPI, oder MAPI nutzen zu wollen? Oder wäre CDO im Hinblick auf Versionsunabhängigkeit besser? Wobei für die Nutzung von CDO der IIS installiert sein muss oder?
Gruß, IceRage
-
Eigentlich sollte das über COM kein Problem sein.
Das gilt auch für ein pures Outlook, das an keinem Exchange hängt.
CDO hat IMHO nichts mit IIS zu tun.Aufgrund der Sicherheitsbarieren in Outlook und weil man über das COM Objekt nicht an alles heran kommt, verwenden wir die Redemption DLL.
Siehe Outlook Redemption
http://www.dimastr.com/redemption/
Ist allerdings kommerziel.Wie man es macht steht in der Outllok Doku. Den VB Code soltest Du ohne Probleme auf COM mit C++ übertragen können.
http://msdn.microsoft.com/en-us/library/bb623455.aspx
-
Ich habe jetzt noch mal komplett umgeschrieben, nachdem ich gesehen habe, dass es eine kostenlose Entwickler Version von Redpemtion gibt
Ich werde das mal testen, und ggf. hier noch mal anfragen, falls ich damit nicht klarkommen sollte.
Vielen Dank erstmal für die Hilfe
EDIT: Wie lautet der Namespace für Redemption?
also ... using namespace <???> EDIT: Da scheint "Redemption" zu funktionieren.
-
Ich habe jetzt mal ein Testcodeschnipsel erstellt. Bin mir leider nicht sicher, ob das so richtig ist. Außerdem kann ich mit CLSCTX_INPROC_SERVER, und mit IID_IUnknown und deren Bedeutung nichts anfangen.
Was ich benötige ist ein COM-RDOSession-Objekt. Darüber läßt sich dann lt. API auf die Funktionalität in Redemption zugreifen. Leider bin ich nicht so wirklich mit dem COM-Konzept und deren Umsetzung in C++ vertraut.
Könnte mich da jemand noch etwas aufklären bitte?
#include "stdafx.h" #import "C:\Programme\Redemption\Redemption.dll" using namespace Redemption; int _tmain(int argc, _TCHAR* argv[]) { HRESULT hr = CoInitialize(NULL); CLSID clsid; struct RDOSession *session; hr = CLSIDFromProgID(OLESTR("Redemption.RDOSession"), &clsid); hr = CoCreateInstance(clsid, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (LPVOID*)&session); return 0; }
Bis jetzt produziere ich immerhin schon folgenden Fehlercode ;):
will now load TModifiedClassesenter TModifiedClasses.LoadModifiedEntriesDer Thread 'Win32-Thread' (0xdf0) hat mit Code 0 (0x0) geendet. Der Thread 'Win32-Thread' (0x97c) hat mit Code 0 (0x0) geendet.
Ach ja, und Redemption wird wohl auch schon geladen, und lädt seiner Seits wohl auch schon die MAPI dll.
"OutlookRedemption.exe": "C:\Programme\Redemption\Redemption.dll" geladen, Die Binärdaten wurden nicht mit Debuginformationen erstellt. "OutlookRedemption.exe": "C:\WINDOWS\system32\msimg32.dll" geladen, Cannot find or open the PDB file "OutlookRedemption.exe": "C:\WINDOWS\system32\winhttp.dll" geladen, Cannot find or open the PDB file "OutlookRedemption.exe": "C:\WINDOWS\system32\shfolder.dll" geladen, Cannot find or open the PDB file "OutlookRedemption.exe": "C:\WINDOWS\system32\cryptui.dll" geladen, Cannot find or open the PDB file "OutlookRedemption.exe": "C:\WINDOWS\system32\crypt32.dll" geladen, Cannot find or open the PDB file "OutlookRedemption.exe": "C:\WINDOWS\system32\msasn1.dll" geladen, Cannot find or open the PDB file "OutlookRedemption.exe": "C:\WINDOWS\system32\netapi32.dll" geladen, Cannot find or open the PDB file "OutlookRedemption.exe": "C:\WINDOWS\system32\wininet.dll" geladen, Cannot find or open the PDB file "OutlookRedemption.exe": "C:\WINDOWS\system32\normaliz.dll" geladen, Cannot find or open the PDB file "OutlookRedemption.exe": "C:\WINDOWS\system32\urlmon.dll" geladen, Cannot find or open the PDB file "OutlookRedemption.exe": "C:\WINDOWS\system32\iertutil.dll" geladen, Cannot find or open the PDB file "OutlookRedemption.exe": "C:\WINDOWS\system32\wintrust.dll" geladen, Cannot find or open the PDB file "OutlookRedemption.exe": "C:\WINDOWS\system32\imagehlp.dll" geladen, Cannot find or open the PDB file "OutlookRedemption.exe": "C:\WINDOWS\system32\riched20.dll" geladen, Cannot find or open the PDB file "OutlookRedemption.exe": "C:\WINDOWS\system32\riched20.dll" entladen. "OutlookRedemption.exe": "C:\WINDOWS\system32\mapistub.dll" geladen, Cannot find or open the PDB file "OutlookRedemption.exe": "C:\WINDOWS\system32\msi.dll" geladen, Cannot find or open the PDB file "OutlookRedemption.exe": "C:\WINDOWS\system32\msi.dll" entladen. "OutlookRedemption.exe": "C:\WINDOWS\system32\mapistub.dll" entladen. "OutlookRedemption.exe": "C:\Programme\Gemeinsame Dateien\System\Mapi\1031\MSMAPI32.DLL" geladen, Cannot find or open the PDB file
-
WO siehst Du hier ein Fehlercode?
Das sieht doch wunderbar aus...
-
LOL! Du hast Recht!
Ich las:
... will not load TModifiedClassesenter TModifiedClasses.LoadModifiedEntriesDer ...
Und nicht:
... will now load TModifiedClassesenter TModifiedClasses.LoadModifiedEntriesDer ...
Also alles richtig bis jetzt? Kann ich jetzt einfach über session-><...> auf die Objekte zugreifen?
-
So würde ich es mal sagen...
-
Aber woher weiß ich jetzt, wie ich die einzelnen Elemente benutzen muss? In VB, C# oder so gibts ja keine Pointer, Referenzen usw ... Außerdem sind die Übergabeparameter bestimmt auch ganz andere. Gibts denn keine C++ Referenz für Redemption?
-
Was willst Du mit einer C++ Referenz. Das ist alles COM.
Die Doku steht Online:
http://www.dimastr.com/redemption/
-
Dann funktionierts nicht.
Wenn ich im obigen Code session->Logon() versuche, dann steht da was von "Der Klassentyp pointer-to-incomplete Code ist nicht zulässig".
Kannst du mir nicht einfach ein minimales Codebeispiel posten? Wäre doch am einfachsten oder?
-
Also im Ernst jetzt. Für die Umsetzung in C++ ist die von dir genannten Doku fast gänzlich unbrauchbar. Es ist schon klar, dass aus der Doku die Verwendung der Redemption-Objekte hervorgeht, und dafür ist die Doku auch nutzbar. Für die konkrete Umsetzung in C++ (was ja auch der Name dieses Forums ist C-PLUSPLUS), gibt es aber noch einiges mehr zu wissen, als nur das, was aus der Redemption Doku hervorgeht.
Das beginnt schon ganz zu Anfang, mit der Ersten Zeile in VB mit: set Session = CreateObject("Redemption.RDOSession") ... Es gibt keine Funktion unter C++, die man wie CreateObject benutzen kann! Wie das in C++ geht, und das es dort wesentlich komplizierter ist, zeigen schon die wenigen Codezeilen, die ich bereits gepostet habe.
Ich frage also noch einmal nach einem Beispiel der Verwendung von Redemption in C++, oder wenigstens einer verständlichen Erklärung. Schließlich ist das hier ja ein C-PLUSPLUS Forum, und kein VB Forum. Da wird man wohl den Inhalt einer Problemstellung unter C-PLUSPLUS aspekten etwas genauer erläutern können, ohne gleich OffTopic zu geraten oder?
Gruß, IceRage
EDIT: Vielleicht noch mal konkret: Wie instanziire ich ein RDOSession-Objekt in C++, und, sollte die von mir gezeigte Weise schon richtig sein: Wie benutze ich dieses RDOSession-Objekt in C++? Einfach session-> ... funktioniert nicht!
Zur Erklärung wären vielleicht einige rudimentäre Code-Beispiele hilfreich (Allerdings ausschließlich in C++!).
Vielen Dank.
-
Martin Richter schrieb:
Wie man es macht steht in der Outllok Doku. Den VB Code soltest Du ohne Probleme auf COM mit C++ übertragen können.
http://msdn.microsoft.com/en-us/library/bb623455.aspxEenn du einfach keine Lust hast hier hilfreich zu sein, dann ist das ja soweit ok, da hier ja kein Zwang besteht. Wenn du aber damit sagen willst, dass sich auf Grund dieser Online Doku jede weitere Antwort in Bezug auf die Verwendung in C++ erübrigen würde, dann finde ich das den übrigen Lesern ebenfalls nicht ganz fair gegenüber, da man eben definitiv die Verwendung der Redemption API ausschließlich konzeptionell konzeptionell der Online Doku entnehmen kann.
Da sind null Informationen enthalten, wie das in C++ geht. Und das es dort vollkommen unterschiedlich funktioniert, habe ich bereits hinreichend ausgeführt.
Gruß, IceRage
-
IceRage schrieb:
Aber woher weiß ich jetzt, wie ich die einzelnen Elemente benutzen muss? In VB, C# oder so gibts ja keine Pointer, Referenzen usw ... Außerdem sind die Übergabeparameter bestimmt auch ganz andere. Gibts denn keine C++ Referenz für Redemption?
also, wenn dann von den Entwicklern der Redemption.dll.
wenn die keine vernurnftige Doku und keine brauchbaren Beispiele liefern, dann such dir ne anderen Hersteller.
gruss
Dirk
-
Hier habe ich mal ein Schnipsel, dass lt. Entwickler funktionieren sollte.
IRDOSession session; session.CreateDispatch(L"Redemption.RDOSession"); COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); session.Logon(covOptional, covOptional, covOptional, covOptional, covOptional ,covOptional);
Da braucht es allerdings den afxdisp.h header, der in den MFC enthalten ist, die widerwurm nicht Bestandteil von VS Express sind.
-
Und warum brauchst Du die MFC? Wegen COleVarian`?
Es gibt doch auch variant_t! Und VARIANT pur kannst Du auch verwenden...
-
Vielen Dank, werd ich so machen.
Übrigens: Der Codeschnippsel direkt hier oben drüber, kann so nicht funktionieren
Wie ich eben herausfand ist IRDOSession ist eine abstrakte Klasse. Und da dürfte es schwierig werden, ein Objekt davon zu instanziieren. Passender Weise sind aber natürlich die Member der Klasse nicht statisch, so dass beispielsweise: Logon() nicht benutzt werden kann ... wunderbare Windoofswelt ...
-
IceRage schrieb:
Wie ich eben herausfand ist IRDOSession ist eine abstrakte Klasse. Und da dürfte es schwierig werden, ein Objekt davon zu instanziieren. Passender Weise sind aber natürlich die Member der Klasse nicht statisch, so dass beispielsweise: Logon() nicht benutzt werden kann ... wunderbare Windoofswelt ...
Instanziieren kannst du es nicht, aber du kannst Zeiger darauf anlegen - danach holst du dir dann ein Objekt, das die akstrakten Methoden definiert hat (das passiert bei COM normalerweise hinter den Kulissen, so daß du den Typ dieses Objekts nicht kennst).
(in Sprachen wie Java oder C# nennt man so etwas dann "Interface")
-
Ich muss doch jetzt aber nicht anfangen von dem Interface zu erben, nur damit ich ein konkretes Objekt anlegen kann.
Also ein Zeiger darauf anlegen ist klar:
IRDOSession *session;
Und wie soll ich mir da jetzt ein konkretes Objekt holen?
EDIT: CoCreateInstance?
-
IceRage schrieb:
Ich muss doch jetzt aber nicht anfangen von dem Interface zu erben, nur damit ich ein konkretes Objekt anlegen kann.
Nein, das hat der Autor der DLL für dich schon erledigt.
Und wie soll ich mir da jetzt ein konkretes Objekt holen?
EDIT: CoCreateInstance?
Vermutlich schon. Aber dazu wartest du besser auf die COM-Experten.
-
IceRage schrieb:
Und wie soll ich mir da jetzt ein konkretes Objekt holen?
EDIT: CoCreateInstance?
Ja! Oder eben von einem anderen Objekt, dass Du über einen Moniker oder aus der IROT erhältst.