【问题标题】:Meaning of a numerical ErrorMessage数字 ErrorMessage 的含义
【发布时间】:2013-06-17 15:52:33
【问题描述】:

我正在尝试与 OEM 库进行交互。一切都在一台计算机上运行,​​但我在另一台计算机上遇到了很多问题。

我的代码抛出了 COM 异常,但我无法弄清楚没有 ErrorMessage(); 的错误代码的含义

代码

#include "stdafx.h"
#include <afx.h>
#include <iostream>
using namespace std;
#import "MTBApi.tlb" named_guids //raw_interfaces_only
using namespace MTBApi; 
void DisplayError(_com_error* e)
{
    CString message;
    // if it is an application error thrown by .NET
    if (e->Error() >= 0x80041000)
    {
        IErrorInfo* info;
        BSTR msg;
        info = e->ErrorInfo();
        info->GetDescription(&msg);
        info->Release();
        message = CString(msg);
    }
    // other com errors
    else
    {
        message = e->ErrorMessage();
    }
    cout << "MTB Error: " <<  message <<":"<<(unsigned int) e->Error()<<  endl;
}
int main(int argc, char **argv)
{
    for (int i = 0 ; i < 4 ; i++)
    {
    IMTBConnectionPtr m_MTBConnection;
    try
    {
        cout <<"1" << endl;
        HRESULT a = CoInitializeEx(NULL,COINIT_SPEED_OVER_MEMORY);
        cout <<"2" << endl;
        m_MTBConnection = IMTBConnectionPtr(CLSID_MTBConnection);
        cout <<"3" << endl;
        m_MTBConnection->Close();
        cout <<"4" << endl;
        CoUninitialize();
        cout <<"5" << endl;
    }
    catch(_com_error e)
    {
        DisplayError(&e);
    }
    cout << endl;
    }
}

运行时输出

1
2
MTB Error: 00000000002205F8:2147746132

1
2
MTB Error: 00000000002205F8:2147746132

1
2
MTB Error: 00000000002205F8:2147746132

1
2
MTB Error: 00000000002205F8:2147746132

Dependency Walker 的详细输出

http://pastebin.com/7Y33z3Pj

【问题讨论】:

    标签: c++ windows visual-studio-2012 com atl


    【解决方案1】:
    cout << "MTB Error: " <<  message <<":"<<(unsigned int) e->Error()<<  endl;
    

    cout 不太擅长显示 Unicode 字符串,它只是显示字符串指针值。当然没用,请改用wcout。并倾向于以十六进制显示错误代码。 0x80040154 是一个非常常见的 COM 错误,“类未注册”。已经有数以千计的问题,您只需要正确注册 COM 服务器即可。如果您不知道该怎么做,请询问供应商或作者。

    【讨论】:

      【解决方案2】:

      00000000002205F8 看起来像一个内存指针。您将CString 传递给cout,它只接受char*std::string 作为字符串值。也许CString 包含一个未正确转换为 Ansi 的 Unicode 字符串。此外,当调用IErrorInfo::GetDescription() 时,您正在泄漏返回的BSTR。使用完毕后,您需要使用SysFreeString() 释放它。

      错误代码2147746132(十六进制0x80040154)是严重性=FAIL,设施=FACILITY_ITF,代码=340。 FACILITY_ITF 通常表示错误代码是失败的接口定义的自定义错误代码。但在这种情况下,0x80040154 也是标准错误代码:REGDB_E_CLASSNOTREG

      【讨论】:

        【解决方案3】:

        如果您的问题是纠正您遇到的错误,那么 然后问题就像@Remy 指出的那样,您的 com 程序集没有在您当前正在执行程序的机器上注册,而不是在它注册的另一台机器上。通过在命令提示符下运行以下命令来注册程序集(例如 C:\ 驱动器中的 COMAssembly.dll)。

            regsvr32 c:\COMAssembly.dll
        

        如果是 C++ com 程序集,如果是 C# 程序集,则使用命令注册它

            regasm c:\COMAssembly.dll 
        

        (regasm 可以在 VS 命令提示符下运行,否则如果您在普通命令提示符下运行,则必须先调用 vsvars32.bat 然后调用 regasm)

        【讨论】:

        • 你会让 OP 遇到麻烦。关于正确注册有许多微妙的细节,包括使用 正确 版本的 Regsvr32,确保您运行提升并提供正确的 Regasm 命令行选项。如果您打算涵盖详细信息,请仅发布此类建议。一般来说,任何使用 COM 服务器的人都需要供应商的部署说明。
        • @Hans:是的,我同意。还取决于在运行时 32 位应用程序访问 32 位 com dll 和 64 位应用程序访问 64 位 com dll。
        猜你喜欢
        • 1970-01-01
        • 2020-09-05
        • 2017-08-19
        • 2018-03-01
        • 2019-12-18
        • 2021-03-03
        • 2020-04-22
        • 1970-01-01
        • 2016-04-24
        相关资源
        最近更新 更多