2013-03-07 43 views
2

我有這個實驗室設備,連接到我的電腦。它使用特殊的OCX文件與設備進行通信(讀取,設置參數等)。我從手冊中得到了這個代碼,似乎正在工作。我收到一個消息框,指出「Magnification = 1272.814 Last error = API未初始化」。需要幫助將vbs代碼轉換爲jscript。我得到一個運行時錯誤類型不匹配

<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="";

這裏一個類型不匹配錯誤是什麼API手冊有說

長GetLastError函數(VARIANT *錯誤)

[輸出]錯誤是錯誤字符串 與最後一個錯誤的錯誤代碼相關聯 備註:該調用將返回與上一個錯誤關聯的VT_BSTR VARIANT。返回 值:如果呼叫成功,則返回0.如果呼叫失敗,則從該函數返回代碼錯誤 。

長獲取(LPCTSTR lpszParam,VARIANT * VVALUE)

[IN] lpszParam是參數例如名稱「AP_MAG」
[輸入] [輸出] vValue是參數的值備註:該調用將獲得指定參數的 值並將其返回到vValue中。在調用此函數之前,在C++中, 必須將變量類型 (vValue.vt)指定爲VT_R4或VT_BSTR。如果沒有爲vValue定義變體類型 ,則對於模擬參數(AP_XXXX)和數字參數(DP_XXXX)的VT_BSTR,默認爲VT_R4 。如果對於模擬參數變量類型是VT_R4 ,則在該變體中返回的浮點表示是 。如果VT_BSTR變體通過,模擬量 值將作爲縮放後的字符串返回(例如 AP_WD將返回「= 10mm」)。對於數字參數,VT_R4變體 產生狀態編號並且VT_BSTR變體導致狀態字符串 (例如,DP_RUNUPSTATE將返回狀態0或「關機」或相當於支持的語言的 )。使用SDK呼叫 :: SysFreeString(vValue.bstrVal)

回答

2

在C++中,如果變體 類型被指定爲VT_BSTR則API將在內部分配 BSTR其調用者有解除分配歡迎來到StackOverflow!

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

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

' 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前綴是可選的。爲了清楚起見,我將其包括

示例說明的是「參照」或「出」參數的含義。它的行爲與返回值相似,因爲它修改了引用變量。雖然修改「按值」變量在函數範圍外沒有任何作用,因爲我們修改了該變量的「副本」。

// 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 

現在看看this thread。看起來像使用空對象有一種局部解決方案。我不確定哪些情況會起作用,但肯定是非常有限的黑客行爲。

如果這不是你的情況幫,然後看起來像它的時間去使用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.其他一些方法(如果你發現,那我不知道)。

那麼,畢竟這種改進,我沒有看到我可以追加更多,而且我認爲,現在我的答案不僅僅是完整的。如果您同意我的回答,請點擊白色大箭頭接受它。當然,如果您希望得到其他用戶的更好回覆,您仍然可以等待,但請記住,未解答的問題只會保持一段時間,然後關閉。

+0

所以基本上它是OCX文件的作者很糟糕,而不是乾淨的方式來傳遞新的變量值,就像在我的情況下'value = Api1.Get(「AP_MAG」);'他們做了他們做的事情沒有。 – Alex 2013-03-08 19:43:49

+0

問題是我試圖在自定義環境中構建WSH的ontop頂部運行我的腳本。有很多已經用Jscript編寫的自定義函數,我計劃用於自己的函數的部分代碼也在JS中。充其量,我不得不重寫VBS中的一些代碼,但在VBS中調用JS函數是我理解的另一個故事。 – Alex 2013-03-08 19:52:51

+0

這不是由於OCX的作者,許多語言支持和使用「by-ref」params,但只是一個JS語言的限制,你不能做任何事情。 – 2013-03-08 20:05:31

相關問題