The NoteBook of EricKong

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  611 Posts :: 1 Stories :: 190 Comments :: 0 Trackbacks

#

FireFox 是遵守W3C, 沒有event
 

所以可能会出现" event is not defined "

而IE event给于window.event,

 

 

解决方法:

    funname( event,....)  {

 

   var evt = event ? event : (window.event ? window.event : null);

..........

   

   }

 

调用时要加上event参数 onmouseover="javascript: funname(event, ....); "

 

3.注意:

 

IE 的 event.srcElement <==>  Firefox 中的 event.target

IE 的 a.innerText  <==>  Firefox 中的 a.textContent

IE 的 document.all[obj].style <==>  Firefox 中的 document.getElementById(obj).style
posted @ 2010-06-04 14:56 Eric_jiang 阅读(2377) | 评论 (0)编辑 收藏

一个很简单的问题,但是研究半天,给出标准答案,XP或2003下
如FSO,在NTFS格式下
Regsvr32 %systemroot%\system32\scrrun.dll
如果注册成功,但ASP中依然无法使用
先看scrrun.dll在NTFS格式下的权限,看是否加入user组中,如没有请用下命令
cacls %systemroot%\system32\scrrun.dll /d guests
而在FAT32格式下面,因为没有文件权限,无需要上面的步骤
而注册表中依然有用户权限
请查看HKEY_CLASSES_ROOT\Scripting.FileSystemObject的权限,请加上User组可读可运行权限
同理,别的DLL组件能注册成功但无法使用也大多是这种问题

简单的回答一下,因为IIS的登录用户不是DLL注册时候的用户。解决方法 把IIS用户改为你这个DLL注册的用户,或者 有没有办法把这个DLL注册给所有用户!不知道你懂没,反正就这么点回答了!administrator 设置密码,而且IIS用户那里自己输入administrator 和密码 别去查找!
posted @ 2010-06-04 08:31 Eric_jiang 阅读(1502) | 评论 (0)编辑 收藏

只要将下面的批处理命令复制到 => 任意文件名.bat中运行相应的批处理文件就好了。

注销或重启后生效。

设置窗口背景颜色为淡绿保护你的眼睛,色调85,饱和度 90,亮度205(即:红204,绿232,蓝207):

@echo off
reg add "HKCU\Control Panel\Colors" /v "Window" /t REG_SZ /d "204 232 207" /f

还原窗口背景为白色:
@echo off
reg add "HKCU\Control Panel\Colors" /v "Window" /t REG_SZ /d "255 255 255" /f

posted @ 2010-06-03 17:05 Eric_jiang 阅读(712) | 评论 (0)编辑 收藏

1.ASP部分
a.建立语言包
1.在各个子系统建立"语言包"目录 ,
如BBS--> language -->Simplified
--->Traditional
--->English
2 为每个ASP,js,HTC 建立语言文件,如ACMBBStopic.asp.lang ,treeview.htc.lang ,
用来存放语言全局变量。
如目录Language\English\ ACMBBSShow.asp.lang
Public Const LangRollway="reverse roll"
Public Const LangInvaildUser="invaild user"
Public Const LangMailbox="mail box"
Public Const LangSysSetup="system setup"
Public Const LangACMBBS="Acer BBS"
Public Const LangBulltn="Acer bulltin"
Public Const LangPersnSetup="personal setting"
Public Const LangPublicTools="Public Tools"
如目录Language\ Simplified \ ACMBBSShow.asp.lang
Public Const LangRollway="反向滚动"
Public Const LangInvaildUser="非法用户"
Public Const LangMailbox="邮件资料夹"
Public Const LangSysSetup="系统设置"
Public Const LangACMBBS="明碁网咖"
Public Const LangBulltn="公告栏"
Public Const LangPersnSetup="个人设定"
Public Const LangPublicTools="群组工具"
语言全局变量命名规则;
必须是VBscript 变量定义方式 Public Const
变量名为 : "Lang" + Message Descption

b. 设定Global.asa
SUB Session_OnStart
Session.CODEPAGE="1252" '1252En '950繁体 '936简体
Session.Contents("Language")="EngLish" 'EngLish 'Traditional 'Simplified
Session.Contents("StrCharset")="big5" 'iso-8859-1 'big5 'gb2312
End Sub
c. 引用语言包
1.建立 BBS--> language -->script 目录, IncludeLang.vbs
2.在各个asp,js,HTC头部


3.使用思想
o 将 *.lang 等语言包用Function GetFileContents 读到变量中,
o 使用vbscript中EXECUTE方法在Server执行
IncludeLang.vbs 内容如下

'//'*********************************************************
'// ' Purpose: open include 文件
'// ' Inputs: strIncludeFile 路径
'// ' Returns: All Text
'//'*********************************************************

Function GetFileContents(strIncludeFile)
On Error Resume Next
Dim objFSO
Dim objText
Dim strPage
Set objFSO = Server.CreateObject("Scripting.FileSystemObject")
Set objText = objFSO.OpenTextFile(Server.MapPath(strIncludeFile))
GetFileContents= objText.ReadAll
objText.Close
Set objText = Nothing
Set objFSO = Nothing
IF Err Then
Response.Write "Error open this language package file<<" & strIncludeFile & ">>!"
Response.End
END IF
End Function

'//'*********************************************************
'// ' Purpose: 动态 include 文件
'// ' Inputs: strIncludeFile 路径,语言种类
'// ' Returns: 执行变量到全局变量
'//'*********************************************************
Function IncludeLangFile(StrFileName,Language)
On Error Resume Next
dim StrLangPackagePath
dim StrLanguagePath
StrLanguagePath=Language
StrLangPackagePath="./Language/" & StrLanguagePath & "/" & StrFileName
Execute(GetFileContents(StrLangPackagePath))
IF Err Then
Response.Write "Error Include this language package file<<" & strIncludeFile & ">>! check the file's syntax"
Response.End
END IF
End Function
2.图片部分
为带有汉字图片建立 BBS--> language -->simplified-->Image
--->traditional-->Image
--->English -->Image
动态Include



3.COM部分
使用resource file 控制语言版本,由系统自动判断语言版本

注意: resource file 简体字码必须在简体机器输入,繁体字码必须在繁体机器输入


4.其他

多语言版本参考规则﹕
1.英文翻译长度尽量与汉语长度相当。
2.要符合各个版本的语言习惯。
3.英文版中Title ,text标签文本﹐按钮文本﹐select option 中英文单词 首字母大写,但
介词﹐连词 ,冠词 使用小写。
4. 英文版中缩写全部使用大写。
5. 英文版中check ,radio ,英文首字母大写.
6. 英文版中状态信息使用小写。

posted @ 2010-06-03 15:36 Eric_jiang 阅读(231) | 评论 (0)编辑 收藏

 这篇文章主要是为想将自己的ASP水平提高的人写的!把ASP代码变成组件,开发者不仅是加快了ASP的速度,而且也能保护自己的代码.这篇文章写出来,也是为了给想开发组件网友上一堂入门课! 下面,我们会来编写一个非常简单的组件,重点是知道怎样开发DLL组件,而不是其复杂的代码!这些都要靠你们自己以后的努力了.

  服务器端组件

  首先,服务器端的组件要有别于客户端的组件.客户端的组件是通过网络传输,依靠HTML来起作用.而且只能在IE上有用.但是服务器端的组件是运行在服务器端,它在服务器上执行各种操作.因此,所有的浏览器都能享用,它依靠的是服务器而不是浏览器.

  当IIS被请求执行一个ASP程序,它首先会在ASP文件中找到〈% %>标签之间的代码,并且执行它(也可以是〈script runat=server>〈/script>之间的代码).如果这个ASP程序在先前被调用过,那么它就会用内存中的编译过的程序来向用户返回HTML代码,如果没有,那么它就重新编译.这里ASP就比CGI多一点速度优势,因为CGI是每一个请求都使用一个线程.这样就大大消耗了服务器的资源.

  想不想你写的程序自己就能在IIS运行!?!现在你就行了!使用VB5(当然现在是VB6了),你就能建立Dynamic Linked Libraries (DLL文件),它能在IIS上直接运行(如果有asp文件来请求的话).

  系统和软件的要求

  你需要一个32位的操作系统来运行ASP.当然你也得安装IIS或PWS.我们下面的程序是在windows95+PWS+VB5的环境下开发的.

  我们开始吧

  启动你的VB,选择ActiveX图标.这个图标可以在新建工程找到!VB会提供一个默认的工程名(project1)和类名(class1).我们会将这两个名字都改掉.在改名之前,请首先确认我们拥有Microsoft Active Server Pages Object Library,它在我们的程序非常有用.从菜单中选择"工程",然后在其中选择"引用",就会出现"引用"窗口从中选择Microsoft Active Server Pages Object Library.

  给工程和类命名

  现在我们来根据自己的爱好来为project1和class1来命名吧!给它们命名也是很重要的,我们以后会用这个工程名和类名来创建这个组件的实例!后面详细介绍.

  如何改名,我就不想多说了!我们的工程名改为Exmaple,类名为Helloword

  怎样使用工程和类

  现在我们有了我们自己的工程(Example1)和类名(HelloWorld).以后我们就会在ASP代码中使用它们的名字来引用这个组件.在ASP中我们就这样引用,如下:

  Set ObjReference = Server.CreateObject("ProjectName.ClassName")

  对于我们工程的引用就是:Set ObjReference = Server.CreateObject("Example1.HelloWorld")

  现在我们就能用ObjReference来调用我们在组件中所创建的函数,子程序.下面我们会来写一个SayHello的子程序,我们执行它的代码如下:

〈%
Set ObjReference = Server.CreateObject("Example1.HelloWorld")
ObjReference.SayHello
%>

  为了在Helloword类中使用ASP的方法,你必须在此类中写一个OnStartPage子函数.如下:

Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)
Set MyScriptingContext = PassedScriptingContext
End Sub

  

  现在,无论什么时候用户访问一个带有本组件的ASP文件,IIS就会把ScriptingContext传送给我们的对象请我们使用.这个ScriptingContext包括了全部的ASP方法和属性.实现上,这使得我们有能力访问所有ASP的对象.看下面的代码:

Public Sub OnStartPage(PassedScriptingContext As ScriptingContext)
Set MyScriptingContext = PassedScriptingContext
Set MyApplication = MyScriptingContext.Application
Set MyRequest = MyScriptingContext.Request
Set MyResponse = MyScriptingContext.Response
Set MyServer = MyScriptingContext.Server
Set MySession = MyScriptingContext.Session
End Sub


  以后我们就能用在VB中用MyApplication来代替ASP中的Application,同理可以代替Request,Server.....,不过我们来是要在OnStartPage之前来申明这些变量:

Private MyScriptingContext As ScriptingContext
Private MyApplication As Application
Private MyRequest As Request
Private MyResponse As Response
Private MyServer As Server
Private MySession As Session

  

  使用ASP的对象我们的变量现在就能像标准的ASP对象来使用了!比如,我们经常在ASP中用Request.form()来收集提交表单的数据.现在我们在我们的VB中实现这个功能,代码如下:

  用ASP中实现:
〈%
MyTempVariable = Request.Form("userName")
Response.Write ("you entered "& MyTempVariable & "as your user name")
%>

  在VB中实现:

MyTempVariable = MyRequest.Form("userName")
MyResponse.Write ("you entered "& MyTempVariable & "as your user name")


  通过使用MyResponse来代替Response,我们能够使用所有Response的方法,当然,MyResponse这个名字可以随便来取,你甚至可以就取Response.另一件我们得注意的是,我们得在我们的建立的类中,写上OnEndPage子函数,这个OnStartPage是相反的!OnStartPage是创建对象,OnEndPage是消毁对象.

  

Public Sub OnEndPage()
Set MyScriptingContext = Nothing
Set MyApplication = Nothing
Set MyRequest = Nothing
Set MyResponse = Nothing
Set MyServer = Nothing
Set MySession = Nothing
End Sub

  

  SayHello方法我们来建立一个子函数,用于显示"Holle World".这个SayHello方法只是HelloWorld这个类中一个子函数,我们以后会在ASP中用以下的显示这个方法

〈%
Set ObjReference = Server.CreateObject("Example1.HelloWorld")
ObjReference.SayHello
%>

  SayHello的程序,很简单的!

Public Sub SayHello()
MyResponse.Write ("Hello World")
End Sub

  

  现在一个小型的组件编写完成,剩下的工作就是编译这个组件,在"工程"菜单中保存它,取什么名字都可以,我们用Exmaple1.vbp吧!然后就用在菜单中选择"make exmaple1.dll",将其编译成DLL文件.一个组件就真正完成了!

  注意,编译了此组件那么你就得先把你的PWS关掉,然后再编译此组件.否则VB就会告诉你些组件在使用中.

  在ASP中使用我们的自己的组件.

  当你更正了在编译中的错误,成功地编译了example1这个工程,现在你就得拿出你最喜欢的HTML编辑器来写下下面的语句,保存为ASP文件.

  〈HTML>〈HEAD>〈TITLE>Example 1〈/TITLE>〈/HEAD>

  〈BODY>

〈%
Set ObjReference = Server.CreateObject("Example1.HelloWorld")
ObjReference.SayHello
%>

  〈/BODY>〈/HTML>

  运行后即可看到结果:

  Hello World

  注册组件

  如果你想和你的朋友,邻居分享你的组件,那么你就得在你的系统上注册你的组件.我们一般使用Regsvr32.exe来注册组件.注册后你的组件会出现在Win95/Win98的windows/system目录中.下面是一个注册的例子:

  Regsvr32.exe C:/wwwroot/Example1/Example1.dll

  在你的系统中,VB会自动给你注册,所以你很少用到Regsvr32.exe

  我们这里只是写了一个非常小的组件,你们可以写好自己的更大的组件,而且还可以用VB中的很多控件.

  让我们用组件来扩展我们的程序的功能吧!也希望多多的看到我们中国人的组件.

posted @ 2010-06-01 20:34 Eric_jiang 阅读(2192) | 评论 (0)编辑 收藏

封装为dll会带来很多的好处,主要包括只是产权的保护,以及效率和安全性能的提升。这个例子中被封装的dll文件可以隐藏access数据库的实际路径。

VB生成的DLL封装ASP代码来连接数据库(Access)。

本文用一个最简单的连接access数据库的例子来说明如何将asp代码封装为dll文件。

我们用vb,最常见的方式来封装asp代码。

我们需要封装的对象如下:

'Proconn.asp
dim ProConn
set ProConn=Server.CreateObject("ADODB.CONNECTION")
ProConn.Open "driver={Microsoft Access Driver (*.mdb)};uid=;pwd=123;DBQ=" & Server.MapPath("DB.asp")

我们将下面的部分封装
"driver={Microsoft Access Driver (*.mdb)};uid=;pwd=123;DBQ=" & Server.MapPath("DB.asp")

分析一下这段要封装的内容,
它的前半部分就是一个字符串:
"driver={Microsoft Access Driver (*.mdb)};uid=;pwd=123;DBQ="
用&连接上后半部分的另一个字符串。
后半部分的另一个字符串是Server.MapPath对象函数的返回值。

下面开始这个封装的操作过程。
首先
新建一个VB下的ActiveX DLL工程,工程的名称Project1更改成ConDBDLL
方法class1的名称更改成cs
工程名和方法名会在调用这个DLL的时候使用到,大家可以按照自己命名规则定义,但请注意好好使用。
这个DLL的代码部分书写如下:

Dim rp As Response
Dim rq As Request
Dim ap As Application
Dim sr As Server
Dim sn As Session

Public Sub OnStartPage(MyScriptingContext As ScriptingContext)
Set rp = MyScriptingContext.Response
Set rq = MyScriptingContext.Request
Set sr = MyScriptingContext.Server
Set ap = MyScriptingContext.Application
Set sn = MyScriptingContext.Session
End Sub

Public Sub OnEndPage()
Set rp = Nothing
Set rq = Nothing
Set sr = Nothing
Set ap = Nothing
Set sn = Nothing
End Sub
'以上语句是必须的,将原本的对象作了简化处理,并在两个基本函数中作了处理

Public Function ConnectDB() As Variant
ConnectDB = "driver={Microsoft Access Driver (*.mdb)};uid=;pwd=123;DBQ="
End Function
'上面这个函数是处理前半部分字符串的,直接返回这个字符串的内容

'另外定义下面这个函数来处理后半部分内容
Public Function DBPath() As Variant
DBPath = sr.MapPath("DB.asp")
End Function
'注意上面使用的是sr,不要使用成Server了

到了关键的一步,给这个工程添加"Microsoft Active Server Pages ObjectContext Object Library" 的 Reference
添加方法,选择菜单中的"Project"->"Reference",在打开的对话框里选择。
对了,还要选择上"microsoft activeX data objects 2.6 library"

进行完以上操作,我们就可以编译生成DLL了,(别忘了前面的改工程名和方法名)

准备好数据库文件DB.asp (由DB.mdb更改后缀而成,密码123)

下面就是调用封装的连接数据库的asp文件代码:

由于是自己创建的DLL,把它拷贝到相应的目录后,必须注册才能使用。
注册的方法,在“运行”中执行:
Regsvr32.exe dllname.dll

取消这个DLL的注册的方法是:Regsvr32.exe /u dllname.dll

注册完毕,我们的工作基本上就做完了,现在我们可以使用这样的封装方法连接具有针对性的数据库了。

不过有一点需要特别注意的是:
由于
Dim ConDB
set ConDB=Server.CreateObject("ConDBDLL.Conn")
'ConDB就是创建的DLL对象
这是在ASP中创建的对象,包括ProConn,那么我们在任何使用到(引用)ProConn.asp的其他ASP文件中记得释放这两个对象!
ProConn.close
set ProConn=nothing
set ConDB=Nothing
否则系统会由于对象没有释放,而变得越来越不堪重负。

关于这个封装ASP代码连接Access数据库的方法,我想完全适用其他数据库的连接方法。


再例如,下面的封装的例子:

首先要申明变量:

Private WenScriptingContext As ScriptingContext
Private WenApplication As Application
Private WenRequest As Request
Private WenResponse As Response
Private WenServer As Server
Private WenSession As Session

为了在WenConnection类中使用ASP的内建对象,必须在此类中写一个OnStartPage子函数。那是因为无论什么时候用户访问一个带有本组件的ASP文件,IIS就会把ScriptingContext传送给我们的对象请我们使用。这个ScriptingContext包括了全部的ASP方法和属性,这使得我们有能力访问所有ASP的对象。

Public Sub OnStartPage (PassedScriptingContext As ScriptingContext)
Set WenScriptingContext = PassedScriptingContext
Set WenApplication = WenScriptingContext.Application
Set WenRequest = WenScriptingContext.Request
Set WenResponse = WenScriptingContext.Response
Set WenServer = WenScriptingContext.Server
Set WenSession = WenScriptingContext.Session
End Sub

我们既然用OnStartPage函数来创建对象,那么我们这里就用OnEndPage子函数来释放对象:

Public Sub OnEndPage()
Set WenScriptingContext = Nothing
Set WenApplication = Nothing
Set WenRequest = Nothing
Set WenResponse = Nothing
Set WenServer = Nothing
Set WenSession = Nothing
End Sub

接下来定义两个函数RsResult()和DataSource():

Public Function Rs(strsql As String) As Recordset
Dim oConn As Connection
Dim oRs As Recordset
Dim strconnstring As String
strconnstring = "driver={sql server};server=ServerName;uid=sa;pwd=;" & _
"database=DataBaseName"
oConn.Open strconnstring
oRs.ActiveConnection = oConn
strsql="Select * From tableName"
oRs.Open strsql, oConn, 1, 3
Set Rs = oRs
End Function

Public Function DataSourceConnection() As Variant
DataSourceConnection = "driver={sql server};server=ServerName;uid=sa;pwd=;database=DataBaseName"
End Function

三、 存工程名为WenADODB.vbp和保存类名为WenConnection.cls,然后点击“文件”—>“生成WenADODB.DLL”编译成动态连接库文件。VB在编译好动态连接库文件的同时也将该组件注册到注册表里了,要是想在另外一台机器上注册该组件的话,请用以下指令注册或反注册:

Regsvr32 x:\路径\WenADODB.dll x:\路径\为WenADODB.dll文件存放的盘符和路径

Regsvr32 /u x:\路径\WenADODB.dll 参数U为反注册

四、 在ASP文件中调用WenADODB.dll组件的例子。

<%

Set Conn=Server.CreateObject("WenADODB.WenConnection") ‘调用组件创建对象实例
objConn=Conn.DataSourceConnection()
application("strconn")=objConn

set Rs=Server.CreateObject("ADODB.Recordset")
sql="select * from TableName order by ID DESC"
Rs.open sql,application("strconn"),1,3
%>
<Table align="center" border="1">
<%
if Rs.Bof and Rs.Eof then
Response.Write "暂时还没有任何数据。"
else
Do while not Rs.Eof
%>
<tr width=100%>
<td width=50%><%=Rs("Field1")%></td><td width=50%><%=Rs("Field2")%></td>
</tr>
<%
Rs.MoveNext
Loop
end if
Rs.Close;Set Rs=Nothing
%>
</Table>

五、 小结

我们这里只是编写了一个连接数据库的简单的动态连接库文件,利用VB的强大组件编写功能还可以写出功能更加强大跟齐全的组件,来完成更加实用的任务

关键字 如何把ASP编写成DLL

这篇文章主要是把ASP代码变成组件,开发者不仅是加快了ASP的速度,而且也能保护自己的代码.
下面,我们会来编写一个非常简单的组件,重点是知道怎样开发DLL组件,而不是其复杂的代码!这些都要靠你们自己以后的努力了.

服务器端组件

首先,服务器端的组件要有别于客户端的组件.客户端的组件是通过网络传输,依靠HTML来起作用.而且只能在IE上有用.但是服务器端的组件是运行在服务器端,它在服务器上执行各种操作.因此,所有的浏览器都能享用,它依靠的是服务器而不是浏览器.

当IIS被请求执行一个ASP程序,它首先会在ASP文件中找到〈%%>标签之间的代码,并且执行它(也可以是〈scriptrunat=server>〈/script>之间的代码).如果这个ASP程序在先前被调用过,那么它就会用内存中的编译过的程序来向用户返回HTML代码,如果没有,那么它就重新编译.这里ASP就比CGI多一点速度优势,因为CGI是每一个请求都使用一个线程.这样就大大消耗了服务器的资源.

想不想你写的程序自己就能在IIS运行!?!现在你就行了!使用VB5(当然现在是VB6了),你就能建立DynamicLinkedLibraries(DLL文件),它能在IIS上直接运行(如果有asp文件来请求的话).

系统和软件的要求

你需要一个32位的操作系统来运行ASP.当然你也得安装IIS或PWS.我们下面的程序是在windows95+PWS+VB5的环境下开发的.

我们开始吧

启动你的VB,选择ActiveX图标.这个图标可以在新建工程找到!VB会提供一个默认的工程名(project1)和类名(class1).我们会将这两个名字都改掉.在改名之前,请首先确认我们拥有MicrosoftActiveServerPagesObjectLibrary,它在我们的程序非常有用.从菜单中选择"工程",然后在其中选择"引用",就会出现"引用"窗口
从中选择MicrosoftActiveServerPagesObjectLibrary.

给工程和类命名

现在我们来根据自己的爱好来为project1和class1来命名吧!给它们命名也是很重要的,我们以后会用这个工程名和类名来创建这个组件的实例!后面详细介绍.

如何改名,我就不想多说了!
我们的工程名改为Exmaple,类名为Helloword

怎样使用工程和类

现在我们有了我们自己的工程(Example1)和类名(HelloWorld).以后我们就会在ASP代码中使用它们的名字来引用这个组件.在ASP中我们就这样引用,如下:

SetObjReference=Server.CreateObject("ProjectName.ClassName")

对于我们工程的引用就是:
SetObjReference=Server.CreateObject("Example1.HelloWorld")
现在我们就能用ObjReference来调用我们在组件中所创建的函数,子程序.下面我们会来写一个SayHello的子程序,我们执行它的代码如下:


〈%
SetObjReference=Server.CreateObject("Example1.HelloWorld")
ObjReference.SayHello
%>


为了在Helloword类中使用ASP的方法,你必须在此类中写一个OnStartPage
子函数.如下:


PublicSubOnStartPage(PassedScriptingContextAsScriptingContext)
SetMyScriptingContext=PassedScriptingContext
EndSub



现在,无论什么时候用户访问一个带有本组件的ASP文件,IIS就会把ScriptingContext传送给我们的对象请我们使用.这个ScriptingContext包括了全部的ASP方法和属性.实现上,这使得我们有能力访问所有ASP的对象.看下面的代码:


PublicSubOnStartPage(PassedScriptingContextAsScriptingContext)
SetMyScriptingContext=PassedScriptingContext
SetMyApplication=MyScriptingContext.Application
SetMyRequest=MyScriptingContext.Request
SetMyResponse=MyScriptingContext.Response
SetMyServer=MyScriptingContext.Server
SetMySession=MyScriptingContext.Session
EndSub


以后我们就能用在VB中用MyApplication来代替ASP中的Application,同理可以代替Request,Server.....,不过我们来是要在OnStartPage之前来申明这些变量:


PrivateMyScriptingContextAsScriptingContext
PrivateMyApplicationAsApplication
PrivateMyRequestAsRequest
PrivateMyResponseAsResponse
PrivateMyServerAsServer
PrivateMySessionAsSession



使用ASP的对象

我们的变量现在就能像标准的ASP对象来使用了!比如,我们经常在ASP中用Request.form()来收集提交表单的数据.现在我们在我们的VB中实现这个功能,代码如下:

用ASP中实现:
〈%
MyTempVariable=Request.Form("userName")
Response.Write("youentered"&MyTempVariable&"asyourusername")
%>


在VB中实现:


MyTempVariable=MyRequest.Form("userName")
MyResponse.Write("youentered"&MyTempVariable&"asyourusername")



通过使用MyResponse来代替Response,我们能够使用所有Response的方法,当然,MyResponse这个名字可以随便来取,你甚至可以就取Response.
另一件我们得注意的是,我们得在我们的建立的类中,写上OnEndPage子函数,这个OnStartPage是相反的!OnStartPage是创建对象,OnEndPage是消毁对象.



PublicSubOnEndPage()
SetMyScriptingContext=Nothing
SetMyApplication=Nothing
SetMyRequest=Nothing
SetMyResponse=Nothing
SetMyServer=Nothing
SetMySession=Nothing
EndSub



SayHello方法

我们来建立一个子函数,用于显示"HolleWorld".这个SayHello方法只是HelloWorld这个类中一个子函数,我们以后会在ASP中用以下的显示这个方法


〈%
SetObjReference=Server.CreateObject("Example1.HelloWorld")
ObjReference.SayHello
%>



SayHello的程序,很简单的!

PublicSubSayHello()
MyResponse.Write("HelloWorld")
EndSub



现在一个小型的组件编写完成,剩下的工作就是编译这个组件,在"工程"菜单中保存它,取什么名字都可以,我们用Exmaple1.vbp吧!然后就用在菜单中选择"makeexmaple1.dll",将其编译成DLL文件.一个组件就真正完成了!


注意,编译了此组件那么你就得先把你的PWS关掉,然后再编译此组件.否则VB就会告诉你些组件在使用中.

在ASP中使用我们的自己的组件.

当你更正了在编译中的错误,成功地编译了example1这个工程,现在你就得拿出你最喜欢的HTML编辑器来写下下面的语句,保存为ASP文件.


〈HTML>
〈HEAD>
〈TITLE>Example1〈/TITLE>
〈/HEAD>

〈BODY>

〈%
SetObjReference=Server.CreateObject("Example1.HelloWorld")
ObjReference.SayHello
%>

〈/BODY>
〈/HTML>

运行后即可看到结果:

HelloWorld

注册组件

如果你想和你的朋友,邻居分享你的组件,那么你就得在你的系统上注册你的组件.我们一般使用Regsvr32.exe来注册组件.注册后你的组件会出现在Win95/Win98的windows/system目录中.下面是一个注册的例子:

Regsvr32.exeC:/wwwroot/Example1/Example1.dll


在你的系统中,VB会自动给你注册,所以你很少用到Regsvr32.exe

这里只是写了一个非常小的组件,你可以写好自己的更大的组件,而且还可以用VB中的很多控件.


附录:建立注册DLL和反注册DLL文件的快捷方式
有的程序员经常要注册或者反注册自己写的dll文件,加一个快捷方式会减少自己的工作量:

Windows Registry Editor Version 5.00


[HKEY_CLASSES_ROOT\dllfile\shell]


[HKEY_CLASSES_ROOT\dllfile\shell\register]


[HKEY_CLASSES_ROOT\dllfile\shell\register\command]

@="regsvr32 %1"


[HKEY_CLASSES_ROOT\dllfile\shell\Unregister]

"Command"="regsvr32 %1 /u"


[HKEY_CLASSES_ROOT\dllfile\shell\Unregister\command]

@="regsvr32 %1 /u"

当我们需要注册或者反注册dll时,只要在该dll文件上按下鼠标右键即可!



附录注册和注销dll文件的方法:
一个快速注册 DLL 及 OCX 的方法
有时候我们在 VB 中要引用某一个 DLL 或 OCX 时,会出现文件未注册的讯息,这时,我们可以使用人工注册的方法,也就是直接在命令列中使用 regsvr32.exe 来做,做法如下:

文件注册:C:\Windows\System\Regsvr32.exe C:\Windows\System\Test.ocx
取消注册:C:\Windows\System\Regsvr32.exe /u C:\Windows\System\Test.ocx

这些动作我们也可以直接写到程序中,使用 Shell 来执行,但是我现在要说的,都不是上面提到的方法!



1、在资源管理器中找到 C:\Windows\System\Regsvr32.exe 并【复制】 ( 按鼠标右键选复制 )
2、将目录移到 C:\Windows\SendTo 后,执行【贴上快捷方式】 ( 按鼠标右键选贴上快捷方式 )
3、将快捷方式名称改成【REGISTER】
4、OK

现在,如果您想替某一个文件做注册动作,例如:C:\Windows\System\Test.ocx,您只要打开资源管理器,找到 C:\Windows\System\Test.ocx,按鼠标右键选【传送到】【REGISTER】即可完成注册动作了!

注:有一个地方要注意的是,Regsvr32.exe 只能注册 32 位的文件!如果要用它来注册 16 位的文件,会有错误讯息产生。


附录 某些dll文件的功能:
一、轻松修复IE浏览器

  很多经常上网的朋友都有过 这样的遭遇:IE不能打开新的窗口,用鼠标点击超链接也没有任何反应。这时重装IE一般能解决问题。其实不必这么麻烦,使用Regsvr32命令就可以轻松搞定。

  在“开始→运行”中键入“regsvr32 actxprxy.dll”命令,点击“确定”按钮,这时会弹出一个信息对话框“DllRegisterServer in actxprxy.dll succeeded”,点击“确定”;然后再在“开始→运行”中键入“regsvr32 shdocvw.dll”命令,单击“确定”即可。重新启动后IE已经被轻松修复了。

二、解决Windows无法在线升级的问题

  Windows的漏洞很多,每隔一段时间就需要使用“Windows Update”升级程序进行在线升级,不过“Windows Update”经常出现无法使用的情况,这时,我们可以使用Regsvr32来解决这个问题。

  在“开始→运行”中键入“regsvr32 wupdinfo.dll”,点击“确定”按钮,这样在系统中就重新注册了“Windows Update”组件,重新启动后问题已经解决。

三、防范网络脚本病毒有新招

  网络脚本病毒嵌在网页中,上网时在不知不觉中机器就会感染上这种病毒。笔者认为单纯使用杀毒软件并不能有效地防范这些脚本病毒,必须从病毒传播的机理入手。网络脚本病毒的复制、传播都离不开FSO对象(File System Object,文件系统对象),因此禁用FSO对象就能有效地控制脚本病毒的传播。操作方法很简单:

  在“开始→运行”中键入“regsvr32 /u scrrun.dll”就可以禁用FSO对象;如果需要使用FSO对象,键入“regsvr32 scrrun.dll”命令即可。

四、卸载Win XP自带的“鸡肋”功能

  Win XP以功能强大而著称,但有些功能却常常令人有“鸡肋”之感,比如Win XP自带的ZIP功能和图片预览功能,不仅占用了系统资源,功能也远不如第三方软件强大。其实用Regsvr32命令可以很容易地卸载这些功能。

  在“开始→运行”中键入“regsvr32 /u zipfldr.dll”,单击“确定”按钮,弹出卸载成功信息框后就完成了ZIP功能的卸载;要恢复ZIP功能,键入“regsvr32 zipfldr.dll”即可。同样,卸载图片预览功能也很简单,在“开始→运行”中键入“regsvr32 /u thumbvw.dll”即可;如果要恢复该功能,只须键入“regsvr32 thumbvw.dll”。

五、让WMP播放器支持RM格式

  很多朋友喜欢用Windows Media Player(以下简称WMP)播放器,但是它不支持RM格式,难道非得安装其它播放软件吗?笔者有办法。

  以Win XP为例,首先下载一个RM格式插件,解压缩后得到两个文件夹: Release(用于Windows 9x)和Release Unicode (用于Windows 2000/XP);将Release Unicode文件夹下的RealMediaSplitter.ax文件拷贝到“系统盘符\WINDOWS\System32\”目录下;在“开始→运行”中键入“regsvr32 RealMediaSplitter.ax”,点击“确定”即可。接着下载解码器,如Real Alternative,安装后就能用WMP播放RM格式的影音文件了。

附录:注册和反注册dll文件的批处理



dll.bat
------------------------------
@Regsvr32.exe AdminDLL.dll


un.bat
-------------------------------------
@Regsvr32.exe /u AdminDLL.dll
posted @ 2010-06-01 12:47 Eric_jiang 阅读(440) | 评论 (0)编辑 收藏

译者序
原书序
致谢
第1章 由随意编程转变为遵循软件工程原则
1.1 规则1-1:最大限度地发挥VB编译期类型检查的潜能
1.1.1 在每个模块的顶端使用Option Explicit语句
1.1.2 避免不经意地使用Variant数据类型
1.1.3 在VB IDE中运行时,使用Start With Full Compile命令
1.2 规则1-2:使用Debug.Assert显式声明假设
1.3 规则1-3:编译期条件不同时,考虑使用#If语句
1.4 规则1-4:抛出错误以提示异常
1.5 规则1-5:有效的错误处理:局部捕获,全局处理
1.6 规则1-6:了解类型和类的区别
1.7 规则1-7:采用面向对象的设计方法
1.8 规则1-8:推荐采用用户自定义类型而不是类来定义值类型
1.9 规则1-9:一般任务的自动化

第2章 设计、构建和使用基于COM的组件
2.1 规则2-1:从接口的角度进行思考
2.2 规则2-2;使用自定义接口
2.3 规则2-3:最好使用IDL独立定义自定义接口
2.4 规则2-4:使用自定义回调避免基于类的事件的局限性
2.5 规则2-5:要谨慎保持兼容性
2.5.1 脚本客户端程序
2.5.2 已编译的客户端程序
2.5.3 版本兼容的接口
2.6 规则2-6:选用正确的COM激活技术
2.6.1 COM激活
2.6.2 New操作符
2.6.3 CreateObject
2.6.4 GetObject
2.6.5 GetObjectContext.CreateInstance和Server.CreateObject
2.6.6 性能考虑
2.7 规则2-7:慎重使用Class_Terminate
2.8 规则2-8:根据会话而不是实体来建模
2.9 规则2-9:除了简单的小规模应用系统,避免使用ActiveX可执行程序

第3章 MTS、COM+和VB-中间层
3.1 规则3-1:理解MTS和COM+应用程序设计
3.2 规则3-2:不要在MTS或COM+中使用单例
3.3 规则3-3:了解New、CreateObject及GetObjectContext.CreateInstance的适用场合
3.3.1 MTS和Windows NT4
3.3.2 COM+和Windows 2000
3.3.3 使用New遇到的更多问题
3.4 规则3-4:理解使用SetComplete的真实目的
3.5 规则3-5:对事务自动中止方式的思考
3.6 规则3-6:不要重新设计DBMS
3.7 规则3-7:不必配置所有组件
3.8 规则3-8:避免将以后会后悔的东西编译进DLL
3.9 规则3-9:将代码从MTS向COM+移植的实践技巧
3.9.1 在COM+中不再需要调用GetObjectContext.CreateInstance
3.9.2 将Me作为参数传递时,不再需要调用SafeRef
3.9.3 当事务中的次要对象返回错误时要小心;可能会获得形如"Method~of Object Failed~"的错误信息,而不是所指定的在错误传播之前返回的丰富错误信息
3.9.4 使用ObjectConstruct字符串
3.9.5 在COM+应用程序中进行进程内调用时执行声明性安全校验
3.9.6 在COM+中刷新组件命令不再是必需的
3.9.7 在安装Windows 2000以前版本的计算机上,COM+导出的客户安装程序需要Microsoft Installer(MSI)
3.10 规则3-10:编写运行于MTS和COM+中的代码的实践技巧
3.10.1 创建对象时坚持使用GetObjectContext.CreateInstance
3.10.2 使用可编程控制的安全措施对访问权限进行校验,而不要依赖于声明性安全措施
3.10.3 事务性方法调用失败时,在次要对象中最好使用DisableCommit而不是SetAbort
3.10.4 不要无意中将DLL安装到用户计算机上
3.10.5 坚持使用ObjectContext接口
3.10.6 分发对象引用时继续使用SafeRef

第4章 Web和VB
4.1 规则4-1:理解IIS体系结构
4.1.1 IIS的内部结构
4.1.2 提高服务器的可扩缩性
4.2 规则4-2:管理应用程序状态以达到最高效率
4.2.1 使用BAS模块数据
4.2.2 使用SPM
4.2.3 使用ASP Application对象
4.2.4 权衡各种方案的利弊
4.3 规则4-3:管理会话状态以达到最大可扩缩性
4.3.1 将会话限制在单机上
4.3.2 在客户机上存储会话信息
4.3.3 使用cookie
4.3.4 QueryString变量
4.3.5 隐藏的表单域
4.3.6 在数据库中存储状态信息
4.4 规则4-4:理解DCOM和HTTP的区别
4.4.1 使用RPC和DCOM进行通信
4.4.2 使用HTTP通信
4.4.3 在分布式应用程序中不使用ASP
4.4.4 使用HTTP的不利方面
4.5 规则4-5:为脚本环境(如ASP)编写COM组件
4.5.1 创建默认接口
4.5.2 向可编写脚本的对象传递参数
4.5.3 关于自定义接口
4.5.4 解决方案
4.6 规则4-6:理解COM对象与ASP之间如何交互
4.6.1 ASP内置对象
4.6.2 VB COM对象和STA
4.6.3 充分利用STA线程模型
4.6.4 在VB中如何访问ASP内置对象
4.6.5 直接访问ASP内置对象的好处
4.6.6 使用ASP内置对象的弊端
4.7 规则4-7:使用XML代替专有数据传输格式
4.8 规则4-8:慎重考虑表示和业务逻辑的关系
4.8.1 使用MTS组件
4.8.2 使用WebClasses
4.9 规则4-9:从数据到表示的XSLT实现
4.9.1 XSLT的概念
4.9.2 XSLT方法的好处
4.9.3 使用过程方法转换数据集
4.9.4 利用XSLT的方法转换数据集
4.9.5 XSLT的缺点

第5章 VB高效数据访问
5.1 规则5-1:高效访问的基础:往返开销、SQL语句和数据提供者
5.1.1 使往返开销最少
5.1.2 确定发送SQL查询的最好方法
5.1.3 选择合适的提供者
5.2 规则5-2:不要过分封装数据访问
5.2.1 纯粹的面向对象技术
5.2.2 追求纯粹OOD效果的不足之处
5.2.3 解决办法:使用存储过程
5.2.4 如果需要多个数据库服务器该如何处理
5.3 规则5-3:切莫将数据库连接当代数据成员
5.4 规则5-4:死锁是常见的-防错性程序开发
5.4.1 锁定
5.4.2 串行化事务和锁管理器
5.4.3 死锁
5.4.4 在应用程序设计中尽量减小死锁的几率
5.4.5 将事务运行时间降到最短
5.4.6 将锁定时间降至最短 
5.5 规则5-5:尽可能使用firehose游标
5.6 规则5-6:作出正确的数据搜索决策(避免滥用SelectSingleNode)
5.6.1 Seek-and-Find组件
5.6.2 了解解决具体问题需选用哪一种方法
posted @ 2010-05-31 19:03 Eric_jiang 阅读(426) | 评论 (0)编辑 收藏

1.引言
 
   许多商业应用程序允许用户在应用程序中生成基于某些数据的报表。电子表格特别适合用于生成这样的报表。电子表格不仅可以将数据经格式化以后以结构化的形式展现给用户,而且为用户提供了快速且高效的数据处理功能。正如上面所说的,OpenOffice.org的API提供了大量的类和方法以方便开发者将OpenOffice.org电子表格的功能集成到他们自己的应用程序中。在应用程序中,单击某个按钮就可以启动OpenOffice.org并将应用程序生成的数据以自定义电子表格的形式展现出来。

   新手可能就这个开发领域很自然地提出一个问题:“一旦开发者正确地安装了所有需要的软件后,一个应用程序如何启动OpenOffice.org的新实例以及如何获取连接呢?”。这个问题得到了需要的回答之后,开发者还可能提出:“现在用户应用程序已经获取了OpenOffice.org的连接,那么应用程序应该如何将这些数据嵌入到电子表格中呢?”。在这篇文章中,我们将首先着重满足不熟悉OpenOffice.org的API的开发者的两个基本的需求。我们将向开发者展示如何获取到OpenOffice.org的连接,如何将应用程序的数据转化为电子表格形式的数据。接着我们将讨论一些其他的主题,这些主题包括以编程方式构建和析构电子表格、设置电子表格的单元格的背景颜色以及单元格边框的格式化。然而,这里需要注意的是我们只关注OpenOffice.org本身的集成,为了代码的可读性我们忽略了诸如错误处理之类的问题。在这篇文章的结尾,您将对OpenOffice.org的API处理电子表格和如何在您自己的应用程序中利用它们的相关知识有所了解。

   这篇文章涉及的应用程序是基于Swing的应用程序,它通过使用OpenOfiice.org的API来访问OpenOffice.org的各种功能。当然,您也可以使用C++或者COM/DCOM技术来连接OpenOffice.org。此类应用程序的代码并不一定必须基于Swing来编写。这样的应用程序可以使用C++、Java servlet、Java Server Page、JavaScript、VBScript、Delphi以及Visual Basic来编写。这篇文章中使用的基于Swing的应用程序将使用NetBeans IDE来构建,并且使用NetBeans Platform作为起始点。尽管任何集成开发工具都可以被用来构建如此简单的应用程序,但是使用NetBeans进行开发具有两项优势。首先,在NetBeans中我们可以充分发挥GUI构建器(即Matisse)的功能来构建用户界面,GUI构建器可以帮助我们快速建立应用程序界面的原型。其次,将我们的应用程序基于NetBeans Platform意味着我们不需要再重头开始,而且我们可以通过其提供的模块框架来增强应用程序的可扩展性。这个应用程序将生成如下图所示的不需要任何后期处理的电子表格文档:


电子表格中的数据来自于JTable组件。在现实情况下,这些数据往往来源于数据库中。在上面述及的应用程序中,我们将把数据硬编码在程序代码中,这主要是因为数据的来源问题已经超出本篇文章的范围了。无论数据是否是来自于数据库,当用户已经完成了数据的处理后,应用程序将把JTable中的数据转换生成电子表格来呈现。除了数据之外,上面的图还展示了以下几个元素,这些元素将在下面的章节中述及:

  表头,电子表格有一行使用特殊颜色(深蓝色)标识的表头。
  行颜色的交错,电子表格中的其他行的颜色是交错的,有的背景色是桔色,而有的是白色。
  高或者低的回复,最后一列展示了某篇文章相关的回复数量,回复量比较高的行的背景颜色是绿色,而回复量比较低的行的背景颜色是红色,另外,在主表格的下方的两个单元格分别使用相同的颜色来标识高或者低回复文章的作者。
  回复的总数,“Reply”列的最后一行的下方的单元格显示了总回复数,这个单元格的格式与其他的单元格不太一样,总回复数是通过OpenOffice.org的API来使用Calc的公式计算得到的。
电子表格名称,在上面图形的左下角,您可以看到“Javalobby Analysis”这样的名称,而您并没有看到Calc打开时的默认的电子表(名称为“Sheet1”、“Sheet2”、“Sheet3”),如下文所阐述的,电子表的名称的更改和默认电子表的移除都可以使用编程方式来实现。
   这篇文章被分为三部分,这三部分按顺序描述了开发的过程:

  简化重复的编码任务,这一节中我们将了解OpenOffice.org的API中可复用的元素,而这些元素将在后面的章节中被集成到我们的应用程序中。
建立用户界面原型,为了测试最后一节中的业务逻辑,我们将构建Swing应用程序的原型。
集成辅助性方法,应用程序的核心是将辅助性方法和用户界面集成起来,并且执行计算,生成电子表格。
2.系统需求
   在开始之前,请先确认以下的软件已经安装好了:

OpenOffice.org,尽管这篇文章中的代码也兼容Star Office,但是因为我们使用OpenOffice.org的API相关的JAR文件,所以最好是安装OpenOffice.org。我们将使用在OpenOffice.org的安装目录下的四个JAR文件,您可以在OpenOffice.org 2.0\program\classes文件夹中找到以下四个JAR文件:juh.jar、jurt.jar、ridl.jar和unoil.jar。
NetBeans IDE,这篇文章关注的是OpenOffice.org的API,其中讨论的代码可以使用很多种编程语言描述,可以供多种语言编写的应用程序使用。如果您想构建这篇文章中描述的基于Swing的应用程序,您就需要去下载NetBeans 5.0或者更高的版本。
   注意:这篇文章中展现的应用场景并不需要使用OpenOffice.org SDK。如果我们要使用SDK中的idlc或者javamaker等工具,那么这个时候才需要SDK。

3.背景知识:简化重复的编码工作
   当我们使用OpenOffice.org的API工作时,我们可能会重复地执行某些任务。比如说,我们设置电子表格表头的颜色,但是同时我们也需要设置其他各行的颜色。实际上,我们经常交替地设置各行的颜色,这样可以使得电子表格中的行更容易分辨。如果某篇文章的回复数比较高,我们会将对应的行设置为不同的颜色(绿色),而回复数比较低的行也被设置为不同的颜色(红色)。行的颜色的设置需要编写使用OpenOffice.org的API中的很多方法的几行代码,而为了避免重复编写相同的代码,我们将这些代码组织到一个辅助性方法当中去,在需要进行设置的时候,我们只需要将颜色作为参数传递就可以了。这可以使我们的代码易读性更好,更容易维护。下面我们将更详细地讨论这些辅助性方法。

   请记住,以下述及的辅助性方法可以用于任何应用程序,这些辅助性方法并不依赖于本篇文章里述及的应用程序。换句话说,您可以充分地利用这些辅助性方法,在需要的时候不需要对代码进行任何修改就可以将这些代码粘贴到应用程序的Java文件中使用。您也可以在您的代码中引用这些代码,就像这篇文章中做的一样。

  3.1 使用引导程序
   OpenOffice.org的Java API有自己的方法来引导OpenOffice.org。所谓“引导”OpenOffice.org,我们的意思是加载OpenOffice.org的启动程序。这通过寻找juh.jar文件所在的位置,然后在这个位置或者上一级目录查找soffice(.exe)来实现。这需要将juh.jar文件置于系统变量CLASSPATH所描述的目录中,这样本章构建的应用程序就可以访问到这个文件。然而,这里需要将juh.jar文件随同应用程序一起分发,这种情况下,这种引导机制就不奏效了。

   为了解决这个问题,有两种可能的方法。首先,可以确保Java随时都可以查找到soffice(.exe),这可以通过将包含可执行文件的目录加入到Windows的PATH系统变量中(在Mac、Unix和Linux中就是LD_LIBRARY_PATH系统变量)。这种方法需要用户进行一些操作,而我们并不希望这样做。

   因此,我们更倾向于推荐第二种方法,这种方法需要与访问修饰符协同工作。在Sun的JDK中,ClassLoader系统类是URLClassLoader类的实例。这个类有一个私有方法addURL,这个方法在Java系统开始的时候将被调用,从而将JAR文件以及其他相关资源添加到系统环境中。通过反射机制,我们获取一个URLClassLoader的实例,尔后使得addURL方法达到可访问状态,然后再将包含可执行文件的目录添加到URLClassLoader的URL栈中。这虽然显得很晦涩,但是这种方法很奏效。

   但是,它真的那么奏效吗?与系统类的访问修饰周旋总是一件冒险的事情。addURL方法被声明为protected型的,自然有其理由。另外,谁能保证使用的一定是Sun的JDK呢?或者Sun可能在随后的版本中忽略这个方法?然而,Java规范对上述这些事情并没有作出明确的声明,因此别的JDK在默认情况下并不是将ClassLoader类的类型配置为URLClassLoader。正是这个原因,我们使用“loader instanceof URLClassLoader”这样的检查代码来确保事情是如预期那样的。这也是我们在用户没有使用Sun的JDK的情况下确保应用程序没有任何异常情况而需付出的代价。

   关于过程中构建对象的更详细的信息请参考OpenOffice.org的开发指南《第6章  Office开发》。

public Object simpleBootstrap(String pathToExecutable) throws Exception
{
    //Get the executable from the incoming String:
    String ooBaseDirectory = pathToExecutable.replaceAll("soffice(.exe){0,1}$","");
    System.out.println("Your ooBaseDir is: " + ooBaseDirectory);
    ClassLoader loader = ClassLoader.getSystemClassLoader();
    if (loader instanceof URLClassLoader){
        URLClassLoader cl = (URLClassLoader)loader;
        Class sysclass = URLClassLoader.class;
        try {
            Method method = sysclass.getDeclaredMethod
                ("addURL", new Class[]{URL.class});
            method.setAccessible(true);
            method.invoke(cl, new Object[]{new File(ooBaseDirectory).toURL()});
        } catch (Throwable t) {
            t.printStackTrace();
            throw new IOException("Error, could not add URL to system classloader");
        }
    } else {
        System.out.println("Error occured, URLClassLoader expected but " +
        loader.getClass() + " received. Could not continue.");
    }
    //Get the office component context:
    XComponentContext xContext = Bootstrap.bootstrap();
    //Get the office service manager:
    XMultiComponentFactory xServiceManager = xContext.getServiceManager();
    //Create the desktop, which is the root frame of the
    //hierarchy of frames that contain viewable components:
    Object desktop = xServiceManager.createInstanceWithContext
        ("com.sun.star.frame.Desktop", xContext );
    return desktop;
}


   另一中方法就是使用远程连接。在远程连接中,服务器名称和端口号作为参数传递给远程连接方法,然后这个方法启动OpenOffice.org并返回Desktop对象,这个对象是利用OpenOffice.org工作的起点。而且在远程连接的情况下,您可以让用户选择服务器和端口,或者您可以在代码中使用系统设置来提供服务器和端口,这都看您的选择。


--------------------------------------------------------------------------------

3.2  电子表格文档的建立和加载
   上一节描述的方法帮助我们从服务管理器中获取了com.sun.star.frame.Desktop服务。Desktop可以根据给定的URL来加载新的或者已经存在的组件。为了提供这样的服务,Desktop实现了com.sun.star.frame.XcomponentLoader接口,这个接口只有一个方法根据给定的URL加载和实例化对应的组件。要构建一个新的电子表格文档组件,可以使用“private:factory/scalc”这样的URL。关于更详细的信息请参考OpenOffice.org开发指南《第8章  电子表格》中的8.2.1 “电子表格文档的建立和加载”。

public XComponent getSpreadsheetComponent(Object desktop, String templateURL)
    throws Exception
{
    XComponentLoader xComponentLoader =
        (XComponentLoader)UnoRuntime.queryInterface(XComponentLoader.class, desktop);
    PropertyValue[] pPropValues;
    pPropValues = new PropertyValue[0];
    return xComponentLoader.loadComponentFromURL(templateURL, "_blank",0, pPropValues);
}

 

   下面这个方法将由用户界面所调用,在调用之前用户需要将必要的参数传递给上面代码中描述的方法:

XComponent xSpreadsheetComponent =
    oooHelper.getSpreadsheetComponent(desktop, "private:factory/scalc");

 

   接着,我们需要获取电子表格文档对象:

public XSpreadsheetDocument getXSpreadsheetDocument(XComponent xSpreadsheetComponent)
    throws Exception
{
    return(XSpreadsheetDocument)UnoRuntime.queryInterface
        (XSpreadsheetDocument.class, xSpreadsheetComponent);
}

 

   下一个定义的方法,getXSpreadsheet( ),定义如下,这个方法帮助我们精确定位要与哪个电子表格文档进行交互。默认情况下,Calc应用程序在启动的时候就已经建立好了三个电子表。这三个电子表的名称分别是“Sheet1”、“Sheet2”、“Sheet3”,这三个电子表会随着您启动Calc应用程序而打开。如果您将字符串“Sheet1”传递给getXSpreadsheet( )方法,那么接下来您所做的改动都将在“Sheet1”电子表中进行。然而,您或许想要给自定义的电子表起一个不同于默认命名方式的名字。比如说,您将电子表命名为“Javalobby Article Analyzer”。如果您将这个名字作为参数传递给getXSpreadsheet( )方法,一个以此字符串命名的电子表将被构建。

   然而,默认情况下,叫“Sheet1”的电子表仍然是当前电子表,所谓当前电子表就是在应用程序启动时呈现在用户面前的那个电子表。无论您是否新建电子表,默认的三个电子表始终都是存在的。假如您想将您自己定义的电子表设为当前状态,您可以有两种选择。一种是使用在getXSpreadsheet( )方法之后定义的getXActiveSpreadsheet( )方法,另外您可以直接将默认的三个电子表删除掉,就如下面的getXSpreadsheet( )方法中的一样,而一旦这三个电子表被删除之后也就只剩下您自定义的那个电子表了,所剩的最后一个电子表也就理所当然地成为当前电子表了。

public XSpreadsheet getXSpreadsheet(XSpreadsheetDocument xSpreadsheetDocument, String name)
    throws Exception
{
    XSpreadsheets xSpreadsheets = xSpreadsheetDocument.getSheets();
    //See section 2.5.2 of the OpenOffice.org API:
    xSpreadsheets.insertNewByName(name, (short)0);
    Object sheet = xSpreadsheets.getByName(name);
    xSpreadsheets.removeByName("Sheet1");
    xSpreadsheets.removeByName("Sheet2");
    xSpreadsheets.removeByName("Sheet3");
    return (XSpreadsheet)UnoRuntime.queryInterface(XSpreadsheet.class, sheet);
}

 

   接下来的方法是如何将电子表设为当前电子表:

public XSpreadsheet getXActiveSpreadsheet(XComponent xSpreadsheetComponent,
    XSpreadsheet xSpreadsheet) throws Exception
{
    XModel xSpreadsheetModel = (XModel)UnoRuntime.queryInterface(XModel.class,
        xSpreadsheetComponent);
    XController xSpreadsheetController = xSpreadsheetModel.getCurrentController();
    XSpreadsheetView xSpreadsheetView = (XSpreadsheetView)UnoRuntime.
        queryInterface(XSpreadsheetView.class, xSpreadsheetController);
    xSpreadsheetView.setActiveSheet(xSpreadsheet);
    return xSpreadsheet;
}


--------------------------------------------------------------------------------
3.3  数据的设置
   我们需要使用的有三种类型的数据。在开始之前,我们需要有个方法来获得对单元格的访问。这一节的其他辅助性方法也将使用此方法,定义如下:

public XCell getXCellByPosition(XSpreadsheet xSpreadsheet, int x, int y)
    throws Exception
{
    return xSpreadsheet.getCellByPosition(x, y);
}


   首先,我们将要接触到文本类型的数据,比如说Javalobby文章的标题。对于这种数据,辅助性方法需要电子表对象、列位置、行位置以及数据本身作为参数。

public void setTextValueOfXCellAtPosition(XSpreadsheet
    xSpreadsheet, int x, int y, String value) throws Exception
{
    //We first identify the cell we need to work with,
    //using the incoming x and y values:
    XCell xCell = getXCellByPosition(xSpreadsheet, x, y);
    //Next, since we're working with text, we define
    //a text object and a cursor object and insert the received content into the cell:
    XText xText = (com.sun.star.text.XText)UnoRuntime.queryInterface(com.sun.
        star.text.XText.class, xCell);
    XTextCursor xTextCursor = xText.createTextCursor();
    xText.insertString(xTextCursor, value, false);
}

 

   其次,对于数字类型的数据,比如说“Reply”列的数据,辅助性方法要求传递double类型的参数:

public void setNumValueOfXCellAtPosition(XSpreadsheet
    xSpreadsheet, int x, int y, double value) throws Exception
{
    //First we get the cell identified by the received x and y values:
    XCell xCell = getXCellByPosition(xSpreadsheet, x, y);
    //Then we add the received value to the identified cell:
    xCell.setValue(value);
}


   最后,尽管Calc的公式是普通的字符串,我们可以使用OpenOffice.org的API所包含的单元格样式属性来为单元格设置预定义的“Result”样式,这主要是针对我们汇总回复总数的计算公式来进行设置:

public void setFormulaOfXCellAtPosition(XSpreadsheet
    xSpreadsheet, int x, int y, String formula) throws Exception
{
    //We get the cell defined by the incoming x and y values"
    XCell xCell = getXCellByPosition(xSpreadsheet, x, y);
    //We add a Calc formula to the cell, as received by the helper method:
    xCell.setFormula(formula);
    //We attach a property set to our cell, so that we can define a property:
    XPropertySet xCellProps = (XPropertySet)UnoRuntime.
        queryInterface(XPropertySet.class, xCell);
    //We set the style of the cell, using a predefined "Result" style,
    //which comes out of the box with the OpenOffic.org API:
    xCellProps.setPropertyValue("CellStyle", "Result");
}


  3.4  颜色的使用
   下面的代码将在随后被使用:

if (position%2 == 0)
{
    oooHelper.setColorRow(xSpreadsheet, position, 0xFF9933);
}


   在ARGB颜色空间中,0xFF9933代表橙色。如果行数是偶数,那么电子表、行数以及橙色会被作为参数传递给方法:

public void setColorRow(XSpreadsheet
    xSpreadsheet, int row, int color) throws Exception
{
    //First we get the range of cells we want to deal with,
    //which is the whole spreadsheet:
    XCellRange xCellRange = (XCellRange)UnoRuntime.queryInterface
        ( XCellRange.class, xSpreadsheet );
    //Next, we narrow down our selection further,
    //going from column 0/current row to column 3/current row,
    //which is a whole row from left to right:
    XCellRange xSelectedCells = xCellRange.getCellRangeByPosition(0, row, 3, row);
    //Next, we create a property set and assign it to our selected range:
    XPropertySet xCellProps =
        (XPropertySet)UnoRuntime.queryInterface(XPropertySet.class,xSelectedCells);
    //This line sets the color to white, which basically
    //refreshes the row color before we add our new row color:
    xCellProps.setPropertyValue("CellBackColor", new Integer(16777215));
    //This line sets the color to whatever is received,
    //in this case orange:
    xCellProps.setPropertyValue("CellBackColor", new Integer(color));
}


   如果用户需要看到“Most Replies”或者“Least Replies”,我们将使用以下代码进行设置:

