簡體   English   中英

需要幫助將 vbs 代碼轉換為 jscript。 我得到一個運行時錯誤類型不匹配

[英]Need help converting vbs code to jscript. Im getting a Runtime Error Type Mismatch

我有這個連接到我的電腦的實驗室設備。 它使用特殊的 OCX 文件與設備進行通信(讀取、設置參數等)。 我從手冊中得到了這個似乎有效的代碼。 我收到一個消息框,上面寫着“放大率 =1272.814 最后一個錯誤 = API 未初始化”。

<HTML>
<HEAD>
<SCRIPT LANGUAGE="VBScript">
<!--
Sub window_onLoad()
Dim Value
Dim er
call Api1.Initialise("")
call Api1.Get("AP_MAG",Value)
call Api1.GetLastError(er)
call window.alert("Magnification = " + CStr(Value)+"Last error="+er)
call Api1.ClosingControl()
end sub
-->
</SCRIPT>
<TITLE>New Page</TITLE>
</HEAD>
<BODY>
<object classid="CLSID:71BD42C4-EBD3-11D0-AB3A-444553540000" id="Api1">
<PARAM NAME="_Version" VALUE="65536">
<PARAM NAME="_ExtentX" VALUE="2096">
<PARAM NAME="_ExtentY" VALUE="1058">
<PARAM NAME="_StockProps" VALUE="0">
</OBJECT>
</BODY>
</HTML>

因此,因為我在 vbs 中擁有 0% 的知識,在 jscript 中擁有大約 10% 的知識,所以我試圖在 Javascript 中重寫相同的內容。 而且我也已經用 js 編寫了一些必要的代碼。

<script language="JScript">
var Api1=new ActiveXObject("ApiCtrl");
var value;
var er;
Api1.Initialise("");
Api1.Get("AP_MAG",value);
Api1.GetLastError(er);
window.alert("Magnification = " + value+"\n Last error="+er);
Api1.ClosingControl(); 
</script>

不幸的是,我在.Get.GetLastError方法中遇到了類型不匹配錯誤,或者使用var value; var er; var value; var er; var value=""; var er=""; var value=""; var er="";

這是API手冊必須說的

長 GetLastError(VARIANT* 錯誤)

[out] Error 是與最后一個錯誤的錯誤代碼相關聯的錯誤字符串 備注:此調用將返回與最后一個錯誤相關聯的 VT_BSTR VARIANT。 返回值:如果調用成功,則返回0。如果調用失敗,則函數返回錯誤代碼。

長獲取(LPCTSTR lpszParam,VARIANT* vValue)

[in] lpszParam 是參數的名稱,例如“AP_MAG”
[in][out] vValue 是參數的值 備注:此調用將獲取指定參數的值並在 vValue 中返回它。 在 C++ 中,在調用此函數之前,您必須將變體類型 (vValue.vt) 指定為 VT_R4 或 VT_BSTR。 如果沒有為 vValue 定義變體類型,則默認為模擬參數 (AP_XXXX) 的 VT_R4 和數字參數 (DP_XXXX) 的 VT_BSTR。 如果模擬參數的變體類型是 VT_R4,則在變體中返回浮點表示。 如果傳遞了 VT_BSTR 變量,則模擬值將作為附加單位的縮放字符串返回(例如 AP_WD 將返回“= 10mm”)。 對於數字參數,VT_R4 變體產生一個狀態編號,而 VT_BSTR 變體產生一個狀態字符串(例如,DP_RUNUPSTATE 將返回狀態 0 或“Shutdown”或所支持語言中的等價物)。 在 C++ 中,如果將變體類型指定為 VT_BSTR,則 API 將在內部分配一個 BSTR,調用者必須使用 SDK 調用 ::SysFreeString (vValue.bstrVal) 取消分配該 BSTR

歡迎使用 StackOverflow!

嗯,每種語言都是有目的的。 那么來處理瀏覽器(或WSH)環境中的ActiveX對象,VBScript是最好的選擇,而JavaScript是最差的。

JavaScript 沒有所謂的out parameters 這意味着所有函數參數都是按值傳遞的(作為副本)。 讓我們通過示例向您展示這一點。

