Как передать аргумент строкового значения в пользовательских функциях VBS, когда пользователь нажимает кнопку (приложение HTA) - PullRequest
3 голосов
/ 14 апреля 2020

Итак, я пытаюсь создать программу, в которой я могу определить программу в кнопке и запустить ее. В этом блоке кода (показан ниже) я написал функцию, но когда я запускаю программу, я получаю эту ошибку:

Line 19, Char 31: Cannot use parenthesis when calling a sub

Я не пытаюсь создать подпрограмму, но пользовательская функция. Как я могу это исправить?

Код:

<html>
    <head>
        <title>Program Launcher</title>
        <script language="VBScript">
            set objShell = CreateObject("Wscript.Shell")

            Function something(Prog, waitProcess)
                objShell.Run Prog, 0, waitProcess
            End Function
        </script> 
        <style>

        </style>
    </head>
    <body>
        <p id="Test">
            ThisIsATest
        </p>
        <button onclick="something('notepad.exe')">TestObject</button>
    </body>
</html>

Ответы [ 2 ]

1 голос
/ 15 апреля 2020

Фактическая ошибка, которую вы получаете при запуске этого кода:

Неверное количество аргументов или неправильное присвоение свойства: 'что-то'

Чтобы это исправить, вам просто нужно настроить обработчик событий onclick для соответствия сигнатуре функции something(Prog, waitProcess).

Следующая проблема заключается в том, что обработчики событий являются подпроцедурами, а не функциями, поэтому независимо от того, используете ли вы функцию или нет при назначении обработчику событий он обрабатывает его как подпроцедуру, поэтому следующая проблема:

Невозможно использовать скобки при вызове подпрограммы

Чтобы исправить это, вы можете либо:

  1. Снять скобки

    onclick="something 'notepad.exe', True"
    
  2. Использование Call

    onclick="Call something('notepad.exe', True)"
    

Вот пример, использующий Call и MsgBox() для вывода значений, переданных в обработчик событий.

<html>
    <head>
        <HTA:APPLICATION ID="Test" 
            BORDER="thick" 
            BORDERSTYLE="complex"/>
        <title>Program Launcher</title>
        <style>

        </style>
        <script language="VBScript">
            Sub something(Prog, waitProcess)
                MsgBox("Triggered: " & Prog & ", " & waitProcess)
                Dim objShell: Set objShell = CreateObject("WScript.Shell")
                Call objShell.Run("cmd /c " & Prog, 0, waitProcess)
            End Sub
        </script>
    </head>
    <body>
        <p id="Test">
            ThisIsATest
        </p>
        <button onclick="Call something('notepad.exe', True)">TestObject</button> 
    </body>
</html>
0 голосов
/ 14 апреля 2020

Вы можете попробовать вот так:

<html>
    <head>
        <title>Program Launcher</title>
        <script language="VBScript">
            Function Execute(Prog)
                set objShell = CreateObject("Wscript.Shell")
                objShell.Run "cmd /c "& Prog &"",0,True
            End Function
        </script> 
    </head>
    <body>
        <p id="Test">
            ThisIsATest
        </p>
        <button onclick="Execute('notepad.exe')">TestObject</button>
    </body>
</html>
...