Meaning of a numerical ErrorMessage

0

I am trying to interface with an OEM library. Everything worked on one computer but I am getting lots of problems on another computer.

I the code is throwing a COM exception but I can't figure out the meaning of a error code that doesn't have a ErrorMessage();

The code

#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;
    }
}

The runtime output

1
2
MTB Error: 00000000002205F8:2147746132

1
2
MTB Error: 00000000002205F8:2147746132

1
2
MTB Error: 00000000002205F8:2147746132

1
2
MTB Error: 00000000002205F8:2147746132

Rather Verbose Output from Dependency Walker

http://pastebin.com/7Y33z3Pj

c++
windows
visual-studio-2012
com
atl
asked on Stack Overflow Jun 20, 2013 by Mikhail

3 Answers

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

cout isn't very good at displaying Unicode strings, it merely displays the string pointer value. Not useful of course, use wcout instead. And favor displaying the error code in hex. 0x80040154 is a very common COM error, "Class not registered". Thousands of questions about it already, you just need to get the COM server registered properly. Ask the vendor or author if you don't know how to do that.

answered on Stack Overflow Jun 20, 2013 by Hans Passant • edited Jun 20, 2013 by Hans Passant
1

00000000002205F8 looks like a memory pointer. You are passing a CString to cout, which only accepts char* or std::string for string values. Maybe the CString contains a Unicode string that is not being converted to Ansi correctly. Also, when calling IErrorInfo::GetDescription(), you are leaking the returned BSTR. You need to free it with SysFreeString() when you are done using it.

Error code 2147746132 (hex 0x80040154) is Severity=FAIL, Facility=FACILITY_ITF, Code=340. FACILITY_ITF typically means the error code is a custom error code defined by the interface that failed. But in this case, 0x80040154 is also a standard error code: REGDB_E_CLASSNOTREG.

answered on Stack Overflow Jun 20, 2013 by Remy Lebeau
1

If your problem is to rectify the error which you are getting then then issue is as @Remy pointed out , your com assembly is not registered in the machine you are currently executing your program rather in the other machine it got registered. Register the assembly (for eg COMAssembly.dll which is in C:\ drive) by running the following command in command prompt.

    regsvr32 c:\COMAssembly.dll

if its a C++ com assembly , if its a C# assembly register it by using command

    regasm c:\COMAssembly.dll 

(where regasm can be run in a VS command prompt , otherwise if you are running in normal command prompt then you have to first call vsvars32.bat then call regasm)

answered on Stack Overflow Jun 20, 2013 by srsyogesh

User contributions licensed under CC BY-SA 3.0