gpt4 book ai didi

c++ - Outlook - 从显示名称获取电子邮件地址。适用于 Python,不适用于 C

转载 作者:行者123 更新时间:2023-11-30 17:09:37 27 4
gpt4 key购买 nike

我正在尝试将一些代码从 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)

它基本上是 VBA code on MSDN 的 python 化版本.

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

到目前为止我在 C 语言中拥有的内容。 outlookapp 已使用 CoCreateInstance() 成功初始化。

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 Outlook\n");

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: %x\n", 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 CreateRecipient()”printf 消息中终止,错误为 0x800706F4,对应于“空引用指针已传递到 stub 。”

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%08lx\n",
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);

关于c++ - Outlook - 从显示名称获取电子邮件地址。适用于 Python,不适用于 C,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33216138/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com