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++コネクタ定義
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:<=