请问,用VB如何实现以下功能:1。注册/反注册某个指定的DLL文件2。在Internet服务管理器中,有这么一个功能:鼠标右击某个站点图标,选定“属性”菜单项-“主目录”-“卸载”按钮,可以将有这个站点调用的DLL进程全部卸载,这样一来,我就可以删除某个指定的DLL文件了,不然的话,windows会报错:“无法删除文件,共享冲突”。现在请问:我该如何用VB代码实现上面的操作功能或者解决windows文件共享冲突的问题?谢谢!
解决方案 »
- 請問在VB6中如何禁止鼠標事件,當處理程序結束后允許
- SQL Server 好慢啊!大哥们救我
- 一个简单的问题,在线等...
- MSHFLEXGRID控件的一个奇怪现象
- TextBox控件在enabled=false时的ForeColor的颜色
- 如何避免出现:"当系统后台繁忙时,按任意键会弹出"this action cannot be completed because the other application is busy……“的英文
- 请问,有没有这样的例表,把VB的每一个控件的属性和事件全部例出来,,以方便学习
- 在vb中如何生成<!--doctype RZ00100 SYSTEM "RZ00100.DTD"-->(散分)
- 在线等待——怎样检测到treeview控件的热跟踪------立即送分
- 关于报考程序员?
- 问一个简单的问题
- 怎麽讓控件的狀態暫時不改變
2 重复调用FreeLibrary,直到实例计数为0可以吗(先用LoadLibrary得到句柄)?
' 函数说明
' 注册 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
一般的办法:先反注册再通过重新启动系统删除。
但我看到,很多软件也都没有很好的解决这个问题,往往最后都是提示重新启动系统,才能完成卸载!但也不可否认,有些软件是能做到不重启的,不过,这此Dll大多是其专用的或与自已系统相关进程才共享调用的Dll。
卸载它们,我想是经过专门设计的,比如:
所有调用进程都能响应Dll的某个请求退出消息,然后由相关进程自动释放调用。
当然这些需在设计时就做进去才行。
对这个虚拟目录的“属性”菜单项-“主目录”-“卸载”按钮功能,就可以将有这个站点调用的DLL进程全部卸载,这个可以实现吗?
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进程
以上仅仅理论分析,具体你需要测试一下
还有一个问题,请问各位,VB编程是否可以实现 远程注册 某台服务器上的 axtivex DLL??