Outlook Banter

Outlook Banter (http://www.outlookbanter.com/)
-   Add-ins for Outlook (http://www.outlookbanter.com/add-ins-outlook/)
-   -   How to uniquely identify explorer / inspector objects in Outlook 2007 (http://www.outlookbanter.com/add-ins-outlook/56080-how-uniquely-identify-explorer-inspector.html)

gernot September 3rd 07 07:25 PM

How to uniquely identify explorer / inspector objects in Outlook 2007
 
I am always getting different interface pointers for same explorer
objects. The same happens for inspector objects. What can a do to
unquely identify these objects?

Scenario:

1. In the NewInspector handler I save the _Inspector pointer.
2. In an event handler from a control in this inspector I use
IRibbonControl::get_Context() to obtain the corresponding _Inspector
pointer.

These pointers are never the same (comparing IUnknown pointers). These
COM objects are not the same!

In the case of inspectors I get away identifying them by its creation
date.
What can I do to identify explorers? Is there any Outlook method to
compare these objects?

Thanks, Gernot


Ken Slovak - [MVP - Outlook] September 4th 07 04:36 PM

How to uniquely identify explorer / inspector objects in Outlook 2007
 
Outlook 2007 allows you to test for equality of two Inspector or Explorer
objects using the C# == operator or the VB Is operator. Earlier versions of
Outlook don't allow that.

What I usually do is to test for the window.Caption and also for the window
rectangle dimensions and coordinates. I use the Explorer (or Inspector) Top,
Left, Height and Width properties compared to the window I get using
FindWindow (a Win32 API call). If it's the foreground window you're working
with you can use GetForegroundWindow instead of using FindWindow.

--
Ken Slovak
[MVP - Outlook]
http://www.slovaktech.com
Author: Professional Programming Outlook 2007
Reminder Manager, Extended Reminders, Attachment Options
http://www.slovaktech.com/products.htm


"gernot" wrote in message
ups.com...
I am always getting different interface pointers for same explorer
objects. The same happens for inspector objects. What can a do to
unquely identify these objects?

Scenario:

1. In the NewInspector handler I save the _Inspector pointer.
2. In an event handler from a control in this inspector I use
IRibbonControl::get_Context() to obtain the corresponding _Inspector
pointer.

These pointers are never the same (comparing IUnknown pointers). These
COM objects are not the same!

In the case of inspectors I get away identifying them by its creation
date.
What can I do to identify explorers? Is there any Outlook method to
compare these objects?

Thanks, Gernot



gernot September 5th 07 12:32 PM

How to uniquely identify explorer / inspector objects in Outlook 2007
 
How does C# implement the == operator? It must be more than just
comparing COM objects.
The workaround with FindWindow() is alright ;-)

Thanks, Gernot


On Sep 4, 5:36 pm, "Ken Slovak - [MVP - Outlook]"
wrote:
Outlook 2007 allows you to test for equality of two Inspector or Explorer
objects using the C# == operator or the VB Is operator. Earlier versions of
Outlook don't allow that.

What I usually do is to test for the window.Caption and also for the window
rectangle dimensions and coordinates. I use the Explorer (or Inspector) Top,
Left, Height and Width properties compared to the window I get using
FindWindow (a Win32 API call). If it's the foreground window you're working
with you can use GetForegroundWindow instead of using FindWindow.

--
Ken Slovak
[MVP - Outlook]http://www.slovaktech.com
Author: Professional Programming Outlook 2007
Reminder Manager, Extended Reminders, Attachment Optionshttp://www.slovaktech.com/products.htm

"gernot" wrote in message

ups.com...



I am always getting different interface pointers for same explorer
objects. The same happens for inspector objects. What can a do to
unquely identify these objects?


Scenario:


1. In the NewInspector handler I save the _Inspector pointer.
2. In an event handler from a control in this inspector I use
IRibbonControl::get_Context() to obtain the corresponding _Inspector
pointer.


These pointers are never the same (comparing IUnknown pointers). These
COM objects are not the same!


In the case of inspectors I get away identifying them by its creation
date.
What can I do to identify explorers? Is there any Outlook method to
compare these objects?


Thanks, Gernot- Hide quoted text -


- Show quoted text -




Ken Slovak - [MVP - Outlook] September 5th 07 02:14 PM

How to uniquely identify explorer / inspector objects in Outlook 2007
 
It's just a comparison of the COM objects, just a normal C# equality
comparison. It's just that the Outlook team fixed Explorers and Inspectors
so that works in Outlook 2007.

--
Ken Slovak
[MVP - Outlook]
http://www.slovaktech.com
Author: Professional Programming Outlook 2007
Reminder Manager, Extended Reminders, Attachment Options
http://www.slovaktech.com/products.htm


"gernot" wrote in message
ups.com...
How does C# implement the == operator? It must be more than just
comparing COM objects.
The workaround with FindWindow() is alright ;-)

Thanks, Gernot



gernot September 8th 07 01:04 AM

How to uniquely identify explorer / inspector objects in Outlook 2007
 
Finally I compare inspector objects by their entry id:

_Inspector *pInspector;

// get entry id
CComPtrIDispatch pDispCurrentItem;
HRESULT hr = pInspector-get_CurrentItem(&pDispCurrentItem);
if (FAILED(hr)) { ReportError(hr); return NULL; }

CComQIPtr_MailItem pMailItem(pDispCurrentItem);
if (!pMailItem) { ReportError(E_POINTER); return NULL; }

CComPtrIUnknown pUnkMessage;
hr = pMailItem-get_MAPIOBJECT(&pUnkMessage);
if (FAILED(hr)) { ReportError(hr); return NULL; }

CComQIPtrIMessage, &IID_IMessage pMessage(pUnkMessage);
if (!pMessage) { ReportError(E_POINTER); return NULL; }

SPropValue *pProp = NULL;
hr = HrGetOneProp(pMessage, PR_ENTRYID, &pProp);
if (FAILED(hr)) { ReportError(hr); return NULL; }

Now pProp-Value.bin has the entry id. To check if two entry ids are
equal:

// get compare function
CComPtr_NameSpace pSession;
hr = pInspector-get_Session(&pSession);
if (FAILED(hr)) { ReportError(hr); return NULL; }

CComPtrIUnknown pUnkSession;
pSession-get_MAPIOBJECT(&pUnkSession);
if (FAILED(hr)) { ReportError(hr); return NULL; }

CComQIPtrIMAPISession, &IID_IMAPISession
pMAPISession(pUnkSession);
if (!pMAPISession) { ReportError(E_POINTER); return NULL; }

pMAPISession-CompareEntryIDs() is used to compare ids.

Comparing the IUnknown pointers of two _Inspector interfaces does not
work for C++.


On Sep 5, 3:14 pm, "Ken Slovak - [MVP - Outlook]"
wrote:
It's just a comparison of the COM objects, just a normal C# equality
comparison. It's just that the Outlook team fixed Explorers and Inspectors
so that works in Outlook 2007.

--
Ken Slovak
[MVP - Outlook]http://www.slovaktech.com
Author: Professional Programming Outlook 2007
Reminder Manager, Extended Reminders, Attachment Optionshttp://www.slovaktech.com/products.htm

"gernot" wrote in message

ups.com...



How does C# implement the == operator? It must be more than just
comparing COM objects.
The workaround with FindWindow() is alright ;-)


