2011-02-25 9 views
10

Estoy trabajando con un control ActiveX en Internet Explorer 8 que es mostrar un diálogo de guardar archivo que permite al usuario elegir un nombre de archivo y tipo de archivo (jpg, gif, etc.). Estos valores pasan al código y luego se usan en un método diferente para guardar el archivo. Lamentablemente, el método que invoca el diálogo no tiene valor de retorno, y el nombre de archivo y el tipo de archivo se pasan como a los parámetros.Trabajando con parámetros "Out" en JavaScript

La firma del método (expresado en Visual Basic) tiene el siguiente aspecto:

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

Los dos ByRef parámetros son los parámetros fuera.

He escrito el siguiente código 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); 
    } 
} 

El código funciona porque el control ActiveX produce su diálogo, y puede manejar condiciones de error, pero Me parece que no puede encontrar la manera de capturar los valores de fuera parámetros.

En el código gxVideoPlayBack es una referencia al control ActiveX incrustado en el DOM a través de un elemento HTML.

Si JavaScript no funciona para esto, ¿se puede hacer en VBScript?

Como alternativa, puedo implementar mi propio diálogo, pero prefiero usar el que se proporciona.

Respuesta

7

Editar: Parece que no es posible tener los parámetros de "salida" en JavaScript/JScript.

original: Quizás el approach described in this article funcionará:

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? 

supongo que la idea es que el envoltorio WSH para esta llamada nativa intentará asignar la propiedad "valor" de los parámetros de salida dadas, para que pueda anular el valor del setter o simplemente darle un objeto con un setter de valor incorporado.

+0

Así es como la conexión XPConnect cierra el espacio de referencia entre JavaScript y XPCOM, pero no tengo idea si ActiveX hace algo similar. –

+0

@lwburk: sí, lo mismo aquí, simplemente tirando una idea. Creo que la realidad es que los parámetros de "salida" no están disponibles en JScript/JavaScript. – maerics

+1

concepto interesante. Lamentablemente, cuando inicializo las dos variables en un objeto vacío, * SaveFileDialog * arroja una excepción de tipo. Espera una cuerda y un número entero. – RunnerRick

0

Desafortunadamente, los parámetros out/ByRef solo funcionarán en JScript para objetos; no para ningún otro tipo (números, cadenas).

En este caso, deberá usar VBScript, que admite argumentos ByRef, o like maerics says, escribir un contenedor VB/VBScript para el método SaveFileDialog, que podría devolver un objeto que contenga tanto el nombre como el tipo de archivo.

1

Todos los argumentos de la función en JavaScript son passed by value (incluso si el valorsiendo pasada es una referencia a un objeto (que es)). No hay referencia pasada.

Si SaveFileDialog modifica los objetos referenciados por saveFileName y saveFileType entonces tienen acceso a esos cambios a través de sus variables existentes.

Cuestiones relacionadas