如何从非托管VC ++代码启动Outlook?

时间:2015-06-19 13:03:28

标签: visual-c++ com mfc outlook ole

长篇故事: 我使用来自http://www.codeproject.com/Articles/10881/MAPIEx-Extended-MAPI-Wrapper的扩展Mapi库来管理相当多的任务。问题是,如果Outlook没有运行,它不会发送实际的消息,它会将消息存储在发件箱中,并且通过库函数发送它们需要使用我不具备的配置文件进行登录。

短篇小说: 我需要使用其默认的profault配置文件启动已安装的Outlook(已经检查过),以便它可以在其发件箱中发送消息(如果有的话)。

在C#中有很多鼠标和光滑的解决方案,2到6行Code,但不幸的是我必须坚持使用非托管VC ++。

首先尝试: 我已经使用WIN32 OLE接口和Microsoft Word完成了很多工作。这次我只希望程序启动,如果尚未运行的话。 所以我试过

// Outlook Test
CoInitialize(NULL);
CLSID clsid;
HRESULT hr = CLSIDFromProgID(L"Outlook.Application", &clsid);

IDispatch *pOApp;
    if(SUCCEEDED(hr))
{
    IUnknown *pUnk;
    hr = GetActiveObject(clsid, NULL, (IUnknown**)&pUnk);
    if(FAILED(hr)) 
    {
        hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, 
                               IID_IDispatch, (void **)&pOApp);
        if(FAILED(hr)) pOApp=NULL;
    }
    else if(pUnk) 
    {
        hr = pUnk->QueryInterface(IID_IDispatch, (void **)&pOApp);
        if(FAILED(hr)) pOApp=NULL;
    }
}

但仍然缺少某些东西。

我非常感谢您提供的任何帮助

2 个答案:

答案 0 :(得分:1)

您可以考虑在非托管C ++中使用原始扩展MAPI代码,甚至不使Outlook自动化。此外,在使用Outlook对象模型的情况下,您将获得Send方法触发的安全提示。您可以在Outlook "Object Model Guard" Security Issues for Developers文章中了解相关信息。

有关C ++(扩展MAPI)中的示例,请参阅How To Create a Message With an Attachment and Send It Using MAPI/VC++

答案 1 :(得分:0)

导入Outlook类型库(#import),以便您可以使用Outlook特定的接口(例如Application)。

#import "libid:00062FFF-0000-0000-C000-000000000046" rename_namespace("Outlook") raw_interfaces_only

或者你可以使用后期绑定并调用IDispatch :: GetIdsOfNames / Invoke。您可以在OutlookSpy中查看属性/方法/事件及其显示(例如,单击Outlook中OutlookSpy功能区上的“应用程序”按钮)。