Thanks, Gernot- Hide quoted text -


- Show quoted text -




gernot September 11th 07 09:11 PM

How to uniquely identify explorer / inspector objects in Outlook 2007
 
MAPI entry ids may not exist before the item is saved. In this case I
use the creation time to identify the item.

On Sep 8, 2:04 am, gernot wrote:
Finally I compare inspector objects by their entry id:

_Inspector *pInspector;

// get entry id
CComPtrIDispatch pDispCurrentItem;
HRESULT hr = pInspector-get_CurrentItem(&pDispCurrentItem);
if (FAILED(hr)) { ReportError(hr); return NULL; }

CComQIPtr_MailItem pMailItem(pDispCurrentItem);
if (!pMailItem) { ReportError(E_POINTER); return NULL; }

CComPtrIUnknown pUnkMessage;
hr = pMailItem-get_MAPIOBJECT(&pUnkMessage);
if (FAILED(hr)) { ReportError(hr); return NULL; }

CComQIPtrIMessage, &IID_IMessage pMessage(pUnkMessage);
if (!pMessage) { ReportError(E_POINTER); return NULL; }

SPropValue *pProp = NULL;
hr = HrGetOneProp(pMessage, PR_ENTRYID, &pProp);
if (FAILED(hr)) { ReportError(hr); return NULL; }

Now pProp-Value.bin has the entry id. To check if two entry ids are
equal:

// get compare function
CComPtr_NameSpace pSession;
hr = pInspector-get_Session(&pSession);
if (FAILED(hr)) { ReportError(hr); return NULL; }

CComPtrIUnknown pUnkSession;
pSession-get_MAPIOBJECT(&pUnkSession);
if (FAILED(hr)) { ReportError(hr); return NULL; }

CComQIPtrIMAPISession, &IID_IMAPISession
pMAPISession(pUnkSession);
if (!pMAPISession) { ReportError(E_POINTER); return NULL; }

pMAPISession-CompareEntryIDs() is used to compare ids.

Comparing the IUnknown pointers of two _Inspector interfaces does not
work for C++.

On Sep 5, 3:14 pm, "Ken Slovak - [MVP - Outlook]"
wrote:



It's just a comparison of the COM objects, just a normal C# equality
comparison. It's just that the Outlook team fixed Explorers and Inspectors
so that works in Outlook 2007.


--
Ken Slovak
[MVP - Outlook]http://www.slovaktech.com
Author: Professional Programming Outlook 2007
Reminder Manager, Extended Reminders, Attachment Optionshttp://www.slovaktech.com/products.htm


"gernot" wrote in message


oups.com...


How does C# implement the == operator? It must be more than just
comparing COM objects.
The workaround with FindWindow() is alright ;-)


Thanks, Gernot- Hide quoted text -


- Show quoted text -- Hide quoted text -


- Show quoted text -





All times are GMT +1. The time now is 11:16 PM.

Powered by vBulletin® Version 3.6.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 2.4.0
Copyright ©2004-2006 OutlookBanter.com