vc ++中未处理的异常 - HRESULT失败

时间:2015-01-08 02:49:57

标签: c++ visual-c++ hresult

我知道VC ++ 6.0是一种非常古老的语言,但我没有选择,我只是维护一个现有的程序,我遇到了这个错误

Unhandled exception in Assess.exe (KERNELBASE.DLL): 0xE06D7363: Microsoft C++ Exception

这是我的代码

 HRESULT hr = CoInitialize(NULL);

// Create the interface pointer.
IModulePtr pI(__uuidof(RPTAModuleInterface)); //the error is here

调试并使用f11后,程序转到COMIP.H,这是代码

explicit _com_ptr_t(const CLSID& clsid, IUnknown* pOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) throw(_com_error)
    : m_pInterface(NULL)
{
    HRESULT hr = CreateInstance(clsid, pOuter, dwClsContext); 
    //the program goes to CreateInstance Method

    if (FAILED(hr) && (hr != E_NOINTERFACE)) {
        _com_issue_error(hr); 
        //the program goes here and show the error msg
    }
}

这是CreateInstance

HRESULT CreateInstance(const CLSID& rclsid, IUnknown* pOuter = NULL, DWORD dwClsContext = CLSCTX_ALL) throw()
{
    HRESULT hr;

    _Release();

    if (dwClsContext & (CLSCTX_LOCAL_SERVER | CLSCTX_REMOTE_SERVER)) {
        IUnknown* pIUnknown;

        hr = CoCreateInstance(rclsid, pOuter, dwClsContext, __uuidof(IUnknown), reinterpret_cast<void**>(&pIUnknown));

        if (FAILED(hr)) { 
           // the program goes here and return the hr
            return hr;
        }

        hr = OleRun(pIUnknown);

        if (SUCCEEDED(hr)) {
            hr = pIUnknown->QueryInterface(GetIID(), reinterpret_cast<void**>(&m_pInterface));
        }

        pIUnknown->Release();
    }
    else {
        hr = CoCreateInstance(rclsid, pOuter, dwClsContext, GetIID(), reinterpret_cast<void**>(&m_pInterface));
    }

    return hr;
}

我不知道这里的错误是什么,这是头文件,我认为这里没有错误。任何想法如何解决这个问题?

更新

RPTAInterface.tlh我看到了RPTAModuleInterface

的声明
struct /* coclass */ RPTAModuleInterface;

struct __declspec(uuid("d6134a6a-a08e-36ab-a4c0-c03c35aad201"))
RPTAModuleInterface;

1 个答案:

答案 0 :(得分:3)

_com_issue_error()会抛出您未捕获的_com_error异常。您需要将代码包装在try/catch中,例如:

try
{
    IModulePtr pI(__uuidof(RPTAModuleInterface));
    // ... 
}
catch(const _com_error& e)
{
    // e.Error() will return the HRESULT value
    // ...
}

显然CoCreateInstance()失败了。机器上可能没有安装库来注册RPTAModuleInterface的CoClass,因此无法创建它。但是,您必须查看实际HRESULT,以确定CoCreateInstance()失败的原因。