STDMETHODIMP CDsoFramerControl::CreateNew(BSTR ProgId)
{
HRESULT hr;
CLSID clsid;
RECT rcPlace;
HCURSOR hCur; // Check the string, and get the CLSID...
if (!(ProgId) || (SysStringLen(ProgId) == 0))
return E_INVALIDARG; if (FAILED(CLSIDFromProgID(ProgId, &clsid)))
return ProvideErrorInfo(DSO_E_INVALIDPROGID); // Make sure any open document is closed first...
if ((m_pDocObjFrame) && FAILED(hr = Close()))
return hr; // Let's make a doc frame for ourselves...
m_pDocObjFrame = new CDsoDocObject();
if (!(m_pDocObjFrame)) return E_OUTOFMEMORY; // Start a wait operation to notify user...
hCur = SetCursor(LoadCursor(NULL, IDC_WAIT));
GetSizeRectAfterBorder(&rcPlace); // Init the doc site...
if (SUCCEEDED(hr = m_pDocObjFrame->InitializeNewInstance(m_hwnd, 
&rcPlace, (IOleCommandTarget*)&(m_xOleCommandTarget))))
{
__try
{
  // Create a new doc object and IP activate...
hr = m_pDocObjFrame->CreateDocObject(clsid);
if (SUCCEEDED(hr))
{
if (!m_fShowToolbars)
m_pDocObjFrame->OnNotifyChangeToolState(FALSE); hr = m_pDocObjFrame->IPActivateView();
}
}
__except(EvalException(GetExceptionCode()))
{
hr = E_WIN32_ACCESSVIOLATION;
}
} // Force a close if an error occurred...
if (FAILED(hr))
{
m_fFreezeEvents = TRUE;
Close();
m_fFreezeEvents = FALSE; hr = ProvideErrorInfo(hr);
}
else if ((m_dispEvents) && !(m_fFreezeEvents))
{
VARIANT rgargs[2]; 
DISPPARAMS dparms = {rgargs, NULL, 2, 0};
memset(rgargs, 0, sizeof(VARIANT) * 2);  // Fire the OnDocumentOpened event...
rgargs[0].vt = VT_DISPATCH;
get_ActiveDocument(&(rgargs[0].pdispVal));
rgargs[1].vt = VT_BSTR; rgargs[1].bstrVal = NULL;
AutoDispInvoke(m_dispEvents, NULL, DSOF_DISPID_DOCOPEN, 0, 2, rgargs, NULL); VariantClear(&rgargs[0]);
    
     // Ensure we are active control...
        Activate();     // Redraw the caption as needed...
        RedrawCaption();
    } SetCursor(hCur);
return hr;
}

解决方案 »

  1.   

    我也遇到了这个问题, 不过我显示的是英文
    "Cannot use __try in functions that require object unwinding"
    具体情况我也想问问人家, 但我发现只要在__try{}__finally{}之间出现
    构造一个对象实例就会有这个消息产生, 相反地, 在这两句之间出现释放
    资源的函数或代码,则不会有此信息, 很奇怪VC!
    在Delphi和BCB中, 我都没被这个问题难倒过, 因为在Delphi(BCB)里无论
    该语句之间存在什么东西, 它们都可以正常运行, 没有任何困扰.