DSO API和上传服务器原理

  • Post author:
  • Post category:其他




DSOFramer




原有的接口说明




===================================================================

DSOFramer


原有的接口说明



1.void CreateNew(BSTR ProgIdOrTemplate)



新建文档


,



其中


: ProgIdOrTemplate


参数


:

Excel Spreadsheet     “Excel.Sheet”

Excel Chart        “Excel.Chart”

PowerPoint Presentation  “PowerPoint.Show”

Project Project      “MSProject.Project”

Visio Drawing       “Visio.Drawing”

Word Document       “Word.Document”

2.  HRESULT Open([in] VARIANT Document, [in, optional] VARIANT ReadOnly,

[in, optional] VARIANT ProgId, [in, optional] VARIANT WebUsername, [in, optional] VARIANT WebPassword)



打开文档,可以是本地文件或者是服务器文件





参数:



Document


文档路径



ReadOnly


是否已只读模式打开



ProgId    OLE


类型



WebUsername


用户名(访问网络的文件时候,有可能需要)



WebPassword


密码





例子:



DsoFramer1.Open “C:/TestBook.xls”

DsoFramer1.Open “C:/Plain.txt”, , “Word.Document”  //





Word


来打开


c:/plain.txt


文件



DsoFramer1.Open “https://secureserver/test/mytest.asp?id=123”, True, “Excel.Sheet”, “MyUserAccount”, “MyPassword”

3.HRESULT Save([in, optional] VARIANT SaveAsDocument, [in, optional] VARIANT OverwriteExisting,

[in, optional] VARIANT WebUsername, [in, optional] VARIANT WebPassword);



保存文件在本地



DsoFramer1.Save “c:/1.doc”

4.Activate



激活当前文档,没搞明白有什么用



5.  HRESULT ActiveDocument([out,retval] IDispatch** ppdisp);



返回当前活动文档的


Dispatch


接口,这个接口很重要,可以通过这个接口,操作所有的文档接口。





如:下面


javascript


语句调用


Office


内置的对话框



var obj;

obj = new Object(document.all.FramerControl1.ActiveDocument);

if(obj !=null){


var dd;

dd = obj.Application.Dialogs(84).Show();

//… …

//delete it

delete obj;

}

6.  HRESULT Close();



关闭当前文档,建议在页面关闭的时候调用。



MS


的原来的版本,有时候关不掉


Word


,已经修复了。



7.  HRESULT Caption([out,retval] BSTR* pbstr);



属性,获取


|


设置窗口标题



8.  HRESULT Titlebar([in] boolean vbool);

HRESULT Titlebar([out,retval] boolean* pbool);



显示或者隐藏标题栏



9. HRESULT Toolbars([in] boolean vbool);

HRESULT Toolbars([out,retval] boolean* pbool);



显示或者隐藏工具栏



10.  HRESULT ModalState([in] boolean vbool);

HRESULT ModalState([out,retval] boolean* pbool);

11.HRESULT ShowDialog([in] dsoShowDialogType DlgType);



显示对话框



12.HRESULT EnableFileCommand([in] dsoFileCommandType Item, [in] boolean vbool);

HRESULT EnableFileCommand([in] dsoFileCommandType Item, [out,retval] boolean* pbool);

13.  HRESULT BorderStyle([in] dsoBorderStyle style);

HRESULT BorderStyle([out, retval] dsoBorderStyle* pstyle);

14.  HRESULT BorderColor([in] OLE_COLOR clr);

HRESULT BorderColor([out,retval] OLE_COLOR* pclr);

15. HRESULT BackColor([in] OLE_COLOR clr);

HRESULT BackColor([out,retval] OLE_COLOR* pclr);

16.HRESULT ForeColor([in]OLE_COLOR clr);

HRESULT ForeColor([out,retval]OLE_COLOR* pclr);

17.HRESULT TitlebarColor([in] OLE_COLOR clr);

HRESULT TitlebarColor([out,retval] OLE_COLOR* pclr);

18.HRESULT TitlebarTextColor([in] OLE_COLOR clr);

HRESULT TitlebarTextColor([out,retval] OLE_COLOR* pclr);

19.HRESULT ExecOleCommand([in] LONG OLECMDID, [in, optional] VARIANT Options, [in, optional] VARIANT* vInParam, [in, out, optional] VARIANT* vInOutParam);

20.HRESULT Menubar([in] boolean vbool);

HRESULT Menubar([out,retval] boolean* pbool);

21.HRESULT HostName([in] BSTR bstr);

HRESULT HostName([out,retval] BSTR* pbstr);

22. HRESULT DocumentFullName([out,retval] BSTR* pbstr);



文档的路径



23.HRESULT PrintOut([in, optional] VARIANT PromptUser, [in, optional] VARIANT PrinterName, [in, optional] VARIANT Copies,

[in, optional] VARIANT FromPage, [in, optional] VARIANT ToPage, [in, optional] VARIANT OutputFile);

24.HRESULT PrintPreview();

25.HRESULT PrintPreviewExit();

26.HRESULT IsReadOnly([out,retval] boolean* pbool);



是否为只读的。



27.HRESULT IsDirty([out,retval] boolean* pbool);



是否保存了,实际可以用来判读文档有没有修改



oframer.IsDirty = TRUE //


文档没有保存,处于修改状态



oframer.IsDirty = FALSE //


文档已经保存,没有修改




新加的接口说明




(




开发接口




)




[color=red][b]


当前版本:


V2.2.0.8   2007-02-07[/b]

[/color]


下载控件需要登录





说明:





控件未经大批量测试,难免有


Bug,



发现


Bug


,请及时发帖或者


Mail:wanhhf@gmail.com



版本修改记录:



V2.2.0.8


修改:





增加了


N


多个事件,挺不错的东西



[id(DSOF_DISPID_WORD_DocumentChange), helpstring(“DSOF_DISPID_WORD_DocumentChange”)]

HRESULT WORD_DocumentChange();

[id(DSOF_DISPID_WORD_DocumentBeforePrint), helpstring(“DSOF_DISPID_WORD_DocumentBeforePrint”)]

HRESULT WORD_DocumentBeforePrint();

[id(DSOF_DISPID_WORD_WindowActivate), helpstring(“DSOF_DISPID_WORD_WindowActivate”)]

HRESULT WORD_WindowActivate();

[id(DSOF_DISPID_WORD_WindowSelectionChange), helpstring(“DSOF_DISPID_WORD_WindowSelectionChange”)]

HRESULT WORD_WindowSelectionChange();

[id(DSOF_DISPID_WORD_WindowBeforeRightClick), helpstring(“DSOF_DISPID_WORD_WindowBeforeRightClick”)]

HRESULT WORD_WindowBeforeRightClick();

[id(DSOF_DISPID_WORD_WindowBeforeDoubleClick), helpstring(“DSOF_DISPID_WORD_WindowBeforeDoubleClick”)]

HRESULT WORD_WindowBeforeDoubleClick();

V2.2.0.6


修改:





修改


Open


,参数为空时候,一个小


Bug



修改了


URL


过长时候一个


Bug



增加了一个替换文字的接口



long ReplaceText(BSTR strSearchText, BSTR strReplaceText,  long lGradation);

V2.2.0.2


修改:





修改了


HttpPost


相对路径的一些问题。



V2.2.0.0


增加:



[id(0x00010041), helpstring(“Get Rev Index”)]

HRESULT GetRevCount( [out,retval] long * pbool);

[id(0x00010042), helpstring(“Get Rev Index Info”)]

HRESULT GetRevInfo([in] long lIndex, [in]  long lType, [out,retval] BSTR* pbool);

[id(0x00010043), helpstring(“Set Doc Prop”)]

HRESULT SetValue([in] BSTR strValue, [in]  BSTR strName, [out,retval] long* pbool);

[id(0x00010044), helpstring(“Set Doc Variable”)]

HRESULT SetDocVariable([in] BSTR strVarName, [in]  BSTR strValue,[in] long lOpt, [out,retval] long* pbool);

[id(0x00010045), helpstring(“Save page To Doc”)]

HRESULT SetPageAs([in] BSTR strLocalFile, [in]  long lPageNum, [in]  long lType,[out,retval] long* pbool);

——————————————————————————————————————————————————————–

LoadDso.js

var s = “”

s += “<OBJECT id=DSOFramer align=’middle’ style=’LEFT: 0px; WIDTH: 100%; TOP: 0px; HEIGHT: 100%'”

