📄 dsofauto.cpp
字号:
// 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 + -