请问,用VB如何实现以下功能:1。注册/反注册某个指定的DLL文件2。在Internet服务管理器中,有这么一个功能:鼠标右击某个站点图标,选定“属性”菜单项-“主目录”-“卸载”按钮,可以将有这个站点调用的DLL进程全部卸载,这样一来,我就可以删除某个指定的DLL文件了,不然的话,windows会报错:“无法删除文件,共享冲突”。现在请问:我该如何用VB代码实现上面的操作功能或者解决windows文件共享冲突的问题?谢谢!

解决方案 »

  1.   

    偶素菜鸟,不懂瞎说两句,希望高手指正1 用shell执行regsvr32可以吗?
    2 重复调用FreeLibrary,直到实例计数为0可以吗(先用LoadLibrary得到句柄)?
      

  2.   

    to viena(维也纳nn-实心木头人) :谢谢!能否给出详细代码?不是很明白?还有你的信誉值怎么只有1啊?
      

  3.   

    Function RegisterDll(strDllFileName As String, strProgID As String, strClsID As String, Optional bVerify As Boolean = True) As Long
    ' 函数说明
    '     注册 ActiveX DLL。
    '     注册校验:如果 strProgID 不为空,则注册后检查 strProgID 对应的 CLSID 是否与 strCLSID 相等,
    '     如不相等,则认为未注册成功。
    '
    ' 参数说明
    '     strDllFileName    :(in) DLL 文件名,包括路径
    '     strProgID         :(in) ProgID,如 "AutoYuanjuanProject.AutoYuejuan"
    '     strCLSID          :(in) CLSID,如 "37048527-7337-43A8-A041-18DDA083F9F3"
    '     bVerify           :(in) 是否校验注册成功,默认为是
    '
    ' 返回值
    '     0 = 正常
    '     1 = 程序运行错误
    '
    ' 算法或程序流程
    '     1. regsvr32 /s /u .dll
    '     2. regsvr32 /s .dll
    '     3. CLSIDFromProgID
    '     4. StringFromCLSID
    '     5. CLSID 的 String 与 strCLSID 比较,如果相同,说明注册成功   Dim strSystemPath       As String
       Dim strRegsvr32         As String
       Dim strCmdLine          As String
       Dim lnProcess           As Long
       Dim lnProcessID         As Long
       Dim lnExitCode          As Long
       Dim sgStartTimer        As Single
       Dim tClsID              As tp_GUID
       Dim pOLESTR             As Long
       Dim strNewClsID         As String
       Dim lnReturn            As Long
       Dim ln1                 As Long
       
       On Error GoTo err_RegisterDll
       
       ' 取得系统路径
       strSystemPath = String(MAX_PATH, Chr(0))
       lnReturn = GetSystemDirectory(strSystemPath, MAX_PATH)
       If lnReturn > 0 Then
          strSystemPath = Left(strSystemPath, lnReturn)
       Else
          ' 取得系统路径失败
          RegisterDll = 1
          Exit Function
       End If
       If Right(strSystemPath, 1) <> "\" Then strSystemPath = strSystemPath & "\"
       
       ' 计算 regsvr32.exe 的文件名
       strRegsvr32 = strSystemPath & "regsvr32.exe"
       
       ' 注册 DLL
       'strCmdLine = strRegsvr32 & " /s " & strDllFileName
       strCmdLine = strRegsvr32 & " /s """ & strDllFileName & """"
       lnProcessID = Shell(strCmdLine, vbNormalFocus)
       If lnProcessID = 0 Then
          ' 运行失败
          RegisterDll = 1
          Exit Function
       End If
       
       lnProcess = OpenProcess(PROCESS_QUERY_INFORMATION, False, lnProcessID)
       If lnProcess <> 0 Then
          sgStartTimer = Timer
          Do
              Call GetExitCodeProcess(lnProcess, lnExitCode)
              DoEvents
              DoEvents
              DoEvents
          Loop While (lnExitCode = STATUS_PENDING) And (Timer - sgStartTimer < 5)    ' 5 秒超时
          CloseHandle lnProcess
          If lnExitCode = STATUS_PENDING Then
             ' regsvr32 运行超时
             RegisterDll = 1
             Exit Function
          End If
       End If
          
       ' 校验注册结果
       If Not bVerify Then
          RegisterDll = 0
          Exit Function
       Else
          ' 计算 CLSIDFromProgID
          If strProgID = "" Then
             ' 不进行 ProgID 与 CLSID 的校验
             RegisterDll = 0
             Exit Function
          End If
          lnReturn = CLSIDFromProgID(StrPtr(strProgID), tClsID)
          If lnReturn <> 0 Then
             ' 运行失败
             RegisterDll = 1
             Exit Function
          End If
          
          ' 计算 StringFromCLSID
          strNewClsID = String(160, Chr(0))
          lnReturn = StringFromCLSID(tClsID, pOLESTR)
          If lnReturn <> 0 Then
             ' 运行失败
             RegisterDll = 1
             Exit Function
          End If
          If GetComString(pOLESTR, 100, strNewClsID) <> 0 Then
             ' 运行失败
             CoTaskMemFree pOLESTR
             RegisterDll = 1
             Exit Function
          End If
          CoTaskMemFree pOLESTR
          
          ' CLSID 的 String 与 strCLSID 比较,如果相同,说明注册成功
          If strNewClsID = strClsID Then
             RegisterDll = 0
             Exit Function
          Else
             RegisterDll = 1
             Exit Function
          End If
       End If
       
    err_RegisterDll:
          
       RegisterDll = 1
       
    'debug
    'MsgBox "err_RegisterDll"
    'Err.Clear
    'On Error GoTo err_RegisterDll
    'Resume NextEnd FunctionFunction UnRegisterDll(strDllFileName As String) As Long
    ' 函数说明
    '     注销 ActiveX DLL
    '
    ' 参数说明
    '     strDllFileName    :(in) DLL 文件名,包括路径
    '
    ' 返回值
    '     0 = 正常
    '     1 = 程序运行错误
    '
    ' 算法或程序流程
    '     1 regsvr32 /s /u .dll   Dim strSystemPath       As String
       Dim strRegsvr32         As String
       Dim strCmdLine          As String
       Dim lnReturn            As Long
       Dim lnProcessID         As Long
       
       On Error GoTo err_UnRegisterDll
       
       ' 取得系统路径
       strSystemPath = String(MAX_PATH, Chr(0))
       lnReturn = GetSystemDirectory(strSystemPath, MAX_PATH)
       If lnReturn > 0 Then
          strSystemPath = Left(strSystemPath, lnReturn)
       Else
          ' 取得系统路径失败
          UnRegisterDll = 1
          Exit Function
       End If
       If Right(strSystemPath, 1) <> "\" Then strSystemPath = strSystemPath & "\"
       
       ' 计算 regsvr32.exe 的文件名
       strRegsvr32 = strSystemPath & "regsvr32.exe"
       
       ' 注销 DLL
       strCmdLine = strRegsvr32 & " /s /u " & strDllFileName
       lnProcessID = Shell(strCmdLine, vbNormalFocus)
       If lnProcessID = 0 Then
          ' 运行失败
          UnRegisterDll = 1
          Exit Function
       End If
          
       UnRegisterDll = 0
       Exit Function
       
    err_UnRegisterDll:
       UnRegisterDll = 1
       
    End Function
      

  4.   

    to  pcwak() :谢谢你精彩的代码!!!!请问谁能回答第2个问题?谢谢!
      

  5.   

    另外,第一个问题,如果不用Shell,能不能实现?
      

  6.   

    内存中正在使用的dll不能删除,同一进程调用多少次FreeLibrary都仅会减去自己的一次计数。
    一般的办法:先反注册再通过重新启动系统删除。
      

  7.   

    2。在Internet服务管理器中,有这么一个功能:鼠标右击某个站点图标,选定“属性”菜单项-“主目录”-“卸载”按钮,可以将有这个站点调用的DLL进程全部卸载,这样一来,我就可以删除某个指定的DLL文件了,不然的话,windows会报错:“无法删除文件,共享冲突”。现在请问:我该如何用VB代码实现上面的操作功能或者解决windows文件共享冲突的问题?
      

  8.   

    若希望卸载内存中正在使用的Dll,这个问题的确超难。我没研究过。
    但我看到,很多软件也都没有很好的解决这个问题,往往最后都是提示重新启动系统,才能完成卸载!但也不可否认,有些软件是能做到不重启的,不过,这此Dll大多是其专用的或与自已系统相关进程才共享调用的Dll。
    卸载它们,我想是经过专门设计的,比如:
    所有调用进程都能响应Dll的某个请求退出消息,然后由相关进程自动释放调用。
    当然这些需在设计时就做进去才行。
      

  9.   

    是这样的,我这个dll,肯定是只用于IIS的某一个站点的某个特定的虚拟目录,我只要想办法编程实现
    对这个虚拟目录的“属性”菜单项-“主目录”-“卸载”按钮功能,就可以将有这个站点调用的DLL进程全部卸载,这个可以实现吗?
      

  10.   

    会不会有什么命令行DOS命令可以实现IIS虚拟目录的卸载功能的?
      

  11.   

    从两方面分析:
    1、IIS应用程序保护
       低,dll加载到iis进程选中,需要结束iis进程
       中,dll加载到COM+应用程序IIS Out-Of-Process Pooled Applications中,使用COM+ Admin组件结束IIS Out-Of-Process Pooled Applications
       高,iis为虚拟目录建立COM+应用程序,使用COM+ Admin组件结束该应用程序2、组件配置方式
       未配置的组件,结束加载该dll的进程
       配置为COM+库应用程序,结束加载该dll的进程
       配置为COM+服务器应用程序,结束该应用程序   另外你应该查一下IISAO是否可以实现你要的功能,比如IIS应用程序保护设置为低,卸载时并不需要结束iis进程
       以上仅仅理论分析,具体你需要测试一下
      

  12.   

    请问哪里有IIS Admin Object的参考吗?
      

  13.   

    MARK一下。注册的代码对俺有用
      

  14.   

    http://msdn.microsoft.com/library/default.asp?url=/library/en-us/iissdk/html/6436aeaf-d4c3-4e1f-8cd3-96359ff427ce.asp
      

  15.   

    谢谢  bdhh(Silent) :还有一个问题,请问各位,VB编程是否可以实现 远程注册 某台服务器上的 axtivex DLL??
    还有一个问题,请问各位,VB编程是否可以实现 远程注册 某台服务器上的 axtivex DLL??
      

  16.   

    事实上FREELIBRARY对于自身的DLL可能有用,对别的程序的好象不行,要不重启后删除?反正偶是Freelibrary鸟半天硬是还看的到