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 です。次のように16進数に変換しました。

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

エラーの診断に苦労している大きな理由は、1 つのショートカットを使いすぎたためです。IDispatch::Invoke() のpExcepInfo引数に NULL を渡しています。これは IDispatch で問題ありません。基本的には、「例外について知っていることをわざわざ言わないでください。エラー コードから自分で分類します」という意味です。エラーのテキストによる説明や、それを文書化したヘルプ ファイルなどの便利な情報を見逃すことになります。可能な場合は。この質問をするときに、この種の近道を取りたくないのは明らかです。

とにかく、例外コードから問題をリバースエンジニアリングすることはできます。機能 0x0a は OLE オートメーション アプリ用に予約されており、エラー コードはアプリ固有のものです。「Word error 5153」で 0x1421 になります。これを Google クエリに入力すると、2 回目のヒットで、エラー 5153 の意味を理解している誰かへのリンクが表示されます。

他の誰かが開いたファイルを上書きしようとしています。非常に一般的な事故。

コードを修正します。人間が対処できるように、エラーの説明を人間に見せたいと思うでしょう。

于 2013-04-24T14:00:26.110 に答える
2

「 HR Plus」ツール0x800a1421からの情報:

  • エラーの種類: OLE HRESULT
  • エラー ファシリティ: FACILITY_CONTROL0x0000000A
  • 重大度: SEVERITY_ERROR0x00000001
  • コード:0x00001421

0x00001421Error Lookup」ツール からの情報: Control ID not found .

于 2013-04-24T10:19:43.973 に答える