2

私の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 *エラー)

[out] Errorは、最後のエラーのエラーコードに関連付けられたエラー文字列です。備考:この呼び出しは、最後のエラーに関連付けられたVT_BSTRVARIANTを返します。戻り値:呼び出しが成功した場合は0を返します。呼び出しが失敗した場合は、関数からエラーコードが返されます。

long Get(LPCTSTR lpszParam、VARIANT * vValue)

[in] lpszParamは、パラメータの名前です。例:「AP_MAG」<br> [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または「シャットダウン」またはサポートされている言語の同等のものを返します)。C ++では、バリアントタイプがVT_BSTRとして指定されている場合、APIはBSTRを内部的に割り当て、呼び出し元はSDK呼び出し:: SysFreeString(vValue.bstrVal)を使用して割り当てを解除する必要があります。

4

1 に答える 1

2

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

このスレッドを見てみましょう。空のオブジェクトを使用することで、一種の部分的な解決策があるようです。どのケースでうまくいくかはわかりませんが、非常に限られたハックであることは確かです。

これがあなたのケースで役に立たない場合は、VBScript を使用する時が来たようです。とにかく、VBS から始めるのは簡単です。これは、私が今まで触れた中で最もユーザーフレンドリーな言語です。他の言語を使い始めるのに数日、場合によっては数週間かかりましたが、VBS を数時間使用しただけで、自由に使用できるようになりました。

[編集] さて、一見したように見えるように、返信するためにさらに多くの努力をしました:) あなたが会った言語の制限から始めます。その後、その制限の性質 (「in/out」パラメーターとは何か) を説明します。これを行う最善の方法は、例を使用することです。その後、JS のこの制限に対処するための唯一の回避策を紹介します。これを完全な答えと見なすことができますか?

この「空のオブジェクトトリック」をテストするかどうかについては言及していませんが、まだ質問しているように、それを行ったと思いますが、OCXでは機能しませんよね? 次に、この場合、VBScript を介して OCX を処理することを余儀なくされます。最初から私の答えは何でしたか。また、JS を使用したい場合は、ソリューションに VB コードを統合する必要があります。

そして、あなたも指摘したように、この VB/Js 統合はまったく新しい問題です。はい、もちろん良い質問ですが、それは新しいトピックのメーターです。

わかりました、あなたが以下に追加した質問としましょう:「なぜオブジェクトを関数パラメータとして渡すとうまくいくのか」は、まだ主要な質問の一部です。ご覧のとおり、毎日 JS を使用している人々 (私はその 1 人ではありません) でさえ、「ボンネットの裏側」で何が起こっているのかわかりません。設計されていないことを行うための JS エンジン。個人的には、私はJSをめったに使用せず、そのようなタスクには使用しないため、このトリックが機能するかどうかさえわかりません. しかし、JS-guys が (場合によっては) 動作すると主張しているので、私たちは彼らを信頼します。しかし、それだけです。このアプローチが失敗した場合、それはオプションではありません。

残っているのは少しの宿題です。VB/J の統合に使用できるすべての方法を調べ、それらをテストして、ドメインに最も適した方法を確認します。偶然に問題が発生した場合は、すぐに来てください。新しいトピックと解決しようとしている具体的な問題についてフォーラムに戻ってください。

そして、できる限り役立つように、いくつかのリファレンスを使用して開始できるようにします.

これが計画です...

1. VB/Js 統合なしで作業できる場合は、Stay-alone .VBS ファイル (WSH 環境) を使用します。それ以外の場合は ...

2.ブラウザ環境 (HTML またはHTA ) で作業している場合は、両方 (VB/J) を埋め込むことができ、統合は簡単です。

3.または、VB/J をWindows スクリプト ファイル (.wsf)と統合することもできます。

4.または、JScript 内 (または後方/反対側) から VBScript を実行できるようにする ScriptControl を使用します。

リンク:

バッチ埋め込みスクリプトとは:

5.他の方法 (見つけた場合、それは認識されていません)。

さて、このすべての改善の後、さらに追加できるものがわかりません。私が思うに、私の答えは完全ではありません。私の答えに同意する場合は、大きな白い矢印をクリックして同意してください。もちろん、他のユーザーからより良い回答が得られることを期待している場合は、まだ待つこともできますが、未回答の質問はしばらくアクティブのままで、その後クローズされることに注意してください。

于 2013-03-07T22:49:40.640 に答える