' VBScript
Dim X, Y
X = 1
Y = 2
Foo X, Y
MsgBox "Outer X = " & X & ", Y = " & Y
'> Local args: 6, 8
'> Outer X = 1, Y = 8

Sub Foo(ByVal arg1, ByRef arg2)
    arg1 = 6
    arg2 = 8
    MsgBox "Local args: " & arg1 & ", " & arg2
End Sub

默認情況下,在 VBS 中,參數是通過引用傳遞的,因此函數參數聲明中的ByRef前綴是可選的。 為了清楚起見,我將其包括在內。

該示例說明的是“by reference”或“out”參數的含義。 它的行為類似於返回值,因為它修改了引用的變量。 雖然修改“按值”變量在函數范圍之外沒有任何影響,因為我們修改了該變量的“副本”。

// JavaScript
function foo(arg1) {
    arg1 = 2;
    alert('Local var = ' + arg1);
}
var x = 0;
foo(x);
alert('Outer var = ' + x);

// Local var = 2
// Outer var = 0

現在看看這個線程 看起來有一種使用空對象的部分解決方案。 我不確定在哪些情況下會起作用,但可以肯定的是,這是非常有限的 hack。

如果這對您的情況沒有幫助,那么看起來是時候使用 VBScript 了。 無論如何,從 VBS 開始是很容易的。 這是我接觸過的對用戶最友好的語言。 我需要幾天甚至幾周才能開始使用其他語言,而在使用 VBS 幾個小時后,我就可以自由地使用它了。

[編輯] 嗯,我做了很多努力來回復,乍一看:) 從你遇到的語言限制開始。 之后將解釋該限制的性質(什么是“輸入/輸出”參數),最好的方法是通過示例,這就是我所做的。 之后,我將向您展示在 JS 中處理此限制的唯一解決方法。 我們可以認為這是完整的答案嗎?

你沒有提到你是否測試了這個“空對象技巧”,但你仍然問我假設你這樣做了,它不適用於你的 OCX,對吧? 然后,在這種情況下,您只是被迫通過 VBScript 處理您的 OCX,這是我從一開始的回答。 由於您更喜歡使用 JS,因此您需要在您的解決方案中集成一段 VB 代碼。

正如您所指出的,這種 VBs/Js 集成是一個全新的問題。 是的,當然是個好問題,但這是一個新話題。

好的,假設您在下面附加的問題:“為什么它應該將對象作為函數參數傳遞”,仍然是主要問題的一部分。 好吧,如您所見,即使每天使用 JS 的人(我不是其中之一)也不知道“幕后”會發生什么,即不要指望在這種情況下 JS 引擎會做什么,或者如何作弊JS 引擎可以做一些它不應該做的事情。 就我個人而言,由於我很少使用 JS 並且不用於此類任務,因此我什至不確定這個技巧是否有效。 但正如 JS 人斷言它有效(在某些情況下),那么我們會信任他們。 但僅此而已。 如果這種方法失敗,那么它不是一種選擇。

現在剩下的就是一點功課了,你要研究所有可用的VBs/Js集成方法,也測試它們,看看哪個最適合你的領域,如果你碰巧遇到困難,那就來吧——帶着新話題和你試圖解決的具體問題回到論壇。

為了盡可能地提供幫助,我將通過幾個參考資料幫助您入門。

這是計划...

1.如果可以在沒有 VBs/Js 集成的情況下工作,則使用獨立的 .VBS 文件(在 WSH 環境中),否則...

2.如果您在瀏覽器環境(HTML 或HTA )中工作,那么您可以嵌入兩者(VBs/Js),並且您的集成將很簡單。

3.或者可以將 VBs/Js 與Windows Script Files (.wsf)集成。

4.或者使用允許從 JScript 內(或向后/相反)運行 VBScript 的 ScriptControl。

鏈接:

什么是批處理嵌入腳本:

5.其他一些方法(如果你發現了,那是我不知道的)。

好吧,經過所有這些改進,我看​​不出我可以追加什么,而且我認為,現在我的答案已經很完整了。 如果您同意我的回答,請單擊白色大箭頭接受它。 當然,如果您希望從其他用戶那里得到更好的回復,您可能仍然需要等待,但請記住,未回答的問題會在一段時間內保持活躍,然后關閉。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM