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;
}
{
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;
}
解决方案 »
- vc++ 操作Excel2007
- sprintf未定义错误只出现在Release MinSize编译中,不出现在Debug编译中
- 工作线程中用PeekMessage()对实时性和稳定性有没有影响?
- 怎么样由程序向CRichEditView的派生视图类中输出数据
- 谁有 Dwg direct 库,即 OpenDWG 的升级版本?
- 请问如何才能升级?
- 如何判断 CFile 类中已有文件打开
- 关于CREATESTRUCT 这个数据结构
- 一个C语言写的词法分析程序,出现access violation错误,请各位大虾帮帮忙
- 键盘钩子问题
- 如何在程序中响应COM控件中的事件?
- _variant_t和string,或int类型怎么转换?
"Cannot use __try in functions that require object unwinding"
具体情况我也想问问人家, 但我发现只要在__try{}__finally{}之间出现
构造一个对象实例就会有这个消息产生, 相反地, 在这两句之间出现释放
资源的函数或代码,则不会有此信息, 很奇怪VC!
在Delphi和BCB中, 我都没被这个问题难倒过, 因为在Delphi(BCB)里无论
该语句之间存在什么东西, 它们都可以正常运行, 没有任何困扰.