javascript - 需要帮助将vbs代码转换为jscript。我遇到了运行时错误类型不匹配

标签 javascript vbscript compiler-errors type-mismatch

我已经将此连接到我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.GetLastErrorvar 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。

链接:
  • Using the ScriptControl
  • How To Call Functions Using the Script Control
  • An example通过ScriptControl通过VB/Js集成
    批量嵌入脚本

  • 什么是批处理嵌入脚本:
  • VBS/Batch Hybrid
  • JS/Batch Hybrid

  • 5. 其他一些方法(如果发现,则不知道)。

    好吧,在所有这些改进之后,我看不到我可以追加的内容,而且我认为,现在
    我的回答不止于此。如果您同意我的回答,请单击白色大箭头以接受它。当然,如果您希望得到其他用户的更好答复,您可能仍在等待,但请记住,未回答的问题会保持活跃一段时间,然后关闭。

    关于javascript - 需要帮助将vbs代码转换为jscript。我遇到了运行时错误类型不匹配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15265631/

    相关文章:

    c - 静态声明遵循非静态声明错误消息

    javascript - Javascript 到 Python 的解压例程

    javascript - 如何从 typescript 文件调用 JavaScript 函数

    javascript - 如何停止运行下一个功能?

    http - VBS中以post形式上传文件

    compiler-errors - 用于 MAC OS X 上 Eclipse CDT 的 LLVM-Clang

    java - 如何解决错误 "package org.springframework.web.bind.annotation does not exist"

    javascript - 使用事件委托(delegate)时如何访问与元素关联的数据

    vb.net - Vbscript - 将字符从逗号字符向右移动

    asp-classic - VBScript/Classic ASP 中还有其他预处理器指令吗?