我有一个用 C++ 编写的 dll。它的主要目的是通过 OLE 调用 Word 上的方法。我尝试调用一个方法“另存为”:
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);
Run Code Online (Sandbox Code Playgroud)
它失败了,我不知道为什么。hr 的值为 -2146823135。我把它转换成这样的十六进制:
sprintf(hex_buff, "%x", (unsigned int)hr);
Run Code Online (Sandbox Code Playgroud)
这给了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
Run Code Online (Sandbox Code Playgroud)
这是什么意思?我应该如何继续找出我的方法失败的原因?
您在诊断错误时遇到困难的一个重要原因是因为您使用了太多捷径。您正在为 IDispatch::Invoke() 的pExcepInfo参数传递 NULL 。这对 IDispatch 没问题,它基本上意味着“不要费心告诉我你对异常的了解,我会自己从错误代码中找出来”。您将错过诸如错误的文本描述和记录错误的帮助文件之类的好东西。如果可供使用的话。很明显,当你问这个问题时,你不想走这种捷径。
Anyhoo,您仍然可以从异常代码中对问题进行逆向工程。设施 0x0a 是为 OLE 自动化应用程序保留的,错误代码特定于应用程序。在“Word 错误 5153”中变成 0x1421。把它放在谷歌查询中,第二次点击会给你一个链接,指向已经弄清楚错误 5153 意味着什么的人。
您正试图覆盖其他人已打开的文件。很常见的事故。
修复您的代码,您需要向人显示错误描述,以便他们可以处理它。