Javascript 需要帮助将vbs代码转换为jscript。我得到一个运行时错误类型不匹配

Javascript 需要帮助将vbs代码转换为jscript。我得到一个运行时错误类型不匹配,javascript,vbscript,compiler-errors,type-mismatch,Javascript,Vbscript,Compiler Errors,Type Mismatch,我有一台连接到我的电脑的实验室设备。它使用特殊的OCX文件与设备通信(读取、设置参数等)。我从手册中得到了这个代码,看起来很有效。我收到一个消息框,上面写着“放大率=1272.814上次错误=API未初始化” 新页 因此,由于我对vbs的了解率为0%,对jscript的了解率为10%,所以我试图用Javascript重写同样的东西。我还有一些必要的代码已经用js编写好了 <script language="JScript"> var Api1=new ActiveXObject(

我有一台连接到我的电脑的实验室设备。它使用特殊的OCX文件与设备通信(读取、设置参数等)。我从手册中得到了这个代码,看起来很有效。我收到一个消息框,上面写着“放大率=1272.814上次错误=API未初始化”


新页
因此,由于我对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>

var Api1=新的ActiveXObject(“ApiCtrl”);
var值;
变量r;
Api1.草签(“”);
Api1.Get(“AP_MAG”,值);
Api1.GetLastError(er);
window.alert(“放大率=”+value+“\n最后一个错误=”+er);
Api1.ClosingControl();
不幸的是,我在
.get
.GetLastError
方法中得到了一个类型不匹配错误,该方法使用
var值;变量r
var值=”;var er=“”

以下是API手册的内容

long GetLastError(变量*错误)

[out]Error是错误字符串 与上次错误的错误代码关联 备注:此调用将返回与上次错误关联的VT_BSTR变量。返回 值:如果调用成功,则返回0。如果调用失败,则会出现错误 代码从函数返回

长Get(LPCTSTR lpszParam,变量*vValue)

[in]lpszParam是参数的名称,例如“AP_MAG”
[in][out]vValue是参数的值备注:此调用将获得 指定参数的值,并以vValue形式返回它。在C++中, 在调用此函数之前,必须指定变量类型 (vValue.vt)到vt_R4或vt_BSTR。如果未定义变量类型 对于vValue,模拟参数(AP_XXXX)和 数字参数的VT_BSTR(DP_XXXX)。如果变型类型为VT_R4 对于模拟参数,则浮点表示为 在变体中返回。如果通过VT_BSTR变体,则模拟 值作为附加单位的缩放字符串返回(例如。 AP_WD将返回“=10mm”)。对于数字参数,VT_R4变型 结果为状态编号,VT_BSTR变量结果为状态字符串 (例如,DP_RUNUPSTATE将返回状态0或“关机”或 在所支持的语言中等效)。在C++中,如果变量 类型被指定为VT_BSTR,则API将在内部分配 调用方必须使用SDK调用取消分配的BSTR ::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
前缀是可选的。为了清楚起见,我将其包括在内

该示例说明的是“按引用”或“输出”参数的含义。它的行为类似于返回值,因为它修改引用的变量。虽然修改“by value”变量在函数范围之外没有效果,因为我们修改了该变量的“副本”

// 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
现在看一看。看起来有一种使用空对象的局部解决方案。我不确定在哪种情况下会起作用,但可以肯定的是,这是一种非常有限的黑客行为

如果这对您的情况没有帮助,那么看起来是时候使用VBScript了。无论如何,从VBS开始很容易。这是我接触过的最友好的语言。我需要几天,甚至几周的时间学习其他语言才能开始学习,而使用VBS几小时后,我就可以自由地使用它了

[编辑]嗯,我做了更多的努力来回复,正如梅乍一看:)从你遇到的语言限制开始。之后,我将解释该限制的性质(什么是“in/out”参数),最好的方法是通过示例,这就是我所做的。之后,我将向您展示在JS中处理此限制的唯一解决方法。我们可以认为这是一个完整的答案吗?

你没有提到你是否测试过这个“空对象把戏”,但当你还在问我的时候,我想你是这么做的,而且它对你的OCX不起作用,对吧?然后,在这种情况下,您只是被迫通过VBScript处理OCX,从一开始我的答案是什么。由于您更喜欢使用JS,因此需要在解决方案中集成一段VB代码

正如您所指出的,这种VBs/Js集成是一个全新的问题。是的,当然是个好问题,但这是一个新话题

好的,假设您在下面附加的问题:“为什么它应该将对象作为函数参数传递”,仍然是主要问题的一部分。好吧,正如你所看到的,即使是每天使用JS的人(我不是他们中的一员)也不知道“幕后”会发生什么,也就是说,不要期望JS引擎在这种情况下做什么,或者这如何欺骗JS引擎去做它不打算做的事情。就我个人而言,由于我很少使用JS,而且也不用于此类任务,我甚至不确定这个技巧是否有效。但正如JS的人所断言的那样(在某些情况下),我们会相信他们。但这就是一切。如果这种方法失败了,那么它就不是一种选择

现在剩下的是一点家庭作业,您应该研究所有可用的VBs/Js集成方法,并对它们进行测试,看看哪种方法最适用于您的领域,如果您碰巧遇到困难,请带着新主题和您试图解决的具体问题回到论坛

为了尽可能地提供帮助,我将为您提供一些参考资料,以帮助您获得st
// 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