s += “classid=clsid:00460182-9E5E-11D5-B7C8-B8269041DD57 codeBase=DSOFramer.ocx#Version=2,2,0,6′ >”

s += “</OBJECT>”

document.write(s)

——————————————————————————————————————————————————————–



接口文档:



/*

1.


新建



*/

//


新建


Word

document.all.FramerControl1.CreateNew(“Word.Document”);

//


新建


Excel

document.all.FramerControl1.CreateNew(“Excel.Sheet”);

/*

2.


打开文件



*/

//


打开制定的本地文件



document.all.FramerControl1.Open(“C://TestBook.xls”);

//


制定用


Word


来打开


c:/plain.txt


文件



document.all.FramerControl1.Open(“C://Plain.txt”,false, “Word.Document”);

//


打开服务器的文件



document.all.FramerControl1.Open “https://secureserver/test/mytest.asp?id=123”,true, “Excel.Sheet”, “MyUserAccount”, “MyPassword”);

//


打开服务器的文件



document.all.FramerControl1.Open(“http://localhost/1.doc”, true);

/*

3.


保存文件



*/

//


到本地



document.all.FramerControl1.Save(“c://1.doc”,true);

//


服务器



/*


增加


Http


协议


Post


上传接口


,


可以


Post


一个动态页面


(jsp,asp,php…),


由动态页面负责解析数据



bool HttpInit();

bool HttpAddPostString(BSTR strName, BSTR strValue);

bool HttpAddPostCurrFile(BSTR strFileID, BSTR strFileName);

BSTR HttpPost(BSTR bstr);

*/

//


初始化


Http


引擎



document.all.FramerControl1.HttpInit();

//


增加


Post


变量



document.all.FramerControl1.HttpAddPostString(“RecordID”,”20060102200″);

document.all.FramerControl1.HttpAddPostString(“UserID”,”


李局长


“);

//


上传打开的文件



document.all.FramerControl1.HttpAddPostCurrFile(“FileData”, ”


文档名


.doc”);

//


执行上传动作



document.all.FramerControl1.HttpPost(“http://xxxx.com/uploadfile.asp”);

/*

4.


修订留痕



*/

//


进入留痕状态



document.all.FramerControl1.SetTrackRevisions(1);

//


进入非留痕状态



document.all.FramerControl1.SetTrackRevisions(0);

//


接受当前修订



document.all.FramerControl1.SetTrackRevisions(4);

/*

5.


设置当前用户



*/

document.all.FramerControl1.SetCurrUserName(”


张三


“);

/*

6.


设置当前时间


(


笔迹留痕会显示


(“Like 2006:02:07 11:11:11”)

*/

document.all.FramerControl1.SetCurrTime(“2006:02:07 11:11:11”);

/*

7.


设置和创建书签,此功能比较强大,设置书签数据、添加书签和添加红头文件就靠他了



SetFieldValue(BSTR strFieldName, BSTR strValue, BSTR strCmdOrSheetName)

strFieldName:


书签名



strValue


:要设置的值



strCmdOrSheetName








命令



::ADDMARK::


添加


BookMark

::DELMARK::


删除这个


BookMark

::GETMARK::


定位到这个


BookMark

::FILE::


插入的是文件



::JPG::


插入的是图片





一般来说:


WORD


中书签是做好的,可以通过此接口把外界数据设置进书签中去。



*/

//


在当前


WORD


位置插入标签


,


标签名为


“book1”,


数值为


“test”

document.all.FramerControl1.SetFieldValue(“book1″,”test”,”::ADDMARK::”);

//


设置书签


“Time”,


数值为


“2006-03-16 22:22:22”

document.all.FramerControl1.SetFieldValue(“Time”,”2006-03-16 22:22:22″,””);

//


在书签位置


“hongtou”,


插入红头文件


“http://222.222.222.222/hongtou1.doc”


这样,红头就自动插进去了



document.all.FramerControl1.SetFieldValue(“hongtou”,”http://222.222.222.222/hongtou1.doc”,”::FILE::”);

/*

8.


设置菜单显示情况



BOOL SetMenuDisplay(long lMenuFlag)

lMenuFlag


为以下数值的组合



#define MNU_NEW                         0x01

#define MNU_OPEN                        0x02

#define MNU_CLOSE                       0x04

#define MNU_SAVE                        0x08

#define MNU_SAVEAS                      0x16

#define MNU_PGSETUP                     0x64

#define MNU_PRINT                       0x256

#define MNU_PROPS                       0x32

#define MNU_PRINTPV                     0x126

*/

//


只有





新建





菜单可用



document.all.FramerControl1..SetMenuDisplay(1);

//


只有





打开





菜单可用



document.all.FramerControl1.SetMenuDisplay(2);

//


只有





打开











新建





菜单可用



document.all.FramerControl1.SetMenuDisplay(3);

/*

9.


保护文档和解保护文档



lProOrUn:1:


保护文档;


0:


解除保护



lProType:

wdNoProtection = -1,

wdAllowOnlyRevisions = 0,

wdAllowOnlyComments = 1,

wdAllowOnlyFormFields = 2

strProPWD:


密码



*/

//


完全保护文档,密码为


“pwd”

document.all.FramerControl1.ProtectDoc(1,1,”pwd”);

//


解除文档保护



document.all.FramerControl1.ProtectDoc(0,1,”pwd”);

/*

10.


显示或隐藏修订内容



ShowRevisions(long nNewValue)

nNewValue = 0


则隐藏修订



= 1


则显示修订



*/

//


显示修订留痕



document.all.FramerControl1.ShowRevisions(1);

//


隐藏修订留痕



document.all.FramerControl1.ShowRevisions(0);

/*

11.


插入合并文件,



strFieldPath


文件路径


,


可以是


http,ftp


的路径



pPos = 0 //


当前鼠标位置



1;


文件开头



2;


文件末尾



pPos


的第


4


位为


1


的时候,代表插入的是图片



InSertFile(BSTR strFieldPath, long lPos)

*/

//


文件头部插入文件



document.all.FramerControl1.InSertFile(“http://XX.com/XX.doc”,1);

//


文件尾部插入文件



document.all.FramerControl1.InSertFile(“http://XX.com/XX.doc”,2);

//


当前光标位置插入文件



document.all.FramerControl1.InSertFile(“http://XX.com/XX.doc”,0);

//


文件头部插入图片



document.all.FramerControl1.InSertFile(“http://XX.com/XX.jpg”,9);

//


文件尾部插入图片



document.all.FramerControl1.InSertFile(“http://XX.com/XX.jpg”,10);

//


当前光标位置插入图片



document.all.FramerControl1.InSertFile(“http://XX.com/XX.jpg”,8);

/*

0x31.


文档另存为



HRESULT SaveAs([in] VARIANT strFileName, [in] VARIANT dwFileFormat, [out,retval] long* pbool);



参数:



strFileName


:文件本地路径,如


c://11.doc

dwFileFormat:


文件格式



dwFileFormat


的数值为:



Excel: Type

enum XlFileFormat

{


xlAddIn = 18,

xlCSV = 6,

xlCSVMac = 22,

xlCSVMSDOS = 24,

xlCSVWindows = 23,

xlDBF2 = 7,

xlDBF3 = 8,

xlDBF4 = 11,

xlDIF = 9,

xlExcel2 = 16,

xlExcel2FarEast = 27,

xlExcel3 = 29,

xlExcel4 = 33,

xlExcel5 = 39,

xlExcel7 = 39,

xlExcel9795 = 43,

xlExcel4Workbook = 35,

xlIntlAddIn = 26,

xlIntlMacro = 25,

xlWorkbookNormal = -4143,

xlSYLK = 2,

xlTemplate = 17,

xlCurrentPlatformText = -4158,

xlTextMac = 19,

xlTextMSDOS = 21,

xlTextPrinter = 36,

xlTextWindows = 20,

xlWJ2WD1 = 14,

xlWK1 = 5,

xlWK1ALL = 31,

xlWK1FMT = 30,

xlWK3 = 15,

xlWK4 = 38,

xlWK3FM3 = 32,

xlWKS = 4,

xlWorks2FarEast = 28,

xlWQ1 = 34,

xlWJ3 = 40,

xlWJ3FJ3 = 41,

xlUnicodeText = 42,

xlHtml = 44

};

Word: Type

enum WdSaveFormat

{


wdFormatDocument = 0,

wdFormatTemplate = 1,

wdFormatText = 2,

wdFormatTextLineBreaks = 3,

wdFormatDOSText = 4,

wdFormatDOSTextLineBreaks = 5,

wdFormatRTF = 6,

wdFormatUnicodeText = 7,

wdFormatEncodedText = 7,

wdFormatHTML = 8

};

PPT:

enum PpSaveAsFileType

{


ppSaveAsPresentation = 1,

ppSaveAsPowerPoint7 = 2,

ppSaveAsPowerPoint4 = 3,

ppSaveAsPowerPoint3 = 4,

ppSaveAsTemplate = 5,

ppSaveAsRTF = 6,

ppSaveAsShow = 7,

ppSaveAsAddIn = 8,

ppSaveAsPowerPoint4FarEast = 10,

ppSaveAsDefault = 11,

ppSaveAsHTML = 12,

ppSaveAsHTMLv3 = 13,

ppSaveAsHTMLDual = 14,

ppSaveAsMetaFile = 15,

ppSaveAsGIF = 16,

ppSaveAsJPG = 17,

ppSaveAsPNG = 18,

ppSaveAsBMP = 19

};

*/

/*

0x32.


删除本地文件



HRESULT DeleteLocalFile([in] BSTR strFilePath);



参数:



strFileName


:文件本地路径,如


c://11.doc

*/

/*

0x33.


创建临时文件



HRESULT GetTempFilePath([out,retval] BSTR* strValue);



返回:





临时文件的路径地址。使用完后,用


DeleteLocalFile


删除

*/

/*

0x34.


设置文档显示模式



HRESULT ShowView([in] long dwViewType, [out,retval] long * pbool);

dwViewType


的可取值为:



enum WdViewType

{


wdNormalView = 1,

wdOutlineView = 2,

wdPrintView = 3,

wdPrintPreview = 4,

wdMasterView = 5, //


这个是大纲



wdWebView = 6

};

*/

//


大纲模式



document.all.FramerControl1.ShowView(5);

/*

0x39:


下载远程文件



HRESULT DownloadFile( [in] BSTR strRemoteFile, [in] BSTR strLocalFile, [out,retval]  BSTR* strValue);



参数:



strRemoteFile


:远程路径地址


,http or Ftp

strLocalFile:


本地保存地址,


if strLocalFile == NULL then Create Temp File and return TempFile’s Path

*/

/*

0x40


:增加


Http


上传时候的,附加其他文件



HRESULT HttpAddPostFile([in] BSTR strFileID, [in]  BSTR strFileName, [out,retval] long* pbool);



参数:



strFileID


:文件的


ID


,供服务器端页面解析



strFileName:


本地文件地址




*/

/*

0x41,0x42.



获取详细的修订信息。



GetRevCount( [out,retval] long * pbool);

GetRevInfo([in] long lIndex, [in]  long lType, [out,retval] BSTR* pbool);



例子如下



*/

var vCount;

vCount = document.all.FramerControl1.GetRevCount();

alert(vCount);

var vOpt = 0;

var vDate;

for(var i=1; i<= vCount; i++){


vOpt = document.all.FramerControl1.GetRevInfo(i,2);

if(“1” == vOpt){


vOpt = ”


插入


“;

}else if(“2” == vOpt){


vOpt = ”


删除


“;

}else{


vOpt = ”


未知操作


“;

}

vDate = new String(document.all.FramerControl1.GetRevInfo(i,1));

vDate = parseFloat(vDate);

alert(vDate);

dateObj = new Date(vDate);

alert(dateObj.getYear()   + ”





” + dateObj.getMonth() + 1 + ”





” + dateObj.getDate() +”





” +  dateObj.getHours() +”





” +  dateObj.getMinutes() +”





” +  dateObj.getSeconds() +”





” );

alert(”


用户


:”+document.all.FramerControl1.GetRevInfo(i,0) + “/r/n


操作


:” + vOpt + “/r/n


内容


:” + document.all.FramerControl1.GetRevInfo(i,3));

}

/*

0x43.


设置基本信息:



HRESULT SetValue([in] BSTR strValue, [in]  BSTR strName, [out,retval] long* pbool);

1.


设置文件只读密码



SetValue(“password”,”::DOCPROP:PassWord”);

2.


设置文件修改密码



SetValue(“password”,”::DOCPROP:WritePW”);



返回值:



0


正确



-1


:不支持此命令,请确定您的第二个参数没有传错



-127:


异常



*/

//


设置文件只读密码



document.all.FramerControl1.SetValue(“password”,”::DOCPROP:PassWord”);

//


设置文件修改密码



document.all.FramerControl1.SetValue(“password”,”::DOCPROP:WritePW”);

/*

0x44.


设置文档变量,这个很少能用到



HRESULT SetDocVariable([in] BSTR strVarName, [in]  BSTR strValue,[in] long lOpt, [out,retval] long* pbool);

strVarName:


变量名



strVlaue:


变量值



lOpt:


操作类型,





按位





第一位为


1:


表示


update


域关联的





第二位为


1:


表示如果没有这个变量则添加





第三位为


1:


未来支持



return:

0:OK

-127:


异常



*/

/*

0x45:


分页保存



HRESULT SetPageAs([in] BSTR strLocalFile, [in]  long lPageNum, [in]  long lType,[out,retval] long* pbool);

strLocalFile


:本地路径



lPageNum


:页数



*/



DSO




上传服务器原理




————————————————————————————————————————————————————————

Dsoframer1


控件采用文件


Http


上传接口实现文件和表单域的上传保存。



1.


原理





因为


Web


页面上的


Dsoframer1


打开的文件无法随表单记录提交到处理页面,所以我们把文件模拟成表单的文件域


<input type=file …>


,通过接口把文件和表单元素发送到保存记录的页面(过程类似表单的提交)。



2.


主要上传接口:



HttpInit();



该方法用于初始化上传接口,不需要设置参数



HttpAddPostString(String FieldName, String someValue);



添加要提交的表单域


, FieldName


是要上传表单域名称,


someValue


是表单域值





例一:



HttpAddPostString(“username”, “zhangSan”);



它类似域表单域的



<input type=text name=username value=zhangSan>



例二:



HttpAddPostString(“username”, WebForm.username.value);

….

<form name= WebForm >

<input type=text name=username value=zhangSan>

</form>



注意:如果使用上传接口,那么


form


表单里的表单域不会被提交到处理页面。需要手工添加到上传接口(


HttpAddPostString


接口),然后通过控件发送到处理页面。例二使用了


“WebForm.username.value”


获取表单域值。



HttpAddPostCurrFile(String fileName, String ReName);



添加当前


Dsoframer1


编辑的文件给上传接口,该接口把文件模拟到成一个表单的文件域,并提交到处理页面。





例一:



HttpAddPostCurrFile(“File”, “”);



该接口模拟表单文件域如下:



<input type=file name=File >



注意:第二个参数为空表示控件自动为文件命名,如:


temp.doc


,如果需要重命名可以在第二个参数指明文件名称,也可在保存页面指定文件名称。



HttpPost(String url);



执行上传操作将文件和表单域提交到


url


的页面进行保存操作,并获取


url


页面返回的执行结果




(是否成功


,


可以根据这个结果来获取服务器端执行的结果)。



url


支持绝对路径和相对路径。





绝对路径


,


例如:


[url=http://192.168.0.1/savedoc.asp]http://192.168.0.1/savedoc.asp[/url]



相对路径要以


“./”


或者


“../”


开头。例如:


./savedoc.asp

3.


完整的上传接口演示



function SaveDoc() {


var returnValue;     //


保存页面的返回值



document.all.Dsoframer11.HttpInit(); //


初始化


Http


引擎



//


添加相应的


Post


元素



document.all.Dsoframer11.HttpAddPostString(“username”, WebForm. username.value);

//


添加上传文件



document.all.Dsoframer11.HttpAddPostCurrFile(“File “,””);

//


提交上传文件



returnValue = document.all.Dsoframer11.HttpPost(“../saveDoc.jsp”);

if(“true” == returnValue){


alert(”


文件上传成功


“);

} else  {


alert(”


文件上传失败


“)

}

}

4.


关于保存



Dsoframer1


上传接口将数据流以


Http


方式提交到保存页面,至于对数据处理就和普通的文件上传处理一样了


.



服务器段接受数据的具体代码


?


呵呵。这个就不用多介绍了吧,应该都知道。




下面,请跟贴者补充。



————————————————————————————————————————————————-

ASP:

**

JSP:

**

.Net:

**

Louts:

**

PHP:

**