Skip to content
  • Categories
  • Recent
  • Tags
  • Popular
  • World
  • Users
  • Groups
Skins
  • Light
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Code Project
  1. Home
  2. General Programming
  3. C / C++ / MFC
  4. Problem Opening Email when using InvokeHelper in C++

Problem Opening Email when using InvokeHelper in C++

Scheduled Pinned Locked Moved C / C++ / MFC
c++wpfhelpquestion
18 Posts 4 Posters 0 Views 1 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • U User 2970611

    Hi I have an MFC Project, and what this project does is to allow a user to Open an in a number of different way, either a new email message, a new email message using a template or open an existing email message. The MFC is part of a much larger application and some of the data for selecting the correct email templates and opening an existing email comes from a web service. My MFC Project works to a certain, I can get Outlook, I can get my Web Service with my email template, but when I reach the point of Open the Email either a new one, open or otherwise it fails. Here is my code snippet: CString emailPath; LPDISPATCH mailItem; static BYTE params [] = VIS_BSTR VTS_VARIANT ; m_outlook->(0x10a, DISPATCH_METHOD, VT_DISPATCH, (void*)&mailItem, params, emailPath, NULL) //falls over here! outlookMailItem = new COleDispatchDriver(mailItem); What I have done wrong? Thanks

    B Offline
    B Offline
    barneyman
    wrote on last edited by
    #9

    what object is m_outlook and what method is 0x10a? I don't think your problem is with invokeHelper, I think it's with the underlying method in the m_outlook object

    U 1 Reply Last reply
    0
    • B barneyman

      what object is m_outlook and what method is 0x10a? I don't think your problem is with invokeHelper, I think it's with the underlying method in the m_outlook object

      U Offline
      U Offline
      User 2970611
      wrote on last edited by
      #10

      Hi The code is based upon this website: http://repositorium.googlecode.com/svn/trunk/AbstractSpoon/OutlookImpExp/Source/msoutl.cpp Yes, there is a mistake it should say m_outlook->invokehelper and m_outlook is the name for outlook object which I have called before to start MS Outlook. The next step is to open an email template that is given a template file path and to display this to the user. I have tried searching MSDN for help, but I can't find any help. The code I have used is based upon this from the website above: LPDISPATCH _Application::CreateItemFromTemplate(LPCTSTR TemplatePath, const VARIANT& InFolder) { LPDISPATCH result; static BYTE parms[] = VTS_BSTR VTS_VARIANT; InvokeHelper(0x10b, DISPATCH_METHOD, VT_DISPATCH, (void*)&result, parms, TemplatePath, &InFolder); return result; } I have tried passing in NULL for the last parameter as there is no folder involved, but I am guessing on a lot of this because I have no idea what the exact definition of the method in MS Outlook for 0x10a or 0x10b. As I have said I can't find in MSDN any definition for this. Can you help?

      B 1 Reply Last reply
      0
      • U User 2970611

        Hi The code is based upon this website: http://repositorium.googlecode.com/svn/trunk/AbstractSpoon/OutlookImpExp/Source/msoutl.cpp Yes, there is a mistake it should say m_outlook->invokehelper and m_outlook is the name for outlook object which I have called before to start MS Outlook. The next step is to open an email template that is given a template file path and to display this to the user. I have tried searching MSDN for help, but I can't find any help. The code I have used is based upon this from the website above: LPDISPATCH _Application::CreateItemFromTemplate(LPCTSTR TemplatePath, const VARIANT& InFolder) { LPDISPATCH result; static BYTE parms[] = VTS_BSTR VTS_VARIANT; InvokeHelper(0x10b, DISPATCH_METHOD, VT_DISPATCH, (void*)&result, parms, TemplatePath, &InFolder); return result; } I have tried passing in NULL for the last parameter as there is no folder involved, but I am guessing on a lot of this because I have no idea what the exact definition of the method in MS Outlook for 0x10a or 0x10b. As I have said I can't find in MSDN any definition for this. Can you help?

        B Offline
        B Offline
        barneyman
        wrote on last edited by
        #11

        Looking at the type Library for Microsoft Outlook ...

        [id(0x0000010a), helpcontext(0x000002ca)]
        IDispatch* CreateItem([in] OlItemType ItemType);

        [id(0x0000010b), helpcontext(0x000002cb)]
        IDispatch* CreateItemFromTemplate(
        [in] BSTR TemplatePath,
        [in, optional] VARIANT InFolder);

        which gets me to ... http://msdn.microsoft.com/en-us/library/aa220081(v=office.11).aspx[^] Does that help any?

        U 1 Reply Last reply
        0
        • B barneyman

          Looking at the type Library for Microsoft Outlook ...

          [id(0x0000010a), helpcontext(0x000002ca)]
          IDispatch* CreateItem([in] OlItemType ItemType);

          [id(0x0000010b), helpcontext(0x000002cb)]
          IDispatch* CreateItemFromTemplate(
          [in] BSTR TemplatePath,
          [in, optional] VARIANT InFolder);

          which gets me to ... http://msdn.microsoft.com/en-us/library/aa220081(v=office.11).aspx[^] Does that help any?

          U Offline
          U Offline
          User 2970611
          wrote on last edited by
          #12

          Thanks for your email. I had a look at the link you gave me from MSDN. However, I am still just as confused and still stuck. The code I have been given is that in my original posting. I have an Outlook object, because this code is not falling over, but I can create a mail item for a template.

          B 1 Reply Last reply
          0
          • U User 2970611

            Thanks for your email. I had a look at the link you gave me from MSDN. However, I am still just as confused and still stuck. The code I have been given is that in my original posting. I have an Outlook object, because this code is not falling over, but I can create a mail item for a template.

            B Offline
            B Offline
            barneyman
            wrote on last edited by
            #13

            in your original code snippet, you're using a CString, you need to use a BSTR use the AllocSysString() method in CString that may help

            U 2 Replies Last reply
            0
            • B barneyman

              in your original code snippet, you're using a CString, you need to use a BSTR use the AllocSysString() method in CString that may help

              U Offline
              U Offline
              User 2970611
              wrote on last edited by
              #14

              Ok, so are you saying I need to convert CString to BSTR and AllocSysString() to do this?

              1 Reply Last reply
              0
              • B barneyman

                in your original code snippet, you're using a CString, you need to use a BSTR use the AllocSysString() method in CString that may help

                U Offline
                U Offline
                User 2970611
                wrote on last edited by
                #15

                Just to let you know that I followed what you said, but it threw an unhandled exception. Here is the code as it on screen OpenOutlookNewMessageWithMsgFile(CString filePath) //Call CreateItemFromTemplate to create new mailitem using late binding LPDISPATH mailItem static BYTE params[] = VTS_BSTR VTS_VARIANT ; BSTR bFilePath = filePath.AllocSysString(); outlookApp->InvokeHelper(0x10b, DISPATCH_METHOD, VT_DISPATCH, (void*)&mailItem, params, bFilePath, NULL); outlookMailItem = new COleDispatchDriver(mailItem); //Set User Properties SetProperties(); //Set Display of Mail Item VARIANT_BOOL modal = VARIANT_FALSE; static BYTE params2[] = VTS_I4; outlookMailItem->InvokeHelper(oxf0a6,DISPATCH_METHOD,VT_EMPTY, NULL, params2, &modal); So, this is the whole for creating an email from template, but it is on outlookApp->InvokeHelper that I am having a problem. What am I doing wrong?

                R 1 Reply Last reply
                0
                • U User 2970611

                  Just to let you know that I followed what you said, but it threw an unhandled exception. Here is the code as it on screen OpenOutlookNewMessageWithMsgFile(CString filePath) //Call CreateItemFromTemplate to create new mailitem using late binding LPDISPATH mailItem static BYTE params[] = VTS_BSTR VTS_VARIANT ; BSTR bFilePath = filePath.AllocSysString(); outlookApp->InvokeHelper(0x10b, DISPATCH_METHOD, VT_DISPATCH, (void*)&mailItem, params, bFilePath, NULL); outlookMailItem = new COleDispatchDriver(mailItem); //Set User Properties SetProperties(); //Set Display of Mail Item VARIANT_BOOL modal = VARIANT_FALSE; static BYTE params2[] = VTS_I4; outlookMailItem->InvokeHelper(oxf0a6,DISPATCH_METHOD,VT_EMPTY, NULL, params2, &modal); So, this is the whole for creating an email from template, but it is on outlookApp->InvokeHelper that I am having a problem. What am I doing wrong?

                  R Offline
                  R Offline
                  Roger Broomfield
                  wrote on last edited by
                  #16

                  I believe your problem is with the last parameter to "CreateItemFromTemplate". NULL is not the correct way to pass an [in, optional] VARIANT. There is no need to convert filePath to a BSTR, presuming that "outlookApp" is indeed an COleDispatchDriver. Do cast it to an LPCTSTR, InvokeHelper expects an in param defined as a VTS_BSTR to be an LPCTSTR, MFC's implementation of COleDispathDrvier will do the BSTR conversion for you inside the InvokeHelper call.

                  OpenOutlookNewMessageWithMsgFile(CString filePath)
                  {
                  COleVariant varOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
                  LPDISPATCH mailItem;
                  static BYTE params [] = VTS_BSTR VTS_VARIANT ;

                  outlookApp->InvokeHelper(0x10b, DISPATCH\_METHOD, VT\_DISPATCH, (void\*)&mailItem, params, (LPCTSTR)filePath, &varOptional);
                  
                  U 2 Replies Last reply
                  0
                  • R Roger Broomfield

                    I believe your problem is with the last parameter to "CreateItemFromTemplate". NULL is not the correct way to pass an [in, optional] VARIANT. There is no need to convert filePath to a BSTR, presuming that "outlookApp" is indeed an COleDispatchDriver. Do cast it to an LPCTSTR, InvokeHelper expects an in param defined as a VTS_BSTR to be an LPCTSTR, MFC's implementation of COleDispathDrvier will do the BSTR conversion for you inside the InvokeHelper call.

                    OpenOutlookNewMessageWithMsgFile(CString filePath)
                    {
                    COleVariant varOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
                    LPDISPATCH mailItem;
                    static BYTE params [] = VTS_BSTR VTS_VARIANT ;

                    outlookApp->InvokeHelper(0x10b, DISPATCH\_METHOD, VT\_DISPATCH, (void\*)&mailItem, params, (LPCTSTR)filePath, &varOptional);
                    
                    U Offline
                    U Offline
                    User 2970611
                    wrote on last edited by
                    #17

                    Thank you for your reply. Because I do not have a folder for the email to be created in and wish to use the default folder inside Outlook, what parameter should I use, or should I only pass in the parameters I am using and Outlook can then interpret this?

                    1 Reply Last reply
                    0
                    • R Roger Broomfield

                      I believe your problem is with the last parameter to "CreateItemFromTemplate". NULL is not the correct way to pass an [in, optional] VARIANT. There is no need to convert filePath to a BSTR, presuming that "outlookApp" is indeed an COleDispatchDriver. Do cast it to an LPCTSTR, InvokeHelper expects an in param defined as a VTS_BSTR to be an LPCTSTR, MFC's implementation of COleDispathDrvier will do the BSTR conversion for you inside the InvokeHelper call.

                      OpenOutlookNewMessageWithMsgFile(CString filePath)
                      {
                      COleVariant varOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
                      LPDISPATCH mailItem;
                      static BYTE params [] = VTS_BSTR VTS_VARIANT ;

                      outlookApp->InvokeHelper(0x10b, DISPATCH\_METHOD, VT\_DISPATCH, (void\*)&mailItem, params, (LPCTSTR)filePath, &varOptional);
                      
                      U Offline
                      U Offline
                      User 2970611
                      wrote on last edited by
                      #18

                      Ignore my last message - I tried your solution and it worked! Thanks for your help!

                      1 Reply Last reply
                      0
                      Reply
                      • Reply as topic
                      Log in to reply
                      • Oldest to Newest
                      • Newest to Oldest
                      • Most Votes


                      • Login

                      • Don't have an account? Register

                      • Login or register to search.
                      • First post
                        Last post
                      0
                      • Categories
                      • Recent
                      • Tags
                      • Popular
                      • World
                      • Users
                      • Groups