Здравствуйте, начал разбираться в VB6 и столкнулся с проблемой, в ХР не работают некоторые функции??? есть такой Компонент CompControl )) и есть у него такие функции как OpenCDROM() - Открыть CD-ROM и т.д.... так же есть ShutDown()- Завершить работу компьютера , но почему то при написании мной програмки, с использованием данных функций функция OpenCDROM() работает а вот ShutDown() - нет! с чем это связано? и можно ли использовать API функции Винды, для выключения компа? через VB6? если можете помогите) Заранее благодарен! (Можно отправлять прямо на мыло Borison2004@mail.ru)
API-функции ExitWindowsEx, InitiateSystemShutdown или IbitiateSystemShutdownEx. Там есть заморочки с правами, так что стоит внимательно читать описание этих функций в MSDN. ричем две последнии работают только в Windows 2000 и в Windows XP.
спасибо, но наверно я не так выразился, я еще только начинаю разбираться, нельзя ли по подробнее объяснить что есть MSDN. и где про них почитать?)) и что такое WMI ?
Народ, что то ничего у меня не получилось, взял с этого сайта даже коды, Call ShutDown(EWX_SHUTDOWN) но на выходе опять ноль((( кто нибудь может помочь реальным советом или кодом??? на ХР??? Александр, спасибо за ссылку) со скоростью моего интернета....я туда к утру попаду!)тут столько народу шарит, что никто помочь не может????
Александр, вот полазил я по твоим ссылкам, и нашел кучу таких как я ни у кого не работает(( хотя выудил кое что :
Платформа
Win 95/98, Win NT
ExitWindowsEx выключает или перезагружает компьютер.Функция возвращает 0 в случае ошибки и 1 в успешном случае.
а как быть с ХР??? что на нем не прет? дайте хотябы описание как ее декларировать, ну надо просто срочно((
programmer, ну вот что то обнадеживающее "Хотя, может не работать)" а вот это не радует( а ты не мог бы помоч с описанием этой функции в модуле? хотелось бы по больше конкретики)))
На этом сайте в Библиотеке кодов валяется этот код))) пробовал его, но не каких реакций вроде все согласно коду в нем что-то не правильно? может кто то подправит??
'КОД ФОРМЫ
Private Sub mnuCompOff_Click()
Call ShutDown(EWX_SHUTDOWN)
End Sub
Private Sub mnuCompReboot_Click()
Call ShutDown(EWX_REBOOT)
End Sub
Public Enum TokenRights
TOKEN_ASSIGN_PRIMARY = &H1
TOKEN_DUPLICATE = &H2
TOKEN_IMPERSONATE = &H4
TOKEN_QUERY = &H8
TOKEN_QUERY_SOURCE = &H10
TOKEN_ADJUST_PRIVILEGES = &H20
TOKEN_ADJUST_GROUPS = &H40
TOKEN_ADJUST_DEFAULT = &H80
TOKEN_ALL_ACCESS = (STANDARD_RIGHTS_REQUIRED Or TOKEN_ASSIGN_PRIMARY Or TOKEN_DUPLICATE Or TOKEN_IMPERSONATE Or TOKEN_QUERY Or TOKEN_QUERY_SOURCE Or TOKEN_ADJUST_PRIVILEGES Or TOKEN_ADJUST_GROUPS Or TOKEN_ADJUST_DEFAULT)
TOKEN_READ = (STANDARD_RIGHTS_READ Or TOKEN_QUERY)
TOKEN_WRITE = (STANDARD_RIGHTS_WRITE Or TOKEN_ADJUST_PRIVILEGES Or TOKEN_ADJUST_GROUPS Or TOKEN_ADJUST_DEFAULT)
TOKEN_EXECUTE = (STANDARD_RIGHTS_EXECUTE)
End Enum
Public Enum PrivilegeAttributes
SE_PRIVILEGE_ENABLED_BY_DEFAULT = &H1
SE_PRIVILEGE_ENABLED = &H2
SE_PRIVILEGE_USED_FOR_ACCESS = &H80000000
End Enum
Public Enum ExitOptions
EWX_LOGOFF = 0
EWX_SHUTDOWN = 1
EWX_REBOOT = 2
EWX_FORCE = 4
End Enum
Type LUID
lowPart As Long
HighPart As Long
End Type
Type LUID_AND_ATTRIBUTES
pLuid As LUID
Attributes As PrivilegeAttributes
End Type
Type PTOKEN_PRIVILEGES
PrivilegeCount As Long
Privileges(0) As LUID_AND_ATTRIBUTES
End Type
Private Declare Function GetCurrentProcess Lib "kernel32" () As Long
Private Declare Function OpenProcessToken Lib "advapi32" (ByVal ProcessHandle As Long, ByVal DesiredAccess As TokenRights, ByRef TokenHandle As Long) As Long
Private Declare Function LookupPrivilegeValueA Lib "advapi32" (ByVal lpSystemName As String, ByVal lpName As String, ByRef lpLuid As LUID) As Long
Private Declare Function AdjustTokenPrivileges Lib "advapi32" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, ByRef NewState As PTOKEN_PRIVILEGES, ByVal BufferLength As Long, ByRef PreviousState As Long, ByRef ReturnLenght As Long) As Long
Private Declare Function AdjustTokenPrivilegesOld Lib "advapi32" Alias "AdjustTokenPrivileges" (ByVal TokenHandle As Long, ByVal DisableAllPrivileges As Long, ByRef NewState As PTOKEN_PRIVILEGES, ByVal BufferLength As Long, ByRef PreviousState As PTOKEN_PRIVILEGES, ByRef ReturnLenght As Long) As Long
Private Declare Function ExitWindowsEx Lib "user32" (ByVal uFlags As ExitOptions, ByVal dwReserved As Long) As Long
Public Function ShutDown(Operation As ExitOptions) As Long
Dim lngProcess As Long
Dim lngReturn As Long
Dim lngToken As Long
Dim udtLUID As LUID
Dim lngTokenPrivileges As TokenRights
Dim udtTokenPrivNew As PTOKEN_PRIVILEGES
lngProcess = GetCurrentProcess()
lngTokenPrivileges = TOKEN_ADJUST_PRIVILEGES
lngReturn = OpenProcessToken(lngProcess, lngTokenPrivileges, lngToken)
lngReturn = LookupPrivilegeValueA(vbNullString, "SE_SHUTDOWN_NAME", udtLUID)
udtTokenPrivNew.PrivilegeCount = 1
udtTokenPrivNew.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
udtTokenPrivNew.Privileges(0).pLuid = udtLUID
lngReturn = AdjustTokenPrivileges(lngToken, 0, udtTokenPrivNew, 0&, 0, 0&
ShutDown = ExitWindowsEx(Operation, 0)
End Function
надо то всего навсего комп выключить, а ни один совет не помогает((( блин....
Private Sub Command1_Click()
Dim OpSysSet, obj
Set OpSysSet = GetObject("winmgmts:{impersonationLevel=impersonate," & "Shutdown)}//./root/cimv2".ExecQuery("SELECT * FROM Win32_OperatingSystem" & " WHERE Primary=true"
For Each obj In OpSysSet
obj.Win32Shutdown (8)
Next
End Sub
Правда если есть активное соединение с Internet, тогда все не так гладко...
ёмоё, во флуда развели. Объяснили тебе, чтобы выключить или перезагрузить компьютер нужно получить привелегии(если ОС XP) и вызывать ExitWindowsEx
Вот тебе код, но будь так добр, читай и ищи сам, этих проимров как грязи.
'Detect if the program is running under Windows NT
Public Function IsWinNT() As Boolean
Dim myOS As OSVERSIONINFO
myOS.dwOSVersionInfoSize = Len(myOS)
GetVersionEx myOS
IsWinNT = (myOS.dwPlatformId = VER_PLATFORM_WIN32_NT)
End Function
'set the shut down privilege for the current application
Public Sub EnableShutDown()
Dim hProc As Long
Dim hToken As Long
Dim mLUID As LUID
Dim mPriv As TOKEN_PRIVILEGES
Dim mNewPriv As TOKEN_PRIVILEGES
hProc = GetCurrentProcess()
OpenProcessToken hProc, TOKEN_ADJUST_PRIVILEGES + TOKEN_QUERY, hToken
LookupPrivilegeValue "", "SeShutdownPrivilege", mLUID
mPriv.PrivilegeCount = 1
mPriv.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
mPriv.Privileges(0).pLuid = mLUID
' enable shutdown privilege for the current application
AdjustTokenPrivileges hToken, False, mPriv, 4 + (12 * mPriv.PrivilegeCount), mNewPriv, 4 + (12 * mNewPriv.PrivilegeCount)
End Sub
' Shut Down NT
Public Sub ShutDownNT(Force As Boolean)
Dim flags As Long
flags = EWX_SHUTDOWN
If Force Then flags = flags + EWX_FORCE
If IsWinNT Then EnableShutDown
ExitWindowsEx flags, 0
End Sub
'Restart NT
Public Sub RebootNT(Force As Boolean)
Dim flags As Long
flags = EWX_REBOOT
If Force Then flags = flags + EWX_FORCE
If IsWinNT Then EnableShutDown
ExitWindowsEx flags, 0
End Sub