我已经将此连接到我PC的实验室设备。它使用特殊的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="";
方法中都遇到类型不匹配错误这是API手册必须说的
long GetLastError(VARIANT* Error)
[out] Error is the error string associated with the error code for the last error Remarks: This call will return a VT_BSTR VARIANT associated with the last error. Return Value: If the call succeeds, it returns 0. If the call fails, an error code is returned from the function.
长Get(LPCTSTR lpszParam,VARIANT * vValue)
[in] lpszParam is the name of the parameter e.g. “AP_MAG”
[in][out] vValue is the value of the parameter Remarks: This call will get the value of the parameter specified and return it in vValue. In C++, before calling this functions you have to specify the variant type (vValue.vt) to either VT_R4 or VT_BSTR. If no variant type is defined for vValue, it defaults to VT_R4 for analogue parameters (AP_XXXX) and VT_BSTR for digital parameters (DP_XXXX). If the variant type is VT_R4 for an analogue parameter, then the floating point representation is returned in the variant. If a VT_BSTR variant is passed, analogue values are returned as scaled strings with the units appended (e.g. AP_WD would return “= 10mm”). For digital parameters, VT_R4 variants result in a state number and VT_BSTR variants result in a state string (e.g. DP_RUNUPSTATE would return state 0 or “Shutdown” or the equivalent in the language being supported). In C++, if the variant type was specified as VT_BSTR then the API will internally allocate a BSTR which the caller has to de-allocate using the SDK call ::SysFreeString (vValue.bstrVal)
最佳答案
欢迎来到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几个小时后,我就可以自由使用它了。
[编辑]好吧,我做出了很多努力,乍看起来似乎很:)从遇到的语言限制入手。然后,将解释该限制的性质(“in/out”参数的含义),以及实现该限制的最佳方法是通过示例,这就是我所做的。然后,我向您展示解决JS中此限制的唯一解决方法。我们可以认为这是完整的答案吗?
您没有提到是否测试了这个“空对象技巧”,但是您仍然问我,我想您是这样做的,并且它不适用于OCX,对吗?然后,在这种情况下,您仅被迫通过VBScript处理OCX,从一开始我的回答就是。而且,由于您倾向于使用JS,因此需要在解决方案中集成一段VB代码。
正如您也指出的那样,这种VB/Js集成是一个全新的问题。是的,当然是个好问题,但这是新话题。
好的,可以说,您在下面附加的问题:“为什么它应该与将对象作为函数参数传递一起使用”,仍然是主要问题的一部分。好了,如您所见,即使每天使用JS的人(也不是其中之一)也不知道“幕后”会发生什么,即不要指望JS引擎在这种情况下会做什么或如何作弊的答案JS引擎可以执行其并非旨在执行的操作。就我个人而言,由于我很少使用JS而不是用于此类任务,因此甚至不确定此技巧是否完全有效。但是,正如JS-guys断言的那样(在某些情况下),它会起作用,那么我们会信任他们。但这就是全部。如果这种方法失败了,那就不是一种选择。
现在剩下的是一些功课,您将研究所有可用的VB/Js集成方法,并对其进行测试,以查看哪种方法最适用于您的域,如果碰巧遇到困难,那就来吧-返回论坛并提供新主题和您要解决的具体问题。
为了获得尽可能多的帮助,我将为您提供一些引用资料,以帮助您入门。
这是计划...
1. 如果不使用VB/Js集成就可以工作,请使用独立的.VBS文件(在WSH环境中),否则...
2. 如果您在浏览器环境(HTML或HTA)中工作,则可以同时嵌入两者(VB/J),并且集成将很简单。
3. 或可以将VB/J与Windows Script Files (.wsf)集成。
4. 或使用ScriptControl,允许从JScript(或向后/相对)中运行VBScript。
链接:
批量嵌入脚本
什么是批处理嵌入脚本:
5. 其他一些方法(如果发现,则不知道)。
好吧,在所有这些改进之后,我看不到我可以追加的内容,而且我认为,现在
我的回答不止于此。如果您同意我的回答,请单击白色大箭头以接受它。当然,如果您希望得到其他用户的更好答复,您可能仍在等待,但请记住,未回答的问题会保持活跃一段时间,然后关闭。
关于javascript - 需要帮助将vbs代码转换为jscript。我遇到了运行时错误类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15265631/