JavaScriptとActiveXの間にデータを転送する-連載の一
3883 ワード
本論文では、JSなどのスクリプト言語とActiveXコントロールとの間でどのように通信し、各種パラメータやCOMのIDispatchインターフェースを伝達するかを検討します.同様の方法を使用すると、LUA、AutoCadなど、他のすべてのシナリオ言語に拡張できます.
本稿では以下のいくつかの側面を検討する.
型配列の調整文字列パラメータ、文字列戻り値着信文字列の内容を変更する配列パラメータIDispatchインターフェース紹介入力配列の内容を変更する配列内容を追加する配列参照で、JSはS 4 Execute()を呼び出します.
この文章は長いので、連載で発表します.連載は主に1~3点、連載は4~6点、連載は7~8時がメインです.
(一)整数パラメータ
1.型式パラメータは、直接伝えることができます.整数の戻り値は[retVal]Long*で宣言する必要があります.
2.COM中c++コネクタ定義
1.COMでは、文字列はBSTRで表されていますが、BSTRは実際にはUNICODE文字配列(WCHAR[])です.
2.COM文字列の参照規定:
a)文字列変数を生成するには、SysAllocString/SysAllocStrigByteLen割り当て空間が必要です.
b)関数が終了する前に、割り当てられた空間は解放される必要があり、SysFree Stering.
c)関数に割り当てられた空間を戻り値とすると、解放されない.外部調達者が釈放に責任を負う.
3.COM中c++関数定義
1.原則として、着信文字列のメモリデータを修正しないと、データを破壊し、js端の異常を引き起こす可能性があります.
2.使用中に、着信文字列バッファの内容を変更する方法により、パラメータの転送が可能です.
3.SysFree Steringを使って、入ってきたBSTRパラメータを破壊してはいけません.そうでないと、jsメモリ構造を破壊します.
4.COM中C++定義
元文字列:abcdefghijklmn
呼び出し後:012345789:<=
本稿では以下のいくつかの側面を検討する.
型配列の調整文字列パラメータ、文字列戻り値着信文字列の内容を変更する配列パラメータIDispatchインターフェース紹介入力配列の内容を変更する配列内容を追加する配列参照で、JSはS 4 Execute()を呼び出します.
この文章は長いので、連載で発表します.連載は主に1~3点、連載は4~6点、連載は7~8時がメインです.
(一)整数パラメータ
1.型式パラメータは、直接伝えることができます.整数の戻り値は[retVal]Long*で宣言する必要があります.
2.COM中c++コネクタ定義
STDMETHODIMP CJsAtl::IntSum(LONG a, LONG b, LONG* retVal)
{
*retVal = a + b;
return S_OK;
}
3.Jsで呼び出し<object id="obj" classid="CLSID:AD694878-......"> </object>
function test_int()
{
var a = 1;
var b = 2;
try {
var obj = document.getElementByIdx_xx_x("obj");
var retVal = obj.IntSum(a, b);
Alert("RetVal: " + retVal);
} catch (e) {
Alert( "Js error: " + e.message);
}
}
(二)文字列パラメータ、文字列の戻り値1.COMでは、文字列はBSTRで表されていますが、BSTRは実際にはUNICODE文字配列(WCHAR[])です.
2.COM文字列の参照規定:
a)文字列変数を生成するには、SysAllocString/SysAllocStrigByteLen割り当て空間が必要です.
b)関数が終了する前に、割り当てられた空間は解放される必要があり、SysFree Stering.
c)関数に割り当てられた空間を戻り値とすると、解放されない.外部調達者が釈放に責任を負う.
3.COM中c++関数定義
STDMETHODIMP CJsAtl::StringAdd(BSTR str1, BSTR str2, BSTR* retVal)
{
int len = SysStringLen(str1);
len += SysStringLen(str2);
len += 4; // '\0'
BSTR result = SysAllocStringLen(NULL, len);
memset(result, 0, len * 2); //
StrCat(result, str1);
StrCat(result, str2);
*retVal = result; // 。 :
return S_OK;
}
4.JSで呼び出しfunction test_str_cat()
{
var a = "123";
var b = "abc";
try {
var obj = document.getElementByIdx_xx_x("obj");
var retVal = obj.StringAdd(a, b);
alert("RetVal: " + retVal);
} catch (e) {
alert("JS ERROR: " + e.message);
}
}
(三)入力文字列の内容を変更する1.原則として、着信文字列のメモリデータを修正しないと、データを破壊し、js端の異常を引き起こす可能性があります.
2.使用中に、着信文字列バッファの内容を変更する方法により、パラメータの転送が可能です.
3.SysFree Steringを使って、入ってきたBSTRパラメータを破壊してはいけません.そうでないと、jsメモリ構造を破壊します.
4.COM中C++定義
STDMETHODIMP CJsAtl::StrModify(BSTR str)
{
int len = SysStringLen(str); // : BSTR, ,
for (int i = 0; i < len; i++)
str[i] = '0' + i;
return S_OK;
}
5.JS呼び出しfunction test_str_modify()
{
var str = "abcdefghijklmn";
try {
var obj = document.getElementByIdx_xx_x("obj");
obj.StrModify(str);
alert("After modify: " + str);
} catch (e) {
alert("JS ERROR: " + e.message);
}
}
6.試験実行元文字列:abcdefghijklmn
呼び出し後:012345789:<=