![]() |
If this is your first visit, be sure to check out the FAQ by clicking the link above. You may have to register before you can post: click the register link above to proceed. To start viewing messages, select the forum that you want to visit from the selection below. |
|
|
|
Thread Tools | Search this Thread | Display Modes |
#1
|
|||
|
|||
![]()
Hi,
I'm using the following code to get the IMAPIProp-Pointer to the current Outlook mail window. Worked nicely so far. But when I'm testing it with Outlook 2007 beta, the GetMAPIOBJECT call causes an exception. If I perform the same steps as the program below does with OutlookSpy and Outlook 2007 everything works nicely - so what am I doing wrong, here? I'd be grateful for any ideas... THANKS! pete Outlook::_InspectorPtr spInspector = m_OLAppPtr-ActiveWindow(); if (spInspector) { IDispatch *pd = spInspector-GetCurrentItem(); if (pd) { Outlook::_MailItem *pMailItem = NULL; const GUID local_IID_IMailItem = {0x00063034,0,0, {0xC0,0,0,0,0,0,0,0x46}}; pd-QueryInterface (local_IID_IMailItem, (LPVOID *)&pMailItem); if (pMailItem) { IUnknown *iu = pMailItem-GetMAPIOBJECT(); //Crashes in Outlook 2007 Beta ..... |
Ads |
#2
|
|||
|
|||
![]()
Where is your code running? Is it in the outook.exe process space (your code
is a COM add-in) or in a separate exe? Dmitry Streblechenko (MVP) http://www.dimastr.com/ OutlookSpy - Outlook, CDO and MAPI Developer Tool "pete_42" wrote in message ups.com... Hi, I'm using the following code to get the IMAPIProp-Pointer to the current Outlook mail window. Worked nicely so far. But when I'm testing it with Outlook 2007 beta, the GetMAPIOBJECT call causes an exception. If I perform the same steps as the program below does with OutlookSpy and Outlook 2007 everything works nicely - so what am I doing wrong, here? I'd be grateful for any ideas... THANKS! pete Outlook::_InspectorPtr spInspector = m_OLAppPtr-ActiveWindow(); if (spInspector) { IDispatch *pd = spInspector-GetCurrentItem(); if (pd) { Outlook::_MailItem *pMailItem = NULL; const GUID local_IID_IMailItem = {0x00063034,0,0, {0xC0,0,0,0,0,0,0,0x46}}; pd-QueryInterface (local_IID_IMailItem, (LPVOID *)&pMailItem); if (pMailItem) { IUnknown *iu = pMailItem-GetMAPIOBJECT(); //Crashes in Outlook 2007 Beta .... |
#3
|
|||
|
|||
![]()
Dmitry Streblechenko wrote:
Where is your code running? Is it in the outook.exe process space (your code is a COM add-in) or in a separate exe? It's an add-in. |
#4
|
|||
|
|||
![]()
Hmmm... What kind of exception is it? A COM error or something like an
access violation? Dmitry Streblechenko (MVP) http://www.dimastr.com/ OutlookSpy - Outlook, CDO and MAPI Developer Tool "pete_42" wrote in message oups.com... Dmitry Streblechenko wrote: Where is your code running? Is it in the outook.exe process space (your code is a COM add-in) or in a separate exe? It's an add-in. |
#5
|
|||
|
|||
![]()
Dmitry Streblechenko wrote:
Hmmm... What kind of exception is it? A COM error or something like an access violation? Good question. I tried 3 catch'es: catch(_com_error &) catch (CException *) catch (...) The third one caught the exception. So it's probably an access violation. Can the pointer be wrong? Am I doing a bad cast somehow?? |
#6
|
|||
|
|||
![]()
What happens when you run your code under the debugger? Did you set "break
on exception" for all exceptions in Debug | Exceptions dialog? Dmitry Streblechenko (MVP) http://www.dimastr.com/ OutlookSpy - Outlook, CDO and MAPI Developer Tool "pete_42" wrote in message ups.com... Dmitry Streblechenko wrote: Hmmm... What kind of exception is it? A COM error or something like an access violation? Good question. I tried 3 catch'es: catch(_com_error &) catch (CException *) catch (...) The third one caught the exception. So it's probably an access violation. Can the pointer be wrong? Am I doing a bad cast somehow?? |
#7
|
|||
|
|||
![]()
Took some time, but I got some news:
1. pMailItem-Save(); Works most of the time. (Currently I don't worry about RARE crashes) 2. pMailItem-get_MAPIOBJECT(...); Works most of the time, about always yields a NULL pointer. 3. pMailItem-get_Class(...) Works most of the time and yields 43. = So the pMailItem Pointer should be correct. If I compile my DLL in debug mode (Previously I used release mode for an easier deployment on the other PC), I get an error messagesaying the ESP wasn't properly restored, probably because of differing calling coventions. So I guess that my include files (Generated from Outlook 2000) are bad. Quoting from msoutl9.tlh: __declspec(property(get=GetMAPIOBJECT)) IUnknownPtr MAPIOBJECT; and virtual HRESULT __stdcall get_MAPIOBJECT ( IUnknown * * MAPIOBJECT ) = 0; Quoting from msoutl9.tli: #pragma implementation_key(564) inline IUnknownPtr Outlook::_MailItem::GetMAPIOBJECT ( ) { IUnknown * _result; HRESULT _hr = get_MAPIOBJECT(&_result); if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this)); return IUnknownPtr(_result, false); } But this yields new questions: - Does GetMAPIOBJECT really call get_MAPIOBJECT? If so, why don't I get a crash for the latter and why does Microsoft recommend no to use get_MAPIOBJECT? - Is the include bad? And how? Is _stdcall or HRESULT or IUnknown defined wrong by some include? - Is there another way to call the function? Some generic Invoke/Message/Whatever? - Which call do you perform in OutlookSpy when I doubleclick the MAPIOBJECT item in the CurrentItem() View? Thanks. Dmitry Streblechenko wrote: What happens when you run your code under the debugger? Did you set "break on exception" for all exceptions in Debug | Exceptions dialog? |
#8
|
|||
|
|||
![]()
Don't know about the headers - I don't use VC++. Did you try to create new
headers using the Outlook 2007 type library? OutlookSpy always uses late binding when retrieving that property - call IDispatch::GetIDsOfNames("MAPIOBJECT", ...) then IDispatch::Invoke(). Dmitry Streblechenko (MVP) http://www.dimastr.com/ OutlookSpy - Outlook, CDO and MAPI Developer Tool "pete_42" wrote in message ups.com... Took some time, but I got some news: 1. pMailItem-Save(); Works most of the time. (Currently I don't worry about RARE crashes) 2. pMailItem-get_MAPIOBJECT(...); Works most of the time, about always yields a NULL pointer. 3. pMailItem-get_Class(...) Works most of the time and yields 43. = So the pMailItem Pointer should be correct. If I compile my DLL in debug mode (Previously I used release mode for an easier deployment on the other PC), I get an error messagesaying the ESP wasn't properly restored, probably because of differing calling coventions. So I guess that my include files (Generated from Outlook 2000) are bad. Quoting from msoutl9.tlh: __declspec(property(get=GetMAPIOBJECT)) IUnknownPtr MAPIOBJECT; and virtual HRESULT __stdcall get_MAPIOBJECT ( IUnknown * * MAPIOBJECT ) = 0; Quoting from msoutl9.tli: #pragma implementation_key(564) inline IUnknownPtr Outlook::_MailItem::GetMAPIOBJECT ( ) { IUnknown * _result; HRESULT _hr = get_MAPIOBJECT(&_result); if (FAILED(_hr)) _com_issue_errorex(_hr, this, __uuidof(this)); return IUnknownPtr(_result, false); } But this yields new questions: - Does GetMAPIOBJECT really call get_MAPIOBJECT? If so, why don't I get a crash for the latter and why does Microsoft recommend no to use get_MAPIOBJECT? - Is the include bad? And how? Is _stdcall or HRESULT or IUnknown defined wrong by some include? - Is there another way to call the function? Some generic Invoke/Message/Whatever? - Which call do you perform in OutlookSpy when I doubleclick the MAPIOBJECT item in the CurrentItem() View? Thanks. Dmitry Streblechenko wrote: What happens when you run your code under the debugger? Did you set "break on exception" for all exceptions in Debug | Exceptions dialog? |
#9
|
|||
|
|||
![]()
YESYESYES!!!!!
![]() Now it works. If I Invoke() the call manually it works. But now I found a different problem. ![]() Once I Save an unsaved mail, the "pMailItem" seems to become bad. I can't pMailItem-Release it. Or Invoke Save again. Both causes a crash. Does the Save invalidate the pMailItem? Don't I have to release it? Or do I have to wait for the Save to finish? Somehow... |
#10
|
|||
|
|||
![]()
I have never seen or heard about such a problem with MailItem.Save.
I strongly suspect that something happens in your code :-) Dmitry Streblechenko (MVP) http://www.dimastr.com/ OutlookSpy - Outlook, CDO and MAPI Developer Tool "pete_42" wrote in message oups.com... YESYESYES!!!!! ![]() Now it works. If I Invoke() the call manually it works. But now I found a different problem. ![]() Once I Save an unsaved mail, the "pMailItem" seems to become bad. I can't pMailItem-Release it. Or Invoke Save again. Both causes a crash. Does the Save invalidate the pMailItem? Don't I have to release it? Or do I have to wait for the Save to finish? Somehow... |
|
Thread Tools | Search this Thread |
Display Modes | |
|
|
![]() |
||||
Thread | Thread Starter | Forum | Replies | Last Post |
How can I insert an address from Outlook 2007 into Word 2007? | Ron Perry | Outlook - Using Contacts | 2 | June 6th 06 04:24 AM |
Replying to a message induces Outlok to crash - Outlook 2007 beta | Ben | Outlook - Installation | 2 | June 3rd 06 07:04 PM |
Outlook crash with new MSN Messenger | Dianne | Outlook Express | 0 | May 15th 06 07:28 AM |
Outlook Crash | webmaster | Outlook - General Queries | 0 | February 24th 06 06:12 PM |
Outlook Crash on Close? | Mahmoud | Outlook - General Queries | 1 | January 31st 06 11:26 AM |