4

我有一个用 C++ 编写的 dll。它的主要目的是通过 OLE 调用 Word 上的方法。我尝试调用一个方法“SaveAs”:

HRESULT hr;
szFunction = OLESTR("SaveAs");
    hr = doc->GetIDsOfNames(IID_NULL, &szFunction, 1, 
            LOCALE_USER_DEFAULT, 
            &dispid_Cap);
    hr = doc->Invoke(dispid_Cap, IID_NULL, 
            LOCALE_USER_DEFAULT, DISPATCH_METHOD, 
            &dpCap, NULL, NULL, NULL);

它失败了,我不知道为什么。hr 的值为 -2146823135。我将它转换为十六进制,如下所示:

sprintf(hex_buff, "%x", (unsigned int)hr);

这给了0x800a1421

我试图找出这段代码对这个程序的含义:http: //www.microsoft.com/en-us/download/details.aspx?id=985 但结果是:

as an HRESULT: Severity: FAILURE (1), Facility: 0xa, Code 0x1421
NOT FOUND: 800a1421

这是什么意思?我应该如何继续找出我的方法失败的原因?

4

2 回答 2

5

您无法诊断错误的一个重要原因是您使用了太多的快捷方式。您正在为 IDispatch::Invoke() 的pExcepInfo参数传递 NULL。这对 IDispatch 来说没问题,它基本上意味着“不要费心告诉我你对异常的了解,我会自己从错误代码中整理出来”。您将错过诸如错误的文本描述和记录错误的帮助文件之类的好东西。如果可供使用的话。当你问这个问题时,显然你不想走这种捷径。

无论如何,您仍然可以从异常代码中对问题进行逆向工程。设施 0x0a 为 OLE 自动化应用程序保留,错误代码特定于应用程序。在“Word 错误 5153”中变为 0x1421。把它放在谷歌查询中,第二次点击会给你一个链接,指向已经弄清楚错误 5153 意味着什么的人。

您正试图覆盖其他人打开的文件。很常见的事故。

修复您的代码,您需要向人类显示错误描述,以便他们处理它。

于 2013-04-24T14:00:26.110 回答
2

0x800a1421来自“ HR Plus ”工具的信息:

  • 错误类型:OLE HRESULT
  • 错误设施:FACILITY_CONTROL0x0000000A
  • 严重性:SEVERITY_ERROR0x00000001
  • 代码:0x00001421

以及0x00001421来自“错误查找”工具: 未找到控件 ID

于 2013-04-24T10:19:43.973 回答