Extended MAPI



  • Hallo,

    vielleicht kommt ja Einigen hier mein Anliegen bekannt vor. Es geht eigentlich "nur" darum, Tasks aus der pst Datei von Outlook zu lesen, und diese ggf. zu verwalten. Das sollte aus einer C++ Anwendung geschehen, die als Dienst funktionieren soll. Sollte es bis hierhin schon Fragen geben, bezüglich unvollständiger Angaben, die ich auf Grund fehlenden Wissens nicht gemacht habe, so reiche ich diese gern nach.

    Ansonsten habe ich hier einmal, aus einem Beispielcode etwas zusammengeschrieben, dass einfach irgendetwas über MAPI ausliest. Ja, richtig: irgendetwas. Mir geht es darum überhaupt erstmal auch nur eine einzige Methode von MAPI erfolgreich anwenden zu können. Da das Ganz ja super einfach und problemlos aus einem VB Code übernommen, und nach C++ umgewandelt werden kann, sitze ich jetzt schon seit einer Woche, um überhaupt mal irgendein ausführbares Beispiel zu erhalten, dass irgendwas über MAPI ausliest. Man sieht also: Die Einbindung von COM Komponenten geht ja wirklich einfach, über eine simple Integration mittels des Statements #import "dll-Pfad" (funktioniert leider bis heute noch nicht, weder mit ...Ptr, noch ohne!), oder eben über die ProcAddressen der Funktions Pointer, was leider auch noch nicht funktioniert.

    Hier der Code:

    // OutlookRedemption.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung.
    //
    
    #include "stdafx.h"
    
    using namespace std;
    
    MAPIFREEBUFFER *pMAPIFreeBuffer=0;
    
    int _tmain(int argc, _TCHAR* argv[]) {
    	MAPIADMINPROFILES *pMAPIAdminProfiles=0;
    	MAPIUNINITIALIZE *pMAPIUninitialize=0;
    	MAPILOGONEX *pMAPILogonEx=0;	
    	//RTFSync *pRTFSync=0;
    	//WRAPCOMPRESSEDRTFSTREAM *pWrapCompressedRTFStream=0;
    
    	LPCWSTR libpath = (LPCWSTR) "mapi32.dll";
    	HINSTANCE hmapilib = LoadLibrary(libpath);	
    
    	hmapilib = LoadLibrary(libpath); 
    	if (hmapilib==0) 
    		return;
    
    	MAPIINITIALIZE *pMAPIInitialize = (MAPIINITIALIZE*)GetProcAddress(hmapilib,"MAPIInitialize");
    	MAPIADMINPROFILES *pMAPIAdminProfiles = (MAPIADMINPROFILES*)GetProcAddress(hmapilib,"MAPIAdminProfiles");
    	pMAPILogonEx = (MAPILOGONEX*)GetProcAddress(hmapilib,"MAPILogonEx");
    	pMAPIUninitialize = (MAPIUNINITIALIZE*)GetProcAddress(hmapilib,"MAPIUninitialize");
    	pMAPIFreeBuffer = (MAPIFREEBUFFER*)GetProcAddress(hmapilib,"MAPIFreeBuffer");
    //	pRTFSync = (RTFSYNC*)GetProcAddress(hmapilib,"RTFSync");
    //	pWrapCompressedRTFStream = (WRAPCOMPRESSEDRTFSTREAM*)GetProcAddress(hmapilib,"WrapCompressedRTFStream");
    	if (pMAPIInitialize==0 || pMAPIAdminProfiles==0 || pMAPILogonEx==0 || pMAPIUninitialize==0
    		|| pMAPIFreeBuffer==0) {
    		FreeLibrary(hmapilib);
    		hmapilib=0;
    		return;
    	}
    
    	IProfAdmin *iprofadmin;
    	HRESULT hr = pMAPIInitialize(NULL);
    	hr = pMAPIAdminProfiles(0,&iprofadmin);
    
    	if (hr==S_OK) {
    		list<string> profiles;
    		IMAPITable *proftable;
    		hr = iprofadmin->GetProfileTable(0, &proftable);
    		if (hr==S_OK) {
    			SizedSPropTagArray(2, proftablecols) = { 2, {PR_DISPLAY_NAME,PR_DEFAULT_PROFILE} };
    			SRowSet *profrows;
    			hr = pHrQueryAllRows(proftable,(SPropTagArray*)&proftablecols,NULL,NULL,0,&profrows);
    			if (hr==S_OK) {
    				for (unsigned int i=0; i<profrows->cRows; i++) {
    					string name="";
    					bool isdefault=false;
    					if (profrows->aRow[i].lpProps[0].ulPropTag==PR_DISPLAY_NAME) { 
    						name=profrows->aRow[i].lpProps[0].Value.lpszA;
    						printf("%s\n", name);
    					}
    					if (profrows->aRow[i].lpProps[1].ulPropTag==PR_DEFAULT_PROFILE)
    						isdefault=(0!=profrows->aRow[i].lpProps[1].Value.b);
    					if (name!="" && name!="Profile democode") {
    						if (isdefault) 
    							profiles.push_front(name); 
    						else 
    							profiles.push_back(name);
    					}
    				}
    				pFreeProws(profrows);
    			}
    			proftable->Release();
    		}
    	}
    
    	system("PAUSE");
        return 0;
    }
    
    void scheisshaufen (SRowSet *r) {
    }
    
    void pFreeProws(SRowSet *r) {
    	if (r==0) return;
    	for (unsigned int i=0; i<r->cRows; i++) {
    		SPropValue *pv = r->aRow[i].lpProps;
    		pMAPIFreeBuffer(pv);
    	}
    
    	pMAPIFreeBuffer(r);
    }
    
    HRESULT pHrQueryAllRows(IMAPITable *table, SPropTagArray *tags, SRestriction *res,
       SSortOrderSet *sort, LONG crowsMax, SRowSet **rows) {
    
    	if (tags!=0) table->SetColumns(tags,0);
    	if (res!=0) table->Restrict(res,0);
    	if (sort!=0) table->SortTable(sort,0);
    	if (crowsMax==0) crowsMax=0x0FFFFFFF;
    	HRESULT hr = MAPI_E_BUSY;
    
    	while (hr==MAPI_E_BUSY) {
    		hr = table->QueryRows(crowsMax,TBL_NOADVANCE,rows);
    		if (hr==MAPI_E_BUSY) {
    			hr=table->WaitForCompletion(0,1000,NULL);
    			if (hr!=MAPI_E_NO_SUPPORT)
    				hr=MAPI_E_BUSY;
    		}
    	}
    
    	return hr;
    }
    

    Wenn dieser Code ausgeführt erhalte ich folgende Fehlermeldung, mit der ich leider absolut nichts anfangen kann:

    1>c:\programme\microsoft visual studio 10.0\vc\include\intrin.h(1057): error C2733: Zweite C-Bindung für überladene Funktion '_interlockedbittestandreset' nicht zulässig
    1>          c:\programme\microsoft visual studio 10.0\vc\include\intrin.h(1057): Siehe Deklaration von '_interlockedbittestandreset'
    

    [ironie]
    Vielleicht werde ich noch einmal die wirklich überaus simple Integration der COM Komponente, über das oft genug verwendete Statement #import versuchen, dass mir ja auch schon in der Vergangenheit vollständig den Dienst versagt hat. Mal sehen was sich M$ diesmal als Fallstrick ausgedacht hat, damit ihre maßlos überteuerten und aufgeblähten MSDSDSDSXYZ Leergänge eine Daseinsberechtigung haben. Aber warum einfach, wenn man es den Leuten auch schwer machen kann, dass ist doch viel lustiger. [/ironie]



  • IceRage schrieb:

    1>c:\programme\microsoft visual studio 10.0\vc\include\intrin.h(1057): error C2733: Zweite C-Bindung für überladene Funktion '_interlockedbittestandreset' nicht zulässig
    1>          c:\programme\microsoft visual studio 10.0\vc\include\intrin.h(1057): Siehe Deklaration von '_interlockedbittestandreset'
    

    Der Fehler besagt im Klartext, daß man extern "C" definierte Funktionen nicht überladen darf. Warum er als vorhergehende Deklaration wieder die selbe Zeile angibt, bin ich überfragt - vermutlich hat da irgendjemand unterwegs die Include-Guards vergessen.

    (eventuell solltest du mal angeben, was du so in die den vorcompilierten Header stdafx.h gepackt hast)



  • // stdafx.h : Includedatei für Standardsystem-Includedateien
    // oder häufig verwendete projektspezifische Includedateien,
    // die nur in unregelmäßigen Abständen geändert werden.
    //

    #pragma once
    komplette stdafx.h ... :

    #include "targetver.h"

    #include <stdio.h>
    #include <tchar.h>
    #include <windows.h>
    #include <shellapi.h>
    #include <mapix.h>
    #include <mapiutil.h>
    #include <mspst.h>
    #include "redemption.tlh"
    #include <string>
    #include <list>
    #include <map>

    // TODO: Hier auf zusätzliche Header, die das Programm erfordert, verweisen.

    EDIT: Der tlh Header war ein Versuch auf Martins Vorschlag hin, es mal so zu versuchen. Geht natürlich auch nicht.


Anmelden zum Antworten