⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 dsofauto.cpp

📁 主要用于打开office文档而使用. ole开发,
💻 CPP
📖 第 1 页 / 共 4 页
字号:
	LPWSTR    pwszAltProgId = LPWSTR_FROM_VARIANT(ProgId);
	LPWSTR    pwszUserName  = LPWSTR_FROM_VARIANT(WebUsername);
	LPWSTR    pwszPassword  = LPWSTR_FROM_VARIANT(WebPassword);
    BOOL      fOpenReadOnly = BOOL_FROM_VARIANT(ReadOnly, FALSE);
	CLSID     clsidAlt      = GUID_NULL;
	HCURSOR	  hCur;
    IUnknown* punk = NULL;

    BIND_OPTS bopts = {sizeof(BIND_OPTS), BIND_MAYBOTHERUSER, 0, 10000};

    TRACE1("CDsoFramerControl::Open(%S)\n", pwszDocument);

 // We must have either a string (file path or URL) or an object to open from...
	if (!(pwszDocument) || (*pwszDocument == L'\0'))
    {
        if (!(pwszDocument) && ((punk = PUNK_FROM_VARIANT(Document)) == NULL))
		    return E_INVALIDARG;
    }

 // If the user passed the ProgId, find the alternative CLSID for server...
	if ((pwszAltProgId) && FAILED(CLSIDFromProgID(pwszAltProgId, &clsidAlt)))
		return E_INVALIDARG;

// Cannot create object if we are not activate yet, or if in modal condition...
    if (!(m_fInPlaceActive) || (m_fModalState)) 
        return ProvideErrorInfo(DSO_E_INMODALSTATE);

 // OK. If here, all the parameters look good and it is time to try and open
 // the document object. Start by closing any existing document first...
	if ((m_pDocObjFrame) && FAILED(hr = Close()))
		return hr;

 // Make sure we are the active component for this process...
    if (FAILED(hr = Activate())) return hr;

 // Let's make a doc frame for ourselves...
	if (!(m_pDocObjFrame = CDsoDocObject::CreateInstance((IDsoDocObjectSite*)&m_xDsoDocObjectSite)))
		return E_OUTOFMEMORY;

 // If we had delayed the frame hook, we should set it up now...
    if (!(m_pHookManager) && FDelayFrameHookSet())
    {
		m_pHookManager = CDsoFrameHookManager::RegisterFramerControl(m_hwndParent, m_hwnd);
		if (!m_pHookManager) return ProvideErrorInfo(DSO_E_FRAMEHOOKFAILED);
    }

 // Start a wait operation to notify user...
	hCur = SetCursor(LoadCursor(NULL, IDC_WAIT));
    m_fInDocumentLoad = TRUE;

 // Setup the bind options based on read-only flag....
    bopts.grfMode = (STGM_TRANSACTED | STGM_SHARE_DENY_WRITE | (fOpenReadOnly ? STGM_READ : STGM_READWRITE));

	SEH_TRY

 // Normally user gives a string that is path to file...
    if (pwszDocument)
    {
	 // Check if we are opening from a URL, and load that way...
		if (LooksLikeHTTP(pwszDocument))
		{
			hr = m_pDocObjFrame->CreateFromURL(pwszDocument, clsidAlt, &bopts, pwszUserName, pwszPassword);
		}
	 // Otherwise, check if it is a local file and open that...
		else if (FFileExists(pwszDocument))
		{
			hr = m_pDocObjFrame->CreateFromFile(pwszDocument, clsidAlt, &bopts);
		}
		else hr = E_INVALIDARG;
    }
    else if (punk)
    {
     // If we have an object to load from, try loading it direct...
        hr = m_pDocObjFrame->CreateFromRunningObject(punk, NULL, &bopts);
    }
    else hr = E_UNEXPECTED; // Unhandled load type??

 // If successful, we can activate the object...
	if (SUCCEEDED(hr))
	{
        EnableDropFile(FALSE);

		if (!m_fShowToolbars)
			m_pDocObjFrame->OnNotifyChangeToolState(FALSE);

		hr = m_pDocObjFrame->IPActivateView();
	}

    SEH_EXCEPT(hr)

  // Force a close if an error occurred...
	if (FAILED(hr))
	{
		m_fFreezeEvents = TRUE;
		Close();
		m_fFreezeEvents = FALSE;
		hr = ProvideErrorInfo(hr);
	}
	else
	{
	 // Fire the OnDocumentOpened event...
		VARIANT rgargs[2];
		rgargs[0].vt = VT_DISPATCH;	get_ActiveDocument(&(rgargs[0].pdispVal));
		rgargs[1].vt = VT_BSTR;	rgargs[1].bstrVal = SysAllocString(pwszDocument);

        RaiseAutomationEvent(DSOF_DISPID_DOCOPEN, 2, rgargs);
		VariantClear(&rgargs[1]);
		VariantClear(&rgargs[0]);
    
     // Ensure we are active control...
        Activate();

     // Redraw the caption as needed...
        RedrawCaption();
	}

    m_fInDocumentLoad = FALSE;
	SetCursor(hCur);
	return hr;
}

////////////////////////////////////////////////////////////////////////
// CDsoFramerControl::Save
//
//  Saves the current object. The optional SaveAs paramter lets the same
//  function act as a SaveAs method.
//
STDMETHODIMP CDsoFramerControl::Save(VARIANT SaveAsDocument, VARIANT OverwriteExisting, VARIANT WebUsername, VARIANT WebPassword)
{
	HCURSOR	  hCur;
	HRESULT	  hr = S_FALSE;
	LPWSTR    pwszDocument = LPWSTR_FROM_VARIANT(SaveAsDocument);
	LPWSTR    pwszUserName = LPWSTR_FROM_VARIANT(WebUsername);
	LPWSTR    pwszPassword = LPWSTR_FROM_VARIANT(WebPassword);
    BOOL      fOverwrite   = BOOL_FROM_VARIANT(OverwriteExisting, FALSE);
    
    TRACE1("CDsoFramerControl::Save(%S)\n", pwszDocument);
    CHECK_NULL_RETURN(m_pDocObjFrame, ProvideErrorInfo(DSO_E_DOCUMENTNOTOPEN));

 // Cannot access object if in modal condition...
    if ((m_fModalState) || (m_fNoInteractive))
        return ProvideErrorInfo(DSO_E_INMODALSTATE);

 // If user passed a value for SaveAs, it must be a valid string...
    if (!(PARAM_IS_MISSING(&SaveAsDocument)) &&
        ((pwszDocument == NULL) || (*pwszDocument == L'\0')))
		return E_INVALIDARG;

 // Raise the BeforeDocumentSaved event to host...
    if (m_dispEvents)
    {
		VARIANT rgargs[3]; VARIANT_BOOL vtboolCancel = VARIANT_FALSE;
		rgargs[2].vt = VT_DISPATCH; get_ActiveDocument(&(rgargs[2].pdispVal));
		rgargs[1].vt = VT_BSTR; rgargs[1].bstrVal = SysAllocString(pwszDocument);
		rgargs[0].vt = (VT_BOOL | VT_BYREF); rgargs[0].pboolVal = &vtboolCancel;

        RaiseAutomationEvent(DSOF_DISPID_BDOCSAVE, 3, rgargs);
		VariantClear(&rgargs[2]);
		VariantClear(&rgargs[1]);

     // Setting Cancel param will abort the save...
        if (vtboolCancel != VARIANT_FALSE)
            return E_ABORT;
    }

 // Now do the save...
	hCur = SetCursor(LoadCursor(NULL, IDC_WAIT));

    SEH_TRY

 // Determine if they want to save to a URL...
	if ((pwszDocument) && LooksLikeHTTP(pwszDocument))
	{
		hr = m_pDocObjFrame->SaveToURL(pwszDocument, fOverwrite, pwszUserName, pwszPassword);
	}
	else if (pwszDocument)
	{
	 // Save to file (local or UNC)...
		hr = m_pDocObjFrame->SaveToFile(pwszDocument, fOverwrite);
	}
	else
	{
	 // Save back to open location...
		hr = m_pDocObjFrame->Save();
	}

    SEH_EXCEPT(hr)

 // If save was successful...
    if (SUCCEEDED(hr))
    {
     // Raise the SaveComplete event to host...
        if (m_dispEvents)
        {
		    VARIANT rgargs[3];
		    rgargs[2].vt = VT_DISPATCH; get_ActiveDocument(&(rgargs[2].pdispVal));
		    rgargs[1].vt = VT_BSTR; rgargs[1].bstrVal = SysAllocString(m_pDocObjFrame->GetSourceDocName());
		    rgargs[0].vt = VT_BSTR; rgargs[0].bstrVal = SysAllocString(m_pDocObjFrame->GetSourceName());
            RaiseAutomationEvent(DSOF_DISPID_SAVECOMPLETE, 3, rgargs);
		    VariantClear(&rgargs[2]);
		    VariantClear(&rgargs[1]);
		    VariantClear(&rgargs[0]);
        }
        
     // Redraw the caption as needed...
        RedrawCaption();
    }

	SetCursor(hCur);
	return ProvideErrorInfo(hr);
}

////////////////////////////////////////////////////////////////////////
 //CDsoFramerControl::OpenComments

 // OpenComments the current object.

STDMETHODIMP CDsoFramerControl::OpenComments()
{
	ODS("CDsoFramerControl::Close\n");
	CDsoDocObject* pdframe = m_pDocObjFrame;
	if (pdframe)
	{
		//RaiseAutomationEvent(DSOF_DISPID_DefineTools, 1, NULL);
		     // Fire the BeforeDocumentClosed event to give host chance to cancel...

		VARIANT rgargs[2]; VARIANT_BOOL vtboolCancel = VARIANT_FALSE;
		rgargs[1].vt = VT_DISPATCH; get_ActiveDocument(&(rgargs[1].pdispVal));
		rgargs[0].vt = (VT_BOOL | VT_BYREF); rgargs[0].pboolVal = &vtboolCancel;

     // Setting Cancel param should abort the close...
        RaiseAutomationEvent(DSOF_DISPID_DefineTools, 2, rgargs);
		VariantClear(&rgargs[1]);

        if (vtboolCancel != VARIANT_FALSE)
            return E_ABORT;

     // If not canceled, clear the member variable then call close on doc frame...
	    m_pDocObjFrame = NULL;

		SEH_TRY
		//pdframe->Close();
		SEH_EXCEPT_NULL
		delete pdframe;

     // Notify host that item is now closed...
        RaiseAutomationEvent(DSOF_DISPID_DefineTools, 0, NULL);
	}
	
	RedrawCaption();
    EnableDropFile(TRUE);
	return S_OK;
}


////////////////////////////////////////////////////////////////////////
// CDsoFramerControl::Close
//
//  Closes the current object.
//
STDMETHODIMP CDsoFramerControl::Close()
{
	ODS("CDsoFramerControl::Close\n");

	CDsoDocObject* pdframe = m_pDocObjFrame;
	if (pdframe)
    {
     // Fire the BeforeDocumentClosed event to give host chance to cancel...
		VARIANT rgargs[2]; VARIANT_BOOL vtboolCancel = VARIANT_FALSE;
		rgargs[1].vt = VT_DISPATCH; get_ActiveDocument(&(rgargs[1].pdispVal));
		rgargs[0].vt = (VT_BOOL | VT_BYREF); rgargs[0].pboolVal = &vtboolCancel;

     // Setting Cancel param should abort the close...
        RaiseAutomationEvent(DSOF_DISPID_BDOCCLOSE, 2, rgargs);
		VariantClear(&rgargs[1]);

        if (vtboolCancel != VARIANT_FALSE)
            return E_ABORT;

     // If not canceled, clear the member variable then call close on doc frame...
	    m_pDocObjFrame = NULL;

		SEH_TRY
		pdframe->Close();
		SEH_EXCEPT_NULL
		delete pdframe;

     // Notify host that item is now closed...
        RaiseAutomationEvent(DSOF_DISPID_DOCCLOSE, 0, NULL);
	}

 // Redraw the caption as needed...
    RedrawCaption();
    EnableDropFile(TRUE);
	return S_OK;
}


////////////////////////////////////////////////////////////////////////
// CDsoFramerControl::(put_Caption/get_Caption)
//
//  Allows you to set a custom cation for the titlebar.
//
STDMETHODIMP CDsoFramerControl::put_Caption(BSTR bstr)
{
 // Free exsiting caption (if any) and save new one (always dirties control)...
    SAFE_FREEBSTR(m_bstrCustomCaption);

 // Set the new one (if provided)...
	if ((bstr) && (SysStringLen(bstr) > 0))
		m_bstrCustomCaption = SysAllocString(bstr);

	ViewChanged();
	m_fDirty = TRUE;
	return S_OK;
}

STDMETHODIMP CDsoFramerControl::get_Caption(BSTR* pbstr)
{
	if (pbstr) *pbstr = (m_bstrCustomCaption ? 
        SysAllocString(m_bstrCustomCaption) : 
        SysAllocString(L"Office Framer Control"));
	return S_OK;
}

////////////////////////////////////////////////////////////////////////
// CDsoFramerControl::(put_Titlebar/get_Titlebar)
//
//  True/False. Should we display the titlebar or not?
//
STDMETHODIMP CDsoFramerControl::put_Titlebar(VARIANT_BOOL vbool)
{
	TRACE1("CDsoFramerControl::put_Titlebar(%d)\n", vbool);

    if (m_fModalState) // Cannot access object if in modal condition...
        return ProvideErrorInfo(DSO_E_INMODALSTATE);

	if (m_fShowTitlebar != (WORD)(BOOL)vbool)
	{
		m_fShowTitlebar = (BOOL)vbool;
		m_fDirty = TRUE;
		OnResize();
		ViewChanged();
	}
	return S_OK;
}

STDMETHODIMP CDsoFramerControl::get_Titlebar(VARIANT_BOOL* pbool)
{
	ODS("CDsoFramerControl::get_Titlebar\n");
	if (pbool) *pbool = (m_fShowTitlebar ? VARIANT_TRUE : VARIANT_FALSE);
	return S_OK;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -