Синтаксическая ошибка с AddHandler в VBScript

Прежде всего, я довольно новичок в языке VB, сценариях VB и программировании на VB.net, но довольно хорош в других языках и платформах.

Моя цель - запустить простую основанную на VB программу из командной строки и заставить ее отобразить окно с сообщением (эту часть я понял). Кроме того, я хочу, чтобы окно сообщения (а также сценарий) завершалось, если компьютер переходит в спящий режим (или если он возобновляет работу из него) в это время.

Я нашел этот код на VBForums о обработчике:

'add the handlers for the system standby, resume, and shutdown
AddHandler Microsoft.Win32.SystemEvents.PowerModeChanged, AddressOf PowerModeChanged
AddHandler Microsoft.Win32.SystemEvents.SessionEnding, AddressOf SessionEnding

[...]

Private Sub PowerModeChanged(ByVal sender As System.Object, _
 ByVal e As Microsoft.Win32.PowerModeChangedEventArgs)
    Select Case e.Mode
        Case Microsoft.Win32.PowerModes.Resume
            'windows is resuming from sleep
        Case Microsoft.Win32.PowerModes.Suspend
            'goodnite windows
    End Select
End Sub

Private Sub SessionEnding(ByVal sender As System.Object, _
ByVal e As Microsoft.Win32.SessionEndingEventArgs)
    Select Case e.Reason
        Case Microsoft.Win32.SessionEndReasons.Logoff
            'logoff
        Case Microsoft.Win32.SessionEndReasons.SystemShutdown
           'shutdown
    End Select
End Sub

Поэтому я создал файл.vbs, который использует вышеизложенное (первая версия), и запустил его:

Sub PowerModeChanged(ByVal sender As System.Object, _
    ByVal e As Microsoft.Win32.PowerModeChangedEventArgs)
    Select Case e.Mode
        Case Microsoft.Win32.PowerModes.Resume
            'windows is resuming from sleep
            WScript.Quit
        Case Microsoft.Win32.PowerModes.Suspend
            'goodnite windows
            WScript.Quit
    End Select
End Sub

Sub Main()
    Set objArgs = WScript.Arguments
    msgText = objArgs(0)
    AddHandler Microsoft.Win32.SystemEvents.PowerModeChanged, AddressOf PowerModeChanged
    MsgBox msgText
End Sub

Main()

Но я получил все виды синтаксических ошибок (на As, AddressOf, так далее.). После некоторых тестов и поисков в поисках я понял, что некоторые объекты VB кажутся более строгими по типу и имеют более развитый синтаксис, чем другие. Итак, вот моя вторая версия, которая почти успешно проходит этап синтаксиса:

Sub PowerModeChanged(sender, e)
    Select Case e.Mode
        Case Microsoft.Win32.PowerModes.Resume
            'windows is resuming from sleep
            WScript.Quit
        Case Microsoft.Win32.PowerModes.Suspend
            'goodnite windows
            WScript.Quit
    End Select
End Sub

Sub Main()
    Set objArgs = WScript.Arguments
    msgText = objArgs(0)
    AddHandler Microsoft.Win32.SystemEvents.PowerModeChanged, PowerModeChanged
    MsgBox msgText
End Sub

Main()

Теперь переводчик жалуется на "Требовать:" Microsoft "" на AddHandler линия. На данный момент я не знаю, что делать. Я старался Microsoft.AddHandler но не сработало.

Поэтому я был бы признателен, если бы вы могли помочь мне исправить эту строку и сказать, есть ли что-то еще, что могло бы заставить эту маленькую программу работать.

Спасибо.

3 ответа

Решение

Для всех тех, кто плохо знаком с VB, VB.net и VBScript, я понял, что между VB (.net) и VBScript существует столько же различий, сколько и сходств. Не говоря уже о том, что ошибки времени выполнения, возникающие при запуске ошибочных скриптов VBS, в большинстве случаев не дают подсказки для решения актуальной проблемы.

Я намеревался запустить простую программу на Basic, но в итоге я смешал VB (.net) и VBScript. Извините тем, кто пытался следовать за мной, кстати.

Что касается AddHandler, то, похоже, я не могу вызвать эту функцию в VBScript, поэтому мне нужно было написать ее в VB(.net); Таким образом, файл.vbs не является решением.

В конце концов я установил VS (Visual Studio) и скомпилировал и запустил мою программу. Источники VB имеют расширение.vb и приводят к выполнению исполняемого файла после компиляции. VS предлагает много мгновенных завершений при кодировании, которые помогают писать код сразу с первого раза. Вопреки тому, что я думал и комментировал, даже для упрощенных базовых программ рекомендуется иметь VS (версия Express ничего не стоит).

Я полагаю, что альтернатива VS - согласно предложению Trigger.

Опять извините за все это замешательство. Надеюсь, что это поможет другим новичкам.

Ваш код VB.NET, а не VBScript. Вам нужно использовать VB.NET для компиляции кода и его запуска. Здесь есть инструкции о том, КАК СОСТАВИТЬ КОД ПРОГРАММЫ.

http://social.msdn.microsoft.com/Forums/en-US/adcae113-4758-481a-a367-60d5d14d97d6/this-is-how-to-turn-vbs-and-js-files-into-exe-files-from-the-command-line-without-third-party-tools?forum=scripting

Ну вот бесполезный ответ. Как это VBScript не VB.NET, как его код.

Set WshShell = WScript.CreateObject("WScript.Shell")
Set objWMIService = GetObject("winmgmts:\\.\root\CIMV2") 
Set objEvents = objWMIService.ExecNotificationQuery _
    ("SELECT * FROM Win32_PowerManagementEvent")

Do
    Set objReceivedEvent = objEvents.NextEvent
    wscript.echo objReceivedEvent.EventType
Loop

Используйте с CScript.

Тип события

Тип данных: uint16

Тип доступа: только для чтения

Тип изменения состояния питания системы.

Значение Значение

4 Ввод приостановки

7 Резюме от Приостановить

10 Изменение статуса питания

11 OEM Event

18 Возобновить Автомат

OEMEventCode

Тип данных: uint16

Тип доступа: только для чтения

Состояние питания системы, определенное производителем исходного оборудования (OEM), когда для свойства EventType этого класса установлено значение 11 (OEM Event); в противном случае это свойство имеет значение NULL. События OEM генерируются, когда APM BIOS сообщает о событии OEM APM. Коды событий OEM находятся в диапазоне 0x0200h - 0x02FFh.

Другие вопросы по тегам