0

我在我的 MS Office 的 COM 加载项中有以下代码,用于遍历 winword 文档中的所有超链接,然后解析它们:

...
HRESULT hr;
ULONG nRet;

CComQIPtr<MSWORD::Hyperlinks> hylinks = doc->Hyperlinks; // CComQIPtr<_Document> doc
ATLASSERT(hylinks);

IEnumVARIANTPtr pEnum = hylinks->Get_NewEnum(); 

for (int i = 1; i <= hylinks->Count; i++)
{
    VARIANT v = {};
    hr = pEnum->Next(1, &v, &nRet);
    if (FAILED(hr)) continue;

    CComQIPtr<MSWORD::Hyperlink> link;
    ATLASSERT(link);

    hr = hylinks->raw_Item(&v, &link);
    if (FAILED(hr)) continue;
    ...
    // parse hyperlink's address
}
...

调用 raw_Item() 时的结果 (hr) 为 80020005 (DISP_E_TYPEMISMATCH))。当我浏览 Shapes 时,这样的代码没有问题。

有人可以帮助我吗?

4

1 回答 1

0

终于,发现了。有多少收藏有办公应用,有多少迭代它们的方法。在这里我们可以这样做,手动分配类型 VARIANT 的索引,而不是使用枚举器:

CComQIPtr<MSWORD::Hyperlinks> hylinks = doc->Hyperlinks;  // CComQIPtr<_Document> doc
ATLASSERT(hylinks);

for (int i = 1; i <= hylinks->Count; i++)
{
    VARIANT ind;
    ind.iVal = i;
    ind.vt = VT_I2;

    CComQIPtr<MSWORD::Hyperlink> link;
    ATLASSERT(link);
    link = hylinks->Item(&ind);
    
    // do your magic
}
于 2020-10-20T08:28:44.370 回答