ooHelper.setColorCell(xSpreadsheet, 2, jTable1.getRowCount()+5, 0x008000);


   以下的方法需要电子表、列数、行数以及颜色值作为参数:

public void setColorCell(XSpreadsheet xSpreadsheet, int column, int row, int color)
    throws Exception
{
    //First, we select the entire received spreadsheet:
    XCellRange xCellRange = (XCellRange)UnoRuntime.queryInterface( XCellRange.class,
        xSpreadsheet );
    //From the received spreadsheet, we select a single cell,
    //defined by the row and column received:
    XCellRange xSelectedCells = xCellRange.getCellRangeByPosition(column,
        row, column, row);
    //We define a property set, an object to contain the cell's properties:
    XPropertySet xCellProps = (XPropertySet)UnoRuntime.queryInterface
        (XPropertySet.class, xSelectedCells);
    //This line sets the color to white, to refresh the cell:
    xCellProps.setPropertyValue("CellBackColor", new Integer(16777215));
    //This line sets the background color of the cell to whatever is received:
    xCellProps.setPropertyValue("CellBackColor", new Integer(color));
}

 

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/mrdangdong/archive/2009/01/08/3733421.aspx

posted @ 2010-05-31 08:40 Eric_jiang 阅读(1502) | 评论 (0)编辑 收藏

当我们在JavaScript中,要执行一 个函数往往都是这样写

function aa(){

    alert("first function");

};

aa();

有人会问能否再简化呢?答案是肯定的!只要你愿意我们还可以通过括号直 接调用函数

(function aa(){

    alert("(function)();");

})();

当然,也又别的方法,试试在函数前写上+或 者-吧!

+function aa(){

    alert("+function();");

}();

这是,我们浏览器中的代码应该是这样的:

<html>

    <head>

        <title>JavaScript 高级编程 之 同名函数的执行顺序</title>

        <script language="javascript" type="text/javascript">

            function aa(){

                alert("first function");

            };

            aa();

            (function aa(){

                alert("(function)();");

            })();

            +function aa(){

                alert("+function();");

            }();

        </script>

    </head>

    <body>

    </body>

</html>

现在让我们来想一想浏览器会出现怎样的结果?

坐在后排的那哥们儿举手了。听听他怎么说,他说:

浏览器会按照1.first function 2.(function)(); 3.+function(); 方式执行

我肯定一定会有很多人这样回答。好的,你可以坐下了。还是让我们去看看 执行的结果吧!

浏览器结果: 1.+function(); 2.(function)(); 3.+function(); 真是不可思议,为什么呢?

难道浏览器会认为在函数前面写+或者-会 让函数的执行级别更高?事实并非如此!下面我们再写一个函数,便可以证明这个结论是错误的。

function aa(){

    alert("last function");

};

或许,我们还会有带参的函数需要执行。

function aa(msg){

    alert(msg);

}

aa("hello topcss!");

好了,我们再去看看浏览器是否执行最后一个函数,也就是带参的函数呢。

的确,事实正是如此,她执行了最后一个函数。太棒了。

现在,我们得出了一个结论:

当我们在一个JavaScript程 序中,同时出现多个同名函数时,浏览器会去执行最后一个函数。

posted @ 2010-05-29 10:44 Eric_jiang 阅读(747) | 评论 (0)编辑 收藏

这几天频繁的远程登陆服务器,由于没有及时注销或者其他情况,早上再次登陆时系统提示:“终端服务器超出了最大允许连接数”。 

解决这个现像的办法很多,如果马上需要登陆服务器,最easy的方法是: 

开始-运行-mstsc /console /v: 服务器名或IP或域名:远程端口: 

如: mstsc /console /v:222.222.215.222:3389 

原因:用远程桌面链接登录到终端服务器时经常会遇到“终端服务器超出最大允许链接数”诸如此类错误导致无法正常登录终端服务器,引起该问题的原因在于终端服务的缺省链接数为2个链接,并且当登录远程桌面后如果不是采用注销方式退出,而是直接关闭远程桌面窗口,那么实际上会话并没有释放掉,而是继续保留在服务器端,这样就会占用总的链接数,当这个数量达到最大允许值时就会出现上面的提示。 

五步避免登陆报错 

一、用注销来退出远程桌面而不是直接关闭窗口 

打开“控制面板”,双击“添加删除程序”,单击“添加删除Windows组件”,“组件”,在Windows组件向导对话框中选中“终端服务” , “下一步”,“应用服务器”,“下一步”,然后按照提示即可改变终端服务的模式。 

Windows 2000终端服务有2种运行模式: 远程管理模式和应用程序服务器模式。远程管理模式允许系统管理员远程管理服务器,而且只允许2个终端会话同时登录终端服务器。应用程序服务器模式允许用户运行一个以上应用程序,允许多个用户从终端登录访问服务器。但是,应用终端服务的用户必须有终端服务授权,即必须在90天之内在这个域或工作组中设置终端服务授权服务器,否则用户需删除应用程序,然后再重新安装。 

二、限制已断开链接的会话存在时间 

1、从终端服务配置中修改 

运行-Tscc.msc(终端服务配置)-连接-双击RDP-Tcp或右击-属性-会话-选中第一个的替代用户设置(O)-结束已断开的会话[将默认值“从不”改为一个适当的时间,比如30分钟] 

2、从组策略修改 

开始-运行-gpedit.msc-计算机配置-管理模板-windows组件-终端服务-会话 

右边窗口选择 为断开的会话设置时间限制 -选择已启用,选择一个时间
三、增加最多链接数 

1、从终端服务配置中修改:运行-Tscc.msc(终端服务配置)-连接-双击RDP-Tcp或右击-属性,选择“网卡”选项卡-修改“最大连接数”改成你所需的值,当然这个值不也能太大,否则会占用较多的系统资源。不过这里修改的值好像不起作用,设置成无限制时照样还是会出现本文所说的情况。 

2、组策略级别要高于终端服务配置,当启用组策略后终端服务配置中的相应选项会变成灰色不可修改 

运行-gpedit.msc-计算机配置-管理模板-Windows组件-终端服务 

双击右边的“限制连接数量”-选择“已启用”-填入允许的最大连接数 

四、改变远程终端模式 

推荐使用: 

开始-管理工具-终端服务配置-服务器配置-限制每个用户使用一个会话 

五、修改本地安全策略 

控制面板》管理工具》本地安全策略》本地策略》安全选项》 

1、先找到》Microsoft网络服务器:在挂起会话之前所需的空闲时间 

默认为:15分钟,改为自己所需要的时间(就是登陆后无动作空闲超过多少时间后自动断开)

2、然后找到》网络安全:在超过登录时间后强制注销。默认为:已禁用,一定要改为:已启用
下面介绍一些mstsc的参数: 

Mstsc (Microsoft terminal services client) 

mstsc 与远程客户端之间是用Microsoft的远程桌面协议(Remote Desktop Protocol,简称RDP) 连接的,而windows xp的rdp有1个并发数的连接限制。对于每个用户来说,。rdp 文件在“我的文档”中是作为隐藏文件存储的。 

创建与终端服务器或其他远程计算机的连接,编辑现有“远程桌面连接 (。rdp)”配置文件,并将 Windows XP 连接(使用“客户端连接管理器”创建的连接)迁移到新的 .rdp 文件中。

mstsc语法 

mstsc.exe {ConnectionFile /v:server} [/console] [/f] [/w:width /h:height] 

mstsc.exe /edit“ConnectionFile” 

mstsc.exe /migrate 

mstsc参数 

ConnectionFile 指定用于连接的。rdp 文件的名称 

/v:server[;port] 指定要连接的远程计算机 

/admin 将连接到会话以管理服务器 

/f 在全屏幕模式下启动“远程桌面”连接 

/w:width 指定远程桌面窗口的宽度 

/h:height 指定远程桌面窗口的高度 

/public 在公用模式下运行远程桌面 

/span 是远程计算机的高度和宽度与本地虚拟桌面相匹配,如有必要扩展到多个显示器。若要扩展到多个显示器,所有显示必须具有相同的高度并垂直排列 

/console 连接到指定 Windows 2000 Server 的控制台会话 

/edit 打开指定的 .rdp 文件进行编辑 

/migrate 将使用“客户端连接管理器”创建的旧版连接文件迁移到新的 .rdp 连接文件中
posted @ 2010-05-28 13:43 Eric_jiang 阅读(239) | 评论 (0)编辑 收藏

仅列出标题
共57页: First 上一页 49 50 51 52 53 54 55 56 57 下一页