无法从 winword 文档获取超链接:类型不匹配
Cannot get hyperlink from winword document: TYPE MISMATCH
我的 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 时,像这样的代码没有问题。
有人能帮帮我吗?
终于知道了。有多少 collections 有 office 应用程序,有多少方法可以迭代它们。在这里我们可以像下面那样做,手动分配 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
}
我的 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 时,像这样的代码没有问题。
有人能帮帮我吗?
终于知道了。有多少 collections 有 office 应用程序,有多少方法可以迭代它们。在这里我们可以像下面那样做,手动分配 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
}