Prev: How to read a pocket word file (pwi) and convert it into a string....
Next: how to get device id or whatever unique for every device?
From: Sylvester on 16 Feb 2005 13:47 i will inform you tomorow now it's 10 to 9 pm so i will go home "Nathan Lewis" <a-nlewis(a)online.microsoft.com> schrieb im Newsbeitrag news:TOpZLMFFFHA.952(a)TK2MSFTNGXA01.phx.gbl... > I'm no MAPI expert, but I think on the desktop you would do something like > this: > > LPMAPIADVISESINK pAdviseSink = NULL; > HRESULT hR = HrAllocAdviseSink( YourCallbackFunc, lpvSomeParam, > &pAdviseSink ); > > if( SUCCEEDED( hR ) ) > { > hR = lppMDB->Advise( lcbEntryID, > (LPENTRYID)rgprops[0].Value.bin.lpb, > fnevObjectCreated, pAdviseSink, &ulong ); > } > > But since HrAllocAdviseSink doesn't seem to be implemented for Windows CE, > I think you'll have to implement the IMAPIAdviseSink interface yourself. > That complicates things a bit, but it shouldn't be too difficult. Here is > a *really* simplistic - and completely untested - implementation you could > try: > > #define USES_IID_IMAPIAdviseSink > #include <cemapi.h> > > class CMapiAdviseSink : public IMAPIAdviseSink > { > protected: > LPNOTIFCALLBACK m_pfnCallback; > LPVOID m_lpvContext; > LONG m_cRef; > > public: > CMapiAdviseSink( LPNOTIFCALLBACK pfnCallback, LPVOID lpvContext ) > : m_pfnCallback( pfnCallback ) > , m_lpvContext( lpvContext ) > , m_cRef( 0 ) > { > } > > public:// IUnknown > STDMETHOD(QueryInterface)( REFIID riid, LPVOID FAR * ppvObj ) > { > if( IID_IUnknown == riid || IID_IMAPIAdviseSink == riid ) > { > *ppvObj = this; > AddRef(); > return S_OK; > } > return E_NOINTERFACE; > } > STDMETHOD_(ULONG, AddRef)() > { > return InterlockedIncrement( &m_cRef ); > } > STDMETHOD_(ULONG, Release)() > { > ULONG ul = InterlockedDecrement( &m_cRef ); > > if( 0 == ul ) > delete this; > > return ul; > } > > public:// IMAPIAdviseSink > STDMETHOD_(ULONG, OnNotify)( ULONG cNotif, > LPNOTIFICATION lpNotifications ) > { > if( m_pfnCallback ) > m_pfnCallback( m_lpvContext, cNotif, lpNotifications ); > > return S_OK; > } > }; > > > You could also implement the HrAllocAdviseSink function yourself, like so: > > STDAPI HrAllocAdviseSink( LPNOTIFCALLBACK lpfnCallback, > LPVOID lpvContext, LPMAPIADVISESINK* lppAdviseSink ) > { > if( NULL == lppAdviseSink ) > return E_INVALIDARG; > > *lppAdviseSink = new CMapiAdviseSink( lpfnCallback, lpvContext ); > > if( NULL == *lppAdviseSink ) > return E_OUTOFMEMORY; > > (*lppAdviseSink)->AddRef(); > return S_OK; > } > > > Then just throw all of this in a separate header file, and you'll end up > with code that will compile for either the desktop or Windows CE. > Theoretically, anyway - as I said, I haven't actually tested this code. > Give it a shot and let me know how it works out... > > > --- > > Nathan Lewis > Microsoft Mobile and Embedded Devices Developer Support > > This posting is provided "AS IS" with no warranties, and confers no rights. > > > > -------------------- > From: "Sylvester" <lists_sebastian(a)yahoo.de> > Subject: IMsgStore::Advise > Date: Wed, 16 Feb 2005 15:09:53 +0100 > > > Hello, > > I need to register for the event "fnewObjectCreated" (creation of a message) > in my Inbox folder but the Advise method needs an alocated IMAPIAdviseSink > object. > If I write LPMAPIADVISESINK lpAdviseSink I get a warning that an > uninitialized parameter is used. That's ok because I created a pointer to > IMAPIAdviseSink Interface only. But how can I initialize lpAdviseSink????? > > RESULT = > lppMDB->Advise(cbEntryID,(LPENTRYID)rgprops[0].Value.bin.lpb,fnevObjectCreat > ed,lpAdviseSink,&ulong); > > please help thanks in advance > > Is there a good book available for either CEMAPI or MAPI? > > >
From: Adrian on 16 Feb 2005 17:16 You have to create a class that derives from IMAPIAdviseSink and implement the virtual methods, you can then pass an instance of this class to the IMsgStore::Advise and it will call you back with the notification. It's obvious (no ofense) that you don't have much programming experience, perhaps you should start by reading about OOP and COM before delving into CEMAPI. Adrian "Sylvester" <lists_sebastian(a)yahoo.de> wrote in message news:eaVMxEDFFHA.3928(a)TK2MSFTNGP15.phx.gbl... > Hello, > > I need to register for the event "fnewObjectCreated" (creation of a message) > in my Inbox folder but the Advise method needs an alocated IMAPIAdviseSink > object. > If I write LPMAPIADVISESINK lpAdviseSink I get a warning that an > uninitialized parameter is used. That's ok because I created a pointer to > IMAPIAdviseSink Interface only. But how can I initialize lpAdviseSink????? > > RESULT = > lppMDB->Advise(cbEntryID,(LPENTRYID)rgprops[0].Value.bin.lpb,fnevObjectCreat > ed,lpAdviseSink,&ulong); > > please help thanks in advance > > Is there a good book available for either CEMAPI or MAPI? > >
From: Nathan Lewis on 17 Feb 2005 12:04
Whoops - here's the link for the Pocket PC SDK docs. The other was for Smartphone. But they're both the same anyway... http://msdn.microsoft.com/library/en-us/apippc/html/ppc__mapi1book_imsgstore _advise.asp --- Nathan Lewis Microsoft Mobile and Embedded Devices Developer Support This posting is provided "AS IS" with no warranties, and confers no rights. -------------------- From: a-nlewis(a)online.microsoft.com (Nathan Lewis) Date: Thu, 17 Feb 2005 17:00:39 GMT Subject: Re: IMsgStore::Advise That error code corresponds to "The parameter is incorrect". Looking at the documentation for the IMsgStore::Advise method (http://msdn.microsoft.com/library/en-us/APISP/html/sp__mapi1book_imsgstore_ advise.asp), it looks like the first parameter must be set to zero, and the second must be set to NULL. --- Nathan Lewis Microsoft Mobile and Embedded Devices Developer Support This posting is provided "AS IS" with no warranties, and confers no rights. -------------------- From: "Sylvester" <lists_sebastian(a)yahoo.de> Subject: Re: IMsgStore::Advise Date: Thu, 17 Feb 2005 12:38:56 +0100 I derived from IMAPIAdviseSync but my OnNotify will not dispatched. my code is the following and after a call to Advise RESULT has value 2147942487 what makes my code wrong? please help void CMainDlg::OnRegisterNotification() { HRESULT RESULT; LPMAPISESSION lppSession; LPMAPITABLE lppTable; SizedSPropTagArray(2, mSPropTagArray) = {2,{PR_DISPLAY_NAME,PR_ENTRYID}};//PR_DISPLAY_NAME, LPSRowSet pRows = NULL; LPSPropValue rgprops = NULL; LPMDB lppMDB; ULONG ulong = 1; ULONG cbEntryID = sizeof(ENTRYID); ULONG rgTags[2] = {1,PR_CE_IPM_INBOX_ENTRYID}; ULONG cValues = 0; ULONG lpulCount = 0; ULONG cbSize = sizeof(IMAPIAdviseSink); CNotify *lpAdviseSink = new CNotify; while(TRUE) { RESULT = MAPIInitialize(0); if(!(MB_OK == RESULT)) break; RESULT = MAPILogonEx(0,_T(""),_T(""),0,&lppSession); if(!(MB_OK == RESULT)) break; RESULT = lppSession->GetMsgStoresTable (MAPI_UNICODE,&lppTable); if(!(MB_OK == RESULT)) break; RESULT = lppTable->SetColumns((LPSPropTagArray)&mSPropTagArray, 0); if(!(MB_OK == RESULT)) break; CString msgstorename=_T(CUSTOM_EMAIL_ACCOUNT_NAME); while (TRUE) { LPSPropValue lpProp; RESULT = lppTable->QueryRows(1, 0, &pRows); if(!(MB_OK == RESULT)) goto logoff; if (pRows->cRows != 1) { goto logoff; } lpProp = &pRows->aRow[0].lpProps[0]; // check name if(_tcscmp(lpProp->Value.LPSZ, (LPCTSTR)msgstorename) == 0) { goto setAdvise; // messagestore exists } // free this row FreeProwsP(pRows); } setAdvise: RESULT = lppSession->OpenMsgStore(0,pRows->aRow[0].lpProps[1].Value.bin.cb,(ENTRYID*) pRows->aRow[0].lpProps[1].Value.bin.lpb,NULL,MDB_NO_DIALOG|MAPI_BEST_ACCESS, &lppMDB); if(!(MB_OK == RESULT)) break; RESULT = lppMDB->GetProps((LPSPropTagArray) rgTags, MAPI_UNICODE, &cValues, &rgprops); if(!(MB_OK == RESULT)) break; /* CbNewENTRYID(cbEntryID); RESULT = lppMDB->Advise(cbEntryID,(LPENTRYID)rgprops[0].Value.bin.lpb,fnevObjectMoved ,lpAdviseSink,&ulong); logoff: RESULT = lppSession->Logoff(0,MAPI_LOGOFF_SHARED,0); if(!(MB_OK == RESULT)) break; MAPIUninitialize(); break; } "Nathan Lewis" <a-nlewis(a)online.microsoft.com> schrieb im Newsbeitrag news:TOpZLMFFFHA.952(a)TK2MSFTNGXA01.phx.gbl... > I'm no MAPI expert, but I think on the desktop you would do something like > this: > > LPMAPIADVISESINK pAdviseSink = NULL; > HRESULT hR = HrAllocAdviseSink( YourCallbackFunc, lpvSomeParam, > &pAdviseSink ); > > if( SUCCEEDED( hR ) ) > { > hR = lppMDB->Advise( lcbEntryID, > (LPENTRYID)rgprops[0].Value.bin.lpb, > fnevObjectCreated, pAdviseSink, &ulong ); > } > > But since HrAllocAdviseSink doesn't seem to be implemented for Windows CE, > I think you'll have to implement the IMAPIAdviseSink interface yourself. > That complicates things a bit, but it shouldn't be too difficult. Here is > a *really* simplistic - and completely untested - implementation you could > try: > > #define USES_IID_IMAPIAdviseSink > #include <cemapi.h> > > class CMapiAdviseSink : public IMAPIAdviseSink > { > protected: > LPNOTIFCALLBACK m_pfnCallback; > LPVOID m_lpvContext; > LONG m_cRef; > > public: > CMapiAdviseSink( LPNOTIFCALLBACK pfnCallback, LPVOID lpvContext ) > : m_pfnCallback( pfnCallback ) > , m_lpvContext( lpvContext ) > , m_cRef( 0 ) > { > } > > public:// IUnknown > STDMETHOD(QueryInterface)( REFIID riid, LPVOID FAR * ppvObj ) > { > if( IID_IUnknown == riid || IID_IMAPIAdviseSink == riid ) > { > *ppvObj = this; > AddRef(); > return S_OK; > } > return E_NOINTERFACE; > } > STDMETHOD_(ULONG, AddRef)() > { > return InterlockedIncrement( &m_cRef ); > } > STDMETHOD_(ULONG, Release)() > { > ULONG ul = InterlockedDecrement( &m_cRef ); > > if( 0 == ul ) > delete this; > > return ul; > } > > public:// IMAPIAdviseSink > STDMETHOD_(ULONG, OnNotify)( ULONG cNotif, > LPNOTIFICATION lpNotifications ) > { > if( m_pfnCallback ) > m_pfnCallback( m_lpvContext, cNotif, lpNotifications ); > > return S_OK; > } > }; > > > You could also implement the HrAllocAdviseSink function yourself, like so: > > STDAPI HrAllocAdviseSink( LPNOTIFCALLBACK lpfnCallback, > LPVOID lpvContext, LPMAPIADVISESINK* lppAdviseSink ) > { > if( NULL == lppAdviseSink ) > return E_INVALIDARG; > > *lppAdviseSink = new CMapiAdviseSink( lpfnCallback, lpvContext ); > > if( NULL == *lppAdviseSink ) > return E_OUTOFMEMORY; > > (*lppAdviseSink)->AddRef(); > return S_OK; > } > > > Then just throw all of this in a separate header file, and you'll end up > with code that will compile for either the desktop or Windows CE. > Theoretically, anyway - as I said, I haven't actually tested this code. > Give it a shot and let me know how it works out... > > > --- > > Nathan Lewis > Microsoft Mobile and Embedded Devices Developer Support > > This posting is provided "AS IS" with no warranties, and confers no rights. > > > > -------------------- > From: "Sylvester" <lists_sebastian(a)yahoo.de> > Subject: IMsgStore::Advise > Date: Wed, 16 Feb 2005 15:09:53 +0100 > > > Hello, > > I need to register for the event "fnewObjectCreated" (creation of a message) > in my Inbox folder but the Advise method needs an alocated IMAPIAdviseSink > object. > If I write LPMAPIADVISESINK lpAdviseSink I get a warning that an > uninitialized parameter is used. That's ok because I created a pointer to > IMAPIAdviseSink Interface only. But how can I initialize lpAdviseSink????? > > RESULT = > lppMDB->Advise(cbEntryID,(LPENTRYID)rgprops[0].Value.bin.lpb,fnevObjectCreat > ed,lpAdviseSink,&ulong); > > please help thanks in advance > > Is there a good book available for either CEMAPI or MAPI? > > > |