Outlook -从显示名称获取电子邮件地址.可以在Python中工作,而不是C

Outlook - get email address from Display Name. Works in Python, not C

本文关键字:工作 Python 显示 电子邮件地址 获取 Outlook      更新时间:2023-10-16

我正试图将一些代码从Python转换为C和OLE。代码正在从Outlook显示名称中获取电子邮件地址。

Python代码的工作原理如下:
    recipient = self._outlook.Session.CreateRecipient(name)
    recipient.Resolve()
    if self._first:
        print(inspect.getmembers(recipient))
        self._first = False
        print(recipient.Resolved)
        print(recipient.AddressEntry)
        if 'EX' == recipient.AddressEntry.Type:
            exchange_user = recipient.AddressEntry.GetExchangeUser()
            email = exchange_user.PrimarySmtpAddress
        elif 'SMTP' == recipient.AddressEntry.Type:
            email = recipient.AddressEntry.Address
        print(email)

它基本上是MSDN上VBA代码的python化版本。

然而,在C和OLE中,我只是不明白它,我只能在MSDN和其他论坛上找到c#, VBA和c++与MFC示例(我不感兴趣),以及使用专有框架的建议。

到目前为止我在C中所拥有的。outlookappCoCreateInstance()初始化成功

IDispatch *pNS = NULL;
{
    VARIANT x;
    x.vt = VT_BSTR;
    x.bstrVal = SysAllocString(L"MAPI");
    VARIANT result;
    VariantInit(&result);
    AutoWrap(DISPATCH_METHOD, &result, outlookapp, L"GetNamespace", 1, x);
    pNS = result.pdispVal;
    SysFreeString(x.bstrVal);
    VariantClear(&x);
}

// Log on by using a dialog box to choose the profile.
{
    VARIANT vtShowDialog;
    vtShowDialog.vt = VT_BOOL;
    vtShowDialog.boolVal = VARIANT_TRUE;
    VARIANT vtNewSession;
    vtNewSession.vt = VT_BOOL;
    vtNewSession.boolVal = VARIANT_TRUE;
    if (FAILED(AutoWrap(DISPATCH_METHOD, NULL, pNS, L"Logon", 4, vtNewSession,
        vtShowDialog, vtMissing, vtMissing))) {
        printf("Logon failed.n"); Sleep(15000); ExitProcess(1);
    }
}
printf("Done logging in to Outlookn");
IDispatch *recipient = NULL;
{
    VARIANT x;
    x.vt = VT_BSTR;
    x.bstrVal = SysAllocString(L"John Doe");
    VARIANT result;
    VariantInit(&result);
    HRESULT hr = AutoWrap(DISPATCH_METHOD, &result, pNS, L"CreateRecipient", 1, &x);
    if (FAILED(hr)) {
        printf("Can not CreateRecipient(), error: %xn", hr); Sleep(60000); ExitProcess(1);
    }
    recipient = result.pdispVal;
}
{
    VARIANT result;
    VariantInit(&result);
    HRESULT hr = AutoWrap(DISPATCH_METHOD, &result, recipient, L"Resolve", 0);
    if (FAILED(hr)) {
        printf("Can not call Resolve()n");
        Sleep(3000); ExitProcess(1);
    }
}

代码在"Can not createrreceiver()"printf消息中死亡,错误0x800706F4对应于"null引用指针被传递给存根"。

AutoWrap也写自己的消息:IDispatch::Invoke("CreateRecipient"=0000210a) failed w/err 0x800706f4

它来自AutoWrap中的代码:

// Make the call 
hr = pDisp->Invoke(
    dispID,
    IID_NULL,
    LOCALE_SYSTEM_DEFAULT,
    autoType,
    &dp,
    pvResult,
    NULL,
    NULL
); 
if (FAILED(hr))  
{ 
    wprintf(L"IDispatch::Invoke("%s"=%08lx) failed w/err 0x%08lxn",  
        ptName, dispID, hr); 
    return hr; 
} 

最终目标是将地址数据从Outlook馈送到Excel中,并且我已经使用OLE工作的Excel自动化。如果有任何想法,我真的很高兴——我真的试图找到有关这方面的信息,但没有找到多少关于Outlook在这一层面上是如何工作的。

正如Hans Passant所看到的,我只是在这一行输入了&x而不是x:

HRESULT hr = AutoWrap(DISPATCH_METHOD, &result, pNS, L"CreateRecipient", 1, &x);

:

HRESULT hr = AutoWrap(DISPATCH_METHOD, &result, pNS, L"CreateRecipient", 1, x);