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

📄 dsofauto.cpp

📁 用于在线office文档编辑的控件。可以在线新建文档、修改文档
💻 CPP
📖 第 1 页 / 共 3 页
字号:
			// 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) || LooksLikeFTP(pwszDocument))
				{
					char cPath[MAX_PATH];
					::GetTempPath(MAX_PATH, cPath);
					strcat(cPath,"DSOWebOffice");
					if (CreateDirectory(cPath, NULL) || GetLastError() == ERROR_ALREADY_EXISTS)
					{
						lstrcat(cPath, "\\");
					}
					::GetTempFileName(cPath, "", 0, cPath);
					strcat(cPath,"Test.doc");
					//Set ReadOnly
					if(fOpenReadOnly){
//						::SetFileAttributes(cPath,FILE_ATTRIBUTE_READONLY);
					}
					URLDownloadFile(NULL, pwszDocument, A2W(cPath));
					hr = m_pDocObjFrame->LoadStorageFromFile(A2W(cPath), 
						clsidAlt, fOpenReadOnly);
					//				hr = m_pDocObjFrame->LoadStorageFromURL(pwszDocument,
					//                      clsidAlt, fOpenReadOnly, pwszUserName, pwszPassword);
				}
				// Otherwise, check if it is a local file and open that...
				else if (FFileExists(pwszDocument))
				{
/*					DWORD dwAttri = 0;
					if(fOpenReadOnly){
						dwAttri = ::GetFileAttributes(pwszDocument);
						if(!(dwAttri & FILE_ATTRIBUTE_READONLY)){
							::SetFileAttributes(cPath,FILE_ATTRIBUTE_READONLY);
						}
					}*/
					hr = m_pDocObjFrame->LoadStorageFromFile(pwszDocument, 
						clsidAlt, fOpenReadOnly);

				}
				else hr = E_INVALIDARG;
			}
			else if (punk)
			{
				// If we have an object to load from, try loading it direct...
				hr = m_pDocObjFrame->LoadFromAutomationObject(punk, clsidAlt, fOpenReadOnly);
			}else{
				m_nOriginalFileType = FILE_TYPE_NULL;
				hr = E_UNEXPECTED; // Unhandled load type??
			}
			
			// If successful, we can activate the object...
			if (SUCCEEDED(hr))
			{
				if (!m_fShowToolbars)
					m_pDocObjFrame->OnNotifyChangeToolState(FALSE);
				
				hr = m_pDocObjFrame->IPActivateView();
			}else{
				m_nOriginalFileType = FILE_TYPE_NULL;
			}
			BSTR  dddd;
			StringFromCLSID(m_pDocObjFrame->m_clsidObject,&dddd);
			
			char * pstrNameTemp1 = NULL;
			LPWSTR  pstrNameTemp2;
			if ((dddd) && (SysStringLen(dddd) > 0)){
				pstrNameTemp2 = SysAllocString(dddd);
				pstrNameTemp1 = DsoConvertToMBCS(pstrNameTemp2);
			}
			
			if(0 == strcmp(pstrNameTemp1,"{00020906-0000-0000-C000-000000000046}"))
				m_nOriginalFileType =  FILE_TYPE_WORD;
			else if(0 == strcmp(pstrNameTemp1,"{00020820-0000-0000-C000-000000000046}"))
				m_nOriginalFileType =  FILE_TYPE_EXCEL;
			else if(0 == strcmp(pstrNameTemp1,"{64818D10-4F9B-11CF-86EA-00AA00B929E8}"))
				m_nOriginalFileType = FILE_TYPE_PPT;
			else
				m_nOriginalFileType = FILE_TYPE_UNK;
 
			DsoMemFree((void*)(pstrNameTemp1));
			
		}catch(...){}
		//      SEH_EXCEPT(hr)
	}

  // 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))
	{
	 // 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);

		DsoDispatchInvoke(m_dispEvents, NULL, DSOF_DISPID_DOCOPEN, 0, 2, rgargs, NULL);
		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) && !(m_fFreezeEvents))
    {
		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;

        m_fFreezeEvents = TRUE; // Don't allow re-entrany during Save..

		DsoDispatchInvoke(m_dispEvents, NULL, DSOF_DISPID_BDOCSAVE, 0, 3, rgargs, NULL);
		VariantClear(&rgargs[2]);
		VariantClear(&rgargs[1]);

        m_fFreezeEvents = FALSE;

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

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

	try{

 // Determine if they want to save to a URL...
	if ((pwszDocument) && LooksLikeHTTP(pwszDocument))
	{
		hr = m_pDocObjFrame->SaveStorageToURL(pwszDocument, fOverwrite, pwszUserName, pwszPassword);
	}
	else if (pwszDocument)
	{
	 // Save to file (local or UNC)...
		if(m_nOriginalFileType == FILE_TYPE_WORD || m_nOriginalFileType ==  FILE_TYPE_EXCEL){
			long l = 0;
			if(m_nOriginalFileType ==  FILE_TYPE_EXCEL)
			    l = -4143;
			hr = SaveAs(COleVariant((LPCTSTR)pwszDocument),COleVariant((long)l),&l);
		}else{
			hr = m_pDocObjFrame->SaveStorageToFile(pwszDocument, fOverwrite);
		}
	}
	else
	{
	 // Save back to open location...
		hr = m_pDocObjFrame->SaveDefault();
	}
	}catch(...){} 

 // Redraw the caption as needed...
    if (SUCCEEDED(hr)) RedrawCaption();

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

////////////////////////////////////////////////////////////////////////
// CDsoFramerControl::Close
//
//  Closes the current object.
//
#include <atlbase.h>
STDMETHODIMP CDsoFramerControl::Close()
{
 
	long lll = 0;
	char cTemp[32];
	BOOL bOK = TRUE;
	memset(cTemp,0,32);
	HRESULT	  hr = S_FALSE;
	if(m_pDocObjFrame && m_pDocObjFrame->m_bNewCreate){
		ODS("CDsoFramerControl::Close  ready to Kill the app\n");
		IDispatch * lDisp;
		get_ActiveDocument(&lDisp);
		//	COleVariant covTrue((short)TRUE), covFalse((short)FALSE), covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
		if(lDisp){		
			try{
				switch(m_nOriginalFileType){
				case FILE_TYPE_WORD:
					{
 						CComQIPtr<MSWord::_Document> doc(lDisp);
 						if(!doc)
							break;
						CComQIPtr<MSWord::Documents> docs ;
 						CComPtr<MSWord::_Application> app(doc->GetApplication());
						if(!app){
							doc.Detach();
							doc.Release(); 
							break;
						}
						docs = app->GetDocuments();
						if(docs && docs->Count > 1){
							ODS("CDsoFramerControl::Close  Finded the more opened documents \n");
							break;
						}
						sprintf(cTemp,"WebOffice%ld",time(NULL));
						_bstr_t bstr((char*) cTemp);
						app->PutCaption(bstr);					
						app.Detach();
						app.Release ();
						doc.Detach();
						doc.Release(); 
				}
					break;
				case FILE_TYPE_EXCEL:
					{	
						bOK = FALSE;
 						CComQIPtr<MSExcel::_Workbook>  doc(lDisp);
						if(!doc)
							break;
 						CComQIPtr<MSExcel::_Application> app(doc->GetApplication());
						if(!app){
							doc.Detach();
							doc.Release(); 
							break;
						}
						CComQIPtr<MSExcel::Workbooks >  docs;
						docs = app->GetWorkbooks();
						if(docs && docs->Count >1){
							break;
						}
						sprintf(cTemp,"WebOffice%ld",time(NULL));
						_bstr_t bstr((char*) cTemp); 

						app->PutCaption(bstr);
	 
						app.Detach();
						app.Release ();
						doc.Detach();
						doc.Release(); 				
 					}
					break;
				case FILE_TYPE_PPT:
				case FILE_TYPE_PDF:
				case FILE_TYPE_UNK:
				default:
					break;
				}
			}catch(...){
				
			}
			ODS("CDsoFramerControl::Close\n");		
		}
	}
 // Fire the BeforeDocumentClosed and OnDocumentClosed events...
	if ((m_pDocObjFrame) && (m_dispEvents) && !(m_fFreezeEvents))
    {
		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;

        m_fFreezeEvents = TRUE;

     // First fire BeforeDocumentClosed. Setting Cancel param should abort the close...
		DsoDispatchInvoke(m_dispEvents, NULL, DSOF_DISPID_BDOCCLOSE, 0, 2, rgargs, NULL);
		VariantClear(&rgargs[1]);

        m_fFreezeEvents = FALSE;

        if (vtboolCancel != VARIANT_FALSE)
            return E_ABORT;

     // Next fire normal close event (left here for compatibility reasons)...
    }

 // Close the object...
	CDsoDocObject* pdframe = m_pDocObjFrame;
	m_pDocObjFrame = NULL;
	if (pdframe)
	{
		try{			
			pdframe->Close();	
			lll = GetID(cTemp, m_nOriginalFileType);
			if(0 != lll)
				ClearALL(lll,bOK);
		}catch(...){
			
		}
		delete pdframe;

     // Notify host that item is now closed...
	    if ((m_dispEvents) && !(m_fFreezeEvents))
        {
            m_fFreezeEvents = TRUE;
	        DsoDispatchInvoke(m_dispEvents, NULL, DSOF_DISPID_DOCCLOSE, 0, 0, NULL, NULL);
            m_fFreezeEvents = FALSE;
        }
	}

 // Redraw the caption as needed...
    RedrawCaption();
	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;
}


////////////////////////////////////////////////////////////////////////
// CDsoFramerControl::(put_Toolbars/get_Toolbars)
//
//  True/False. Should we display toolbars or not?
//
STDMETHODIMP CDsoFramerControl::put_Toolbars(VARIANT_BOOL vbool)
{
	TRACE1("CDsoFramerControl::put_Toolbars(%d)\n", vbool);

 // If the control is in modal state, we can't do things that
 // will call the server directly, like toggle toolbars...
    if ((m_fModalState) || (m_fNoInteractive))
        return ProvideErrorInfo(DSO_E_INMODALSTATE);

	if (m_fShowToolbars != (WORD)(BOOL)vbool)
	{
		m_fShowToolbars = (BOOL)vbool;
		m_fDirty = TRUE;

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

		ViewChanged();
        OnResize();
	}
	return S_OK;
}

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


⌨️ 快捷键说明

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