打印本文 打印本文 关闭窗口 关闭窗口
VB中定制DllRegisterServer、DllUnregisterServer
作者:武汉SEO闵涛  文章来源:敏韬网  点击数2488  更新时间:2009/4/23 15:43:03  文章录入:mintao  责任编辑:mintao
,网上有种方法就是替换调VB的LINK文件,然后中断一下,将OBJ文件拷贝出来,在用命令行编译。这是个很好的办法,但不够智能化,本人在国外网站上发现了一个更为有效的方法。

制作VB的辅助编译工具

         新建一个工程,命名为LINK,在MAIN过程中加入代码:

Public Sub Main()
    Dim cmd As String
    Dim fOut As Long
    Dim sOut As String
    Dim sDef As String
  
    cmd = Command$
    If InStr(cmd, "/DLL") > 0 And InStr(cmd, "VBAEXE6.LIB") > 0 Then
      fOut = InStr(cmd, "/OUT:")
      sOut = Mid(cmd, fOut + 6, InStr(cmd, "/BASE:") - fOut - 8)
      sDef = Left(sOut, Len(sOut) - 3) + "def"
      If Len(Dir(sDef)) Then
        cmd = cmd & "/DEF:"" "& sDef &" "" "
      End If
End If
    Shell "LINK32.EXE "& cmd
  End Sub

然后编译成LINK.EXE,先将VB目录下的LINK.EXE改名成LINK32.EXE,再将LINK.EXE拷贝到VB目录下,这样做的好处是不改变原有的编译过程,只是在编译DLL的时候才插入“/DEF:”参数,不会对编译其他程序造成影响。

         完成了替换操作后,如果要输出其他函数,只需要在程序输出目录下编辑一个和输出文件同名的后缀为“.DEF”的文件就可以了。

开始替换DllRegisterServer、DllUnregisterServer

1、制作注册和注销的工具库ComRegisterDll

         新建一个工程,引入两个库:ISA helper Com component 1.0 type library和 TypeLib Information。再创建一个类ComRegister,在ComRegister类中实现一个方法:

RegTypelib(sLib As String, ByVal bState As Boolean)用来实现注册和注销ACTIVEX。代码如下:

Option Explicit

Public Type GUID

    Data1 As Long

    Data2 As Integer

    Data3 As Integer

    Data4(0 To 7) As Byte

End Type

 

Private Enum eSYSKIND

   SYS_WIN16 = 0&

   SYS_WIN32 = 1&

   SYS_MAC = 2&

End Enum

 

Private Declare Function LoadTypeLib Lib "oleaut32.dll" ( _

    pFileName As Byte, pptlib As Object) As Long

Private Declare Function RegisterTypeLib Lib "oleaut32.dll" ( _

    ByVal ptlib As Object, szFullPath As Byte, _

    szHelpFile As Byte) As Long

Private Declare Function UnRegisterTypeLib Lib "oleaut32.dll" ( _

      libID As GUID, _

      ByVal wVerMajor As Integer, _

      ByVal wVerMinor As Integer, _

      ByVal lCID As Long, _

      ByVal tSysKind As eSYSKIND _

   ) As Long

Private Declare Function CLSIDFromString Lib "ole32.dll" (lpsz As Byte, pclsid As GUID) As Long

Private Declare Function GetModuleFileName Lib "kernel32" Alias "GetModuleFileNameA" (ByVal hModule As Long, ByVal lpFileName As String, ByVal nSize As Long) As Long

Private Declare Function GetModuleHandle Lib "kernel32" Alias "GetModuleHandleA" (ByVal lpModuleName As String) As Long

‘取得模块的路径

Private Function GetModulePath(bModuleName As String) As String

    Dim ModleId As Long

    Dim Path As String * 254

   

    ModleId = GetModuleHandle(bModuleName)

    Call GetModuleFileName(ModleId, Path, 254)

    GetModulePath = Path

End Function

 

‘sLib为模块名称,无须路径和后缀  bState 为FALSE时是注销,反之为注册

Public Function RegTypelib(sLib As String, ByVal bState As Boolean, ByVal bType As PSDK.EPluginCategory) As Long

Dim suLib() As Byte

Dim errOK As Long

Dim tlb As Object

 

Dim cTLI As TypeLibInfo

上一页  [1] [2] [3] [4]  下一页

打印本文 打印本文 关闭窗口 关闭窗口