Работа с параметрами "Out" в JavaScript

Я работаю с элементом управления ActiveX в Internet Explorer 8, который отображает диалоговое окно файла сохранения, которое позволяет пользователю выбирать имя файла и тип файла (jpg, gif и т.д.). Эти значения передаются в код, а затем используются другим способом для сохранения файла. К сожалению, метод, вызывающий диалог, не имеет возвращаемого значения, а имя файла и тип файла передаются как выходные параметры.

Подпись метода (выраженная в Visual Basic) выглядит следующим образом:

Public Sub SaveFileDialog( _
   ByVal bstrDialogType As Variant, _
   ByRef pbstrFileName As String, _
   ByRef out_pvType As Long _
)

Два параметра ByRef являются параметрами out.

Я написал следующий код JavaScript:

try
{
    var saveFileName, saveFileType; // out variables
    gxVideoPlayBack.SaveFileDialog("image", saveFileName, saveFileType);
    alert(saveFileName); // displays "undefined"
    alert(saveFileType); // displays "undefined"
}
catch(error)
{
    if(!error.number === -2147221484) // User clicked cancel.
    {  
        alert(error.message);
    }
}

Код работает так, что элемент управления ActiveX создает диалог, и я могу обрабатывать условия ошибки, но Я не могу понять, как получить значения параметров out.

В коде gxVideoPlayBack - ссылка на элемент управления ActiveX, встроенный в DOM через HTML-элемент.

Если JavaScript не работает для этого, можно ли это сделать в VBScript?

В качестве альтернативы я могу просто реализовать свой собственный диалог, но предпочел бы использовать предоставленный.

Ответ 1

Изменить: Похоже, что в JavaScript/JScript невозможно иметь параметры "out".

Оригинал: Возможно, подход описанный в этой статье, будет работать:

var saveFileName={}, saveFileType={}; // Empty "output" objects.
gxVideoPlayBack.SaveFileDialog("image", saveFileName, saveFileType);
alert(saveFileName.value); // The "value" attribute is assigned ...
alert(saveFileType.value); // ... by the "SaveFileDialog" method?

Я предполагаю, что идея состоит в том, что оболочка WSH для этого родного вызова попытается присвоить свойство "значение" для заданных параметров вывода, поэтому вы можете либо переопределить значение setter, либо просто дать ему объект со встроенным set setter.

Ответ 2

Все аргументы функции в JavaScript переданы по значению (даже если переданное значение является ссылкой на объект (который он )). Нет пропусков.

Если SaveFileDialog изменяет объекты, на которые ссылаются saveFileName и saveFileType, тогда у вас есть доступ к этим изменениям через существующие переменные.

Ответ 3

К сожалению, параметры out/ByRef будут работать только в JScript для объектов; не для какого-либо другого типа (числа, строки).

В этом случае вам придется использовать VBScript, который поддерживает аргументы ByRef, или как говорит maerics, напишите обертку VB/VBScript для метода SaveFileDialog, который может возвращать объект, содержащий имя и тип файла.