在ls中DLL的动态下载运行

DLL的动态下载运行
Lotus Domino 是网络上先进的群件和电子邮件服务器,与客户端应用 Lotus Notes
相配合,具有灵活的安全模式,支持任意大小的多企业构架,全域范围的搜索服务,支持对绝大部分企业系统级的实时访问,功能非常强大。但尺有所短,寸有所长,有时我们需要编制一些DLL来弥补其不足。但问题是这些DLL需要在本地机器上运行,我们不能手工地在每台机器上做拷贝,如果单位很大,工作站很多,或者有远程工作站,那么维护的工作量将非常巨大。下面介绍一种从Domino服务器上动态下载DLL到本地机器运行的方法。

  使用操作系统的DLL

  如果这些DLL是本地系统自己的API,则直接调用,这里我们举一个例子来说明。
  我们要求程序运行时判断本地系统时间,如果系统时间是1999年9月9日,则要求系统退出。
  1.在Declarations中,我们定义:
  Rem 声明一个SYSTEMTIME的结构
  Type SYSTEMTIME
wYear As Integer
wMonth As Integer
wDayOfWeek As Integer
wDay As Integer
wHour As Integer
wMinute As Integer
wSecond As Integer
wMilliseconds As Integer
  End Type
   Const WM—CLOSE = &H10
  声明过程或函数,它们都是kernel32.dll 或user32.dll中的API。
  Declare Sub GetLocalTime Lib ″kernel32″Alias ″GetLocalTime″ (lpSystemTime As
SYSTEMTIME)
  Declare Function GetActiveWindow Lib ″user32″ Alias ″GetActiveWindow″ () As
Long
  Declare Function CloseWindow Lib ″user32″ Alias ″CloseWindow″ (Byval hwnd As
Long) As Long
  Declare Function PostMessage Lib ″user32″ Alias ″PostMessageA″ (Byval hwnd As
Long, Byval wMsg As Long, Byval wParam As Long, Byval lParam As Long) As Long
  2.在Initialize事件中,我们键入如下代码:
  Dim stime As SYSTEMTIME
Dim hwnd As Long
   Rem 取得当前活动窗口的句柄
hwnd=GetActiveWindow()
Rem 取系统时间保存在SYSTEMTIME结构中
   Call GetLocalTime(stime)
If(stime.wyear=1999) And stime.wmonth=9 And stime.wDay=9 Then
Messagebox(″谢谢使用!″,MB—OK+16,″再见″)
   Rem 退出Notes
Call postmessage(hwnd,WM—CLOSE,0,0)
End If

  使用用户编制的DLL

  如果是用户编制的DLL,则调用起来稍微麻烦一点,因为本地机器上可能没有DLL,这就需要把它下载到本地。
  可以在需要DLL的Notes数据库中增加一个表单或者在表单中增加一个域用于保存DLL。下面的这个例子是把两个动态链接库my—1.dll和my—2.dll存放在DLLForm域中,当用户运行服务器中的Notes数据库时,程序开始搜索本地机器的系统目录,如果发现两个动态链接库已经在本地,则不下载,否则开始下载。下面是设计步骤:
  1.首先在Notes中建立一个名叫DllForm的表单,在表单中设计一个名叫DllInHere的RTF域,然后保存。
   以DllForm这个表单生成一个文档,文档的DllInHere域中附加了my—1.dll和my—2.dll两个Dll。
  2. 在Declaration 中我们声明:
  Declare Function GetSystemDirectoryA Lib ″kernel32″ (Byval lpBuffer As String,
Byval uSize As Long) As Long
  3.在Initalize事件中键入如下代码:
  Dim sysSize As Long
Dim uSize As Long
Dim sysPath As String
uSize = 50
  Rem 取得系统路径字符串的长度
sysSize=GetSystemDirectoryA(sysPath,uSize)
Rem 给系统路径变量置初值,确定准确长度
  For i=1 To sysSize
sysPath=sysPath+″″
Next
  Rem 取出Window的system目录或者Window NT的system32目录
sysSize=GetSystemDirectoryA(sysPath,uSize)
Dim pathName1,pathName2 As String, fileName1,fileName2 As String
Dim rtitem As Variant
Dim collection As NotesDocumentCollection
Set uidb = session.CurrentDatabase
′ Dim collection As NotesDocumentCollection
pathName1 = syspath+″/my—1.dll″
pathName2 = syspath+″/my—2.dll″
  Rem 判断本地系统是否已经下载
fileName1 = Dir$(pathName1, 0)
fileName2 = Dir$(pathName2, 0)
Rem 如果没有下载则从服务器下载
If fileName1 = ″″ Then
search$ = { Form = ″DllForm″ }
Set collection = uidb.Search( search$, Nothing, 0 )
If collection.Count = 0 Then
Print ″No dll″ Rem 判断文档是否存在
End If
   Rem 取得第一个文档中的 DllInHere域
Set pzdoc = collection.GetFirstDocument( )
Set rtitem = pzdoc.GetFirstItem( ″dll″ )
i=0
   Rem 判断域类型
If ( rtitem.Type = RICHTEXT ) Then
Forall o In rtitem.EmbeddedObjects
If i=0 Then
   Rem 下载第一个DLL到系统目录
Call o.ExtractFile (pathName1)
i=1
End If
If i=1 Then
   Rem 下载第二个DLL到系统目录
Call o.ExtractFile(pathName2)
End If
End Forall
End If
End If
  这样,DLL就下载到本地。DLL一旦下载完毕,应用程序就可以调用其中的函数了。

  小结

  在一个中等以上规模的企业中,网络中的节点往往有几百、上千个,客户端软件的升级是网络管理员最感到头疼的事,使用本文介绍的自动下载方法,可以极大地减轻管理员的工作负担。另外利用C++、VB等编制的DLL程序也是对Notes功能的一个有力补充

阅读更多
个人分类: lotus软件
想对作者说点什么? 我来说一句

DLL动态下载运行.mht

2015年07月28日 8KB 下载

c#动态引用DLL的方法.

2011年09月09日 21KB 下载

libevent的动态

2014年03月10日 375KB 下载

C#动态读取DLL

2016年09月18日 15KB 下载

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