0

我正在尝试与 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

4

3 回答 3

2
cout << "MTB Error: " <<  message <<":"<<(unsigned int) e->Error()<<  endl;

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

于 2013-06-20T17:22:59.670 回答
1

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

    regsvr32 c:\COMAssembly.dll

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

    regasm c:\COMAssembly.dll 

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

于 2013-06-20T17:44:20.863 回答
1

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

错误代码2147746132(十六进制0x80040154)为 Severity=FAIL、Facility=FACILITY_ITF、Code=340。FACILITY_ITF 通常表示错误代码是失败的接口定义的自定义错误代码。但在这种情况下,0x80040154也是一个标准错误代码:REGDB_E_CLASSNOTREG.

于 2013-06-20T17:23:40.573 回答