2011-02-25 64 views
10

我正在使用Internet Explorer 8中的ActiveX控件來顯示保存文件對話框,讓用戶選擇文件名和文件類型(jpg,gif等)。這些值被傳遞給代碼,然後用於不同的方法來保存文件。不幸的是,調用對話框的方法沒有返回值,並且文件名和文件類型被傳入out參數。在JavaScript中使用「Out」參數

的方法(在Visual Basic中表示)的簽名看起來是這樣的:

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

兩個的ByRef參數是參數。

我寫了下面的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控件產生的對話,我能處理錯誤情況,但我似乎無法弄清楚如何捕獲的值參數。

在代碼gxVideoPlayBack是通過HTML元素對嵌入在DOM中的ActiveX控件的引用。

如果JavaScript不適用於此,是否可以在VBScript中完成?

作爲替代方案,我可以實現自己的對話框,但寧可使用提供的對話框。

回答

7

編輯:似乎在JavaScript/JScript中不可能有「out」參數。

原文: 也許approach described in this article將工作:

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包裝將嘗試給定的輸出參數的「值」屬性,所以你可以重寫值設置器,或者給它一個帶有內置值設置器的對象。

+0

這就是XPConnect連接如何連接JavaScript和XPCOM之間的ref差距,但我不知道ActiveX是否做了類似的事情。 –

+0

@lwburk:是的,這裏也一樣,只是拋出一個想法。我認爲現實是「out」參數在JScript/JavaScript中不可用。 – maerics

+1

有趣的概念。不幸的是,當我將這兩個變量初始化爲一個空對象時,* SaveFileDialog *拋出了一個類型異常。它期望一個字符串和一個整數。 – RunnerRick

0

不幸的是,out/ByRef參數只能用於JScript中的對象;不適用於任何其他類型(數字,字符串)。

在這種情況下,您必須使用VBScript,它支持ByRef參數或like maerics says,爲SaveFileDialog方法編寫一個VB/VBScript包裝器,該包裝器可以返回一個包含文件名和類型的對象。

1

在JavaScript的所有函數的參數是passed by value(即使正在傳遞的參考到對象(​​它是))。沒有傳遞參考。

如果SaveFileDialog修改了saveFileNamesaveFileType引用的對象,則可以通過現有變量訪問這些更改。