'启动SQL Server服务 temp_long = OpenSCManager("", SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS) If temp_long <> 0 Then temp_long2 = OpenService(temp_long, "MSSQLServer", SERVICE_ALL_ACCESS) If temp_long2 <> 0 Then If QueryServiceStatus(temp_long2, ServiceStatus) <> 0 Then Do While QueryServiceStatus(temp_long2, ServiceStatus) <> 0 '确保服务处于确定的状态 If ServiceStatus.dwCurrentState = SERVICE_PAUSED Or ServiceStatus.dwCurrentState = SERVICE_STOPPED Or ServiceStatus.dwCurrentState = SERVICE_RUNNING Then Exit Do End If DoEvents Loop If ServiceStatus.dwCurrentState = SERVICE_PAUSED Then '暂停服务状态 temp_long3 = ControlService(temp_long2, SERVICE_CONTROL_CONTINUE, ServiceStatus) temp_long4 = GetLastError() Do While QueryServiceStatus(temp_long2, ServiceStatus) <> 0 If ServiceStatus.dwCurrentState = SERVICE_PAUSED Or ServiceStatus.dwCurrentState = SERVICE_STOPPED Or ServiceStatus.dwCurrentState = SERVICE_RUNNING Then Exit Do End If DoEvents Loop If temp_long3 = 0 Then MsgBox "无法启动SQL Server服务,安装无法继续。", , setup_app_title 'MsgBox GetLastError() End End If End If If ServiceStatus.dwCurrentState <> SERVICE_RUNNING Then 'Shell "net start MSSQLServer", vbHide Form1.Label1.Caption = "正在启动SQL Server服务......" temp_long3 = StartService(temp_long2, 0, 0) temp_long4 = GetLastError() Do While QueryServiceStatus(temp_long2, ServiceStatus) <> 0 If ServiceStatus.dwCurrentState = SERVICE_PAUSED Or ServiceStatus.dwCurrentState = SERVICE_STOPPED Or ServiceStatus.dwCurrentState = SERVICE_RUNNING Then Exit Do End If DoEvents Loop Form1.Label1.Caption = "检测数据库Campus......" If temp_long3 = 0 And temp_long4 <> 1056 Then '1056:服务已经运行 MsgBox "无法启动SQL Server服务,安装无法继续。", , setup_app_title 'MsgBox GetLastError() End End If End If Else '检测不到服务状态 MsgBox "无法检测到SQL Server服务的状态,请确认MS SQL Server已经正确安装,并且启动了服务。", , setup_app_title 'Shell "net start MSSQLServer", vbHide End End If Else MsgBox "无法检测到SQL Server服务的状态,请确认MS SQL Server已经正确安装,并且启动了服务。", , setup_app_title End End If Else MsgBox "无法检测到SQL Server服务的状态,请确认您有足够的权限,建议以管理员身份登陆进行安装。", , setup_app_title End End If next2: fmpwd.Show 1 Select Case FindDatabase(sqlserver_server, sqlserver_user, sqlserver_pwd, sqlserver_db) Case 0 Case 1 Form1.Label1.Caption = "检测到数据库Campus已经存在。" If MsgBox("数据库campus已经存在。建议您备份数据库以后删除现有数据库,然后再安装本软件。您也可以现在直接删除数据库,继续安装。要删除现有数据库吗?", vbYesNo, setup_app_title) = vbYes Then '删除旧的数据库 Call DetachDatabase(sqlserver_server, sqlserver_user, sqlserver_pwd, sqlserver_db) If FindDatabase(sqlserver_server, sqlserver_user, sqlserver_pwd, sqlserver_db) = 1 Then MsgBox "无法删除数据库,请手工删除,然后再进行安装。", , setup_app_title End End If Call WriteFlag("1") End If End Case 2 MsgBox "无法连接SQL Server服务器,安装无法继续进行。", , setup_app_title End End Select实在难看,:-(
vb不是带有api浏览器吗?用那个。 其实msdn是最全的,不过我当时看了很久,因为e文不好!以下是从我工程里拷贝下来的,有部分声明可能用不着,如果有缺的,编译时会有提示。Public Declare Function OpenSCManager Lib "advapi32.dll" Alias "OpenSCManagerA" (ByVal lpMachineName As String, ByVal lpDatabaseName As String, ByVal dwDesiredAccess As Long) As Long Public Declare Function OpenService Lib "advapi32.dll" Alias "OpenServiceA" (ByVal hSCManager As Long, ByVal lpServiceName As String, ByVal dwDesiredAccess As Long) As Long Public Declare Function QueryServiceStatus Lib "advapi32.dll" (ByVal hService As Long, lpServiceStatus As SERVICE_STATUS) As Long Public Declare Function ControlService Lib "advapi32.dll" (ByVal hService As Long, ByVal dwControl As Long, lpServiceStatus As SERVICE_STATUS) As Long Public Declare Function SetServiceStatus Lib "advapi32.dll" (ByVal hServiceStatus As Long, lpServiceStatus As SERVICE_STATUS) As Long Public Declare Function StartService Lib "advapi32.dll" Alias "StartServiceA" (ByVal hService As Long, ByVal dwNumServiceArgs As Long, ByVal lpServiceArgVectors As Long) As LongPublic Const STANDARD_RIGHTS_REQUIRED = &HF0000 Public Const SERVICE_QUERY_CONFIG = &H1Public Const SERVICE_ACCEPT_PAUSE_CONTINUE = &H2 Public Const SERVICE_ACCEPT_SHUTDOWN = &H4 Public Const SERVICE_ACCEPT_STOP = &H1 Public Const SERVICE_ACTIVE = &H1 Public Const SERVICE_CHANGE_CONFIG = &H2 Public Const SERVICE_CONTINUE_PENDING = &H5 Public Const SERVICE_CONTROL_CONTINUE = &H3 Public Const SERVICE_CONTROL_INTERROGATE = &H4 Public Const SERVICE_CONTROL_PAUSE = &H2 Public Const SERVICE_CONTROL_SHUTDOWN = &H5 Public Const SERVICE_CONTROL_STOP = &H1 Public Const SERVICE_ENUMERATE_DEPENDENTS = &H8 Public Const SERVICE_INACTIVE = &H2 Public Const SERVICE_INTERROGATE = &H80 Public Const SERVICE_NO_CHANGE = &HFFFF Public Const SERVICE_PAUSE_CONTINUE = &H40 Public Const SERVICE_PAUSE_PENDING = &H6 Public Const SERVICE_PAUSED = &H7 Public Const SERVICE_QUERY_STATUS = &H4 Public Const SERVICE_RUNNING = &H4 Public Const SERVICE_START = &H10 Public Const SERVICE_START_PENDING = &H2 Public Const SERVICE_STATE_ALL = (SERVICE_ACTIVE Or SERVICE_INACTIVE) Public Const SERVICE_STOP = &H20 Public Const SERVICE_STOP_PENDING = &H3 Public Const SERVICE_STOPPED = &H1 Public Const SERVICE_USER_DEFINED_CONTROL = &H100 Public Const SERVICES_ACTIVE_DATABASE = "ServicesActive" Public Const SERVICES_FAILED_DATABASE = "ServicesFailed" Public Const SERVICE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or SERVICE_QUERY_CONFIG Or SERVICE_CHANGE_CONFIG Or SERVICE_QUERY_STATUS Or SERVICE_ENUMERATE_DEPENDENTS Or SERVICE_START Or SERVICE_STOP Or SERVICE_PAUSE_CONTINUE Or SERVICE_INTERROGATE Or SERVICE_USER_DEFINED_CONTROL)Public Const SC_MANAGER_CONNECT = &H1 Public Const SC_MANAGER_CREATE_SERVICE = &H2 Public Const SC_MANAGER_ENUMERATE_SERVICE = &H4 Public Const SC_MANAGER_LOCK = &H8 Public Const SC_MANAGER_MODIFY_BOOT_CONFIG = &H20 Public Const SC_MANAGER_QUERY_LOCK_STATUS = &H10 Public Const GENERIC_READ = &H80000000 Public Const GENERIC_WRITE = &H40000000 Public Const GENERIC_EXECUTE = &H20000000 Public Const GENERIC_ALL = &H10000000 Public Const SC_MANAGER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or SC_MANAGER_CONNECT Or SC_MANAGER_CREATE_SERVICE Or SC_MANAGER_ENUMERATE_SERVICE Or SC_MANAGER_LOCK Or SC_MANAGER_QUERY_LOCK_STATUS Or SC_MANAGER_MODIFY_BOOT_CONFIG)Public Type SERVICE_STATUS dwServiceType As Long dwCurrentState As Long dwControlsAccepted As Long dwWin32ExitCode As Long dwServiceSpecificExitCode As Long dwCheckPoint As Long dwWaitHint As Long End TypePublic Type LUID lowpart As Long highpart As Long End Type Public Type LARGE_INTEGER lowpart As Long highpart As Long End TypePublic Type LUID_AND_ATTRIBUTES pLuid As LARGE_INTEGER Attributes As Long End Type Public Type TOKEN_PRIVILEGES PrivilegeCount As Long Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES End Type
(有更好的耐心的话看 msdn,我当初就是那么做的)。
temp_long = OpenSCManager("", SERVICES_ACTIVE_DATABASE, SC_MANAGER_ALL_ACCESS)
If temp_long <> 0 Then
temp_long2 = OpenService(temp_long, "MSSQLServer", SERVICE_ALL_ACCESS)
If temp_long2 <> 0 Then
If QueryServiceStatus(temp_long2, ServiceStatus) <> 0 Then
Do While QueryServiceStatus(temp_long2, ServiceStatus) <> 0 '确保服务处于确定的状态
If ServiceStatus.dwCurrentState = SERVICE_PAUSED Or ServiceStatus.dwCurrentState = SERVICE_STOPPED Or ServiceStatus.dwCurrentState = SERVICE_RUNNING Then
Exit Do
End If
DoEvents
Loop
If ServiceStatus.dwCurrentState = SERVICE_PAUSED Then '暂停服务状态
temp_long3 = ControlService(temp_long2, SERVICE_CONTROL_CONTINUE, ServiceStatus)
temp_long4 = GetLastError()
Do While QueryServiceStatus(temp_long2, ServiceStatus) <> 0
If ServiceStatus.dwCurrentState = SERVICE_PAUSED Or ServiceStatus.dwCurrentState = SERVICE_STOPPED Or ServiceStatus.dwCurrentState = SERVICE_RUNNING Then
Exit Do
End If
DoEvents
Loop
If temp_long3 = 0 Then
MsgBox "无法启动SQL Server服务,安装无法继续。", , setup_app_title
'MsgBox GetLastError()
End
End If
End If
If ServiceStatus.dwCurrentState <> SERVICE_RUNNING Then
'Shell "net start MSSQLServer", vbHide
Form1.Label1.Caption = "正在启动SQL Server服务......"
temp_long3 = StartService(temp_long2, 0, 0)
temp_long4 = GetLastError()
Do While QueryServiceStatus(temp_long2, ServiceStatus) <> 0
If ServiceStatus.dwCurrentState = SERVICE_PAUSED Or ServiceStatus.dwCurrentState = SERVICE_STOPPED Or ServiceStatus.dwCurrentState = SERVICE_RUNNING Then
Exit Do
End If
DoEvents
Loop
Form1.Label1.Caption = "检测数据库Campus......"
If temp_long3 = 0 And temp_long4 <> 1056 Then '1056:服务已经运行
MsgBox "无法启动SQL Server服务,安装无法继续。", , setup_app_title
'MsgBox GetLastError()
End
End If
End If
Else '检测不到服务状态
MsgBox "无法检测到SQL Server服务的状态,请确认MS SQL Server已经正确安装,并且启动了服务。", , setup_app_title
'Shell "net start MSSQLServer", vbHide
End
End If
Else
MsgBox "无法检测到SQL Server服务的状态,请确认MS SQL Server已经正确安装,并且启动了服务。", , setup_app_title
End
End If
Else
MsgBox "无法检测到SQL Server服务的状态,请确认您有足够的权限,建议以管理员身份登陆进行安装。", , setup_app_title
End
End If
next2:
fmpwd.Show 1
Select Case FindDatabase(sqlserver_server, sqlserver_user, sqlserver_pwd, sqlserver_db)
Case 0
Case 1
Form1.Label1.Caption = "检测到数据库Campus已经存在。"
If MsgBox("数据库campus已经存在。建议您备份数据库以后删除现有数据库,然后再安装本软件。您也可以现在直接删除数据库,继续安装。要删除现有数据库吗?", vbYesNo, setup_app_title) = vbYes Then '删除旧的数据库
Call DetachDatabase(sqlserver_server, sqlserver_user, sqlserver_pwd, sqlserver_db)
If FindDatabase(sqlserver_server, sqlserver_user, sqlserver_pwd, sqlserver_db) = 1 Then
MsgBox "无法删除数据库,请手工删除,然后再进行安装。", , setup_app_title
End
End If
Call WriteFlag("1")
End If
End
Case 2
MsgBox "无法连接SQL Server服务器,安装无法继续进行。", , setup_app_title
End
End Select实在难看,:-(
其实msdn是最全的,不过我当时看了很久,因为e文不好!以下是从我工程里拷贝下来的,有部分声明可能用不着,如果有缺的,编译时会有提示。Public Declare Function OpenSCManager Lib "advapi32.dll" Alias "OpenSCManagerA" (ByVal lpMachineName As String, ByVal lpDatabaseName As String, ByVal dwDesiredAccess As Long) As Long
Public Declare Function OpenService Lib "advapi32.dll" Alias "OpenServiceA" (ByVal hSCManager As Long, ByVal lpServiceName As String, ByVal dwDesiredAccess As Long) As Long
Public Declare Function QueryServiceStatus Lib "advapi32.dll" (ByVal hService As Long, lpServiceStatus As SERVICE_STATUS) As Long
Public Declare Function ControlService Lib "advapi32.dll" (ByVal hService As Long, ByVal dwControl As Long, lpServiceStatus As SERVICE_STATUS) As Long
Public Declare Function SetServiceStatus Lib "advapi32.dll" (ByVal hServiceStatus As Long, lpServiceStatus As SERVICE_STATUS) As Long
Public Declare Function StartService Lib "advapi32.dll" Alias "StartServiceA" (ByVal hService As Long, ByVal dwNumServiceArgs As Long, ByVal lpServiceArgVectors As Long) As LongPublic Const STANDARD_RIGHTS_REQUIRED = &HF0000
Public Const SERVICE_QUERY_CONFIG = &H1Public Const SERVICE_ACCEPT_PAUSE_CONTINUE = &H2
Public Const SERVICE_ACCEPT_SHUTDOWN = &H4
Public Const SERVICE_ACCEPT_STOP = &H1
Public Const SERVICE_ACTIVE = &H1
Public Const SERVICE_CHANGE_CONFIG = &H2
Public Const SERVICE_CONTINUE_PENDING = &H5
Public Const SERVICE_CONTROL_CONTINUE = &H3
Public Const SERVICE_CONTROL_INTERROGATE = &H4
Public Const SERVICE_CONTROL_PAUSE = &H2
Public Const SERVICE_CONTROL_SHUTDOWN = &H5
Public Const SERVICE_CONTROL_STOP = &H1
Public Const SERVICE_ENUMERATE_DEPENDENTS = &H8
Public Const SERVICE_INACTIVE = &H2
Public Const SERVICE_INTERROGATE = &H80
Public Const SERVICE_NO_CHANGE = &HFFFF
Public Const SERVICE_PAUSE_CONTINUE = &H40
Public Const SERVICE_PAUSE_PENDING = &H6
Public Const SERVICE_PAUSED = &H7
Public Const SERVICE_QUERY_STATUS = &H4
Public Const SERVICE_RUNNING = &H4
Public Const SERVICE_START = &H10
Public Const SERVICE_START_PENDING = &H2
Public Const SERVICE_STATE_ALL = (SERVICE_ACTIVE Or SERVICE_INACTIVE)
Public Const SERVICE_STOP = &H20
Public Const SERVICE_STOP_PENDING = &H3
Public Const SERVICE_STOPPED = &H1
Public Const SERVICE_USER_DEFINED_CONTROL = &H100
Public Const SERVICES_ACTIVE_DATABASE = "ServicesActive"
Public Const SERVICES_FAILED_DATABASE = "ServicesFailed"
Public Const SERVICE_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or SERVICE_QUERY_CONFIG Or SERVICE_CHANGE_CONFIG Or SERVICE_QUERY_STATUS Or SERVICE_ENUMERATE_DEPENDENTS Or SERVICE_START Or SERVICE_STOP Or SERVICE_PAUSE_CONTINUE Or SERVICE_INTERROGATE Or SERVICE_USER_DEFINED_CONTROL)Public Const SC_MANAGER_CONNECT = &H1
Public Const SC_MANAGER_CREATE_SERVICE = &H2
Public Const SC_MANAGER_ENUMERATE_SERVICE = &H4
Public Const SC_MANAGER_LOCK = &H8
Public Const SC_MANAGER_MODIFY_BOOT_CONFIG = &H20
Public Const SC_MANAGER_QUERY_LOCK_STATUS = &H10
Public Const GENERIC_READ = &H80000000
Public Const GENERIC_WRITE = &H40000000
Public Const GENERIC_EXECUTE = &H20000000
Public Const GENERIC_ALL = &H10000000
Public Const SC_MANAGER_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or SC_MANAGER_CONNECT Or SC_MANAGER_CREATE_SERVICE Or SC_MANAGER_ENUMERATE_SERVICE Or SC_MANAGER_LOCK Or SC_MANAGER_QUERY_LOCK_STATUS Or SC_MANAGER_MODIFY_BOOT_CONFIG)Public Type SERVICE_STATUS
dwServiceType As Long
dwCurrentState As Long
dwControlsAccepted As Long
dwWin32ExitCode As Long
dwServiceSpecificExitCode As Long
dwCheckPoint As Long
dwWaitHint As Long
End TypePublic Type LUID
lowpart As Long
highpart As Long
End Type
Public Type LARGE_INTEGER
lowpart As Long
highpart As Long
End TypePublic Type LUID_AND_ATTRIBUTES
pLuid As LARGE_INTEGER
Attributes As Long
End Type
Public Type TOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(ANYSIZE_ARRAY) As LUID_AND_ATTRIBUTES
End Type