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;

coutUnicode 文字列を表示するのはあまり得意ではありません。文字列ポインターの値を表示するだけです。もちろん役に立たないので、wcout代わりに使用してください。また、エラー コードを 16 進数で表示することをお勧めします。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メモリポインタのように見えます。文字列値のorのみを受け入れるCStringtoを渡しています。Ansiに正しく変換されていない Unicode 文字列が含まれている可能性があります。また、 を呼び出すと、返された がリークされます。使い終わったら解放する必要があります。coutchar*std::stringCStringIErrorInfo::GetDescription()BSTRSysFreeString()

エラー コード2147746132(16 進数0x80040154) は、Severity=FAIL、Facility=FACILITY_ITF、Code=340 です。通常、FACILITY_ITF は、エラー コードが、失敗したインターフェイスによって定義されたカスタム エラー コードであることを意味します。ただし、この場合、0x80040154も標準エラー コードです: REGDB_E_CLASSNOTREG.

于 2013-06-20T17:23:40.573 に答える