• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-60  評論-262  文章-1  trackbacks-0
            有這個問題是因為, 我們可能要用 JavaScript 語言作為 "膠水" 粘合我們的 C++/ATL 組件, 那, 怎么在客戶端使用 "膠水" 呢"? 以下就是它的簡介.

            首先, 用 JavaScript 語言編寫組件, 以下是個例子:

            <?xml version="1.0" encoding="UTF-8"?>
            <?component error="true" debug="true"?>
            <component id="XrhTest.LowerToUpper">

            <registration
               description = "UpperCase and lowCase convertion"
               progid="XrhTest.LowerToUpper"
               version="1.0"
               classid="{9B88510F-9D5B-4dcd-9068-8AB0B4F7999C}" remotable="true">
            </registration>

            <public>

            <!-- define method -->
            <method name="toLower">
              <parameter name="str"/>
            </method>
            <method name="toUpper">
              <parameter name="str"/>
            </method>

            </public>

            <script language="JavaScript">
            <![CDATA[
            function toLower(str)
            {
                var result=str.toLowerCase();
                return result;
            }
            function toUpper(str)
            {
                var result=str.toUpperCase();
                return result;
            }
            ]]>
            </script>

            </component>


            將這個組件保存為 lower2upper.wsc 文件.
            然后, 注冊這個組件, 方法是, 在這個 wsc 文件上右擊鼠標, 然后選 "注冊" 菜單項, 完成注冊, 點擊 OK 按鈕完成操作. 如下圖

            注冊完成后, 在注冊表內有以下條目
            [HKEY_CLASSES_ROOT\CLSID\{9B88510F-9D5B-4DCD-9068-8AB0B4F7999C}]
            @
            ="UpperCase and lowCase convertion"
            "AppID"="{9B88510F-9D5B-4DCD-9068-8AB0B4F7999C}"

            [HKEY_CLASSES_ROOT\CLSID\{9B88510F-9D5B-4DCD-9068-8AB0B4F7999C}\InprocServer32]
            @
            ="C:\\WINDOWS\\System32\\scrobj.dll"
            "ThreadingModel"="Apartment"

            [HKEY_CLASSES_ROOT\CLSID\{9B88510F-9D5B-4DCD-9068-8AB0B4F7999C}\ProgID]
            @
            ="XrhTest.LowerToUpper.1.0"

            [HKEY_CLASSES_ROOT\CLSID\{9B88510F-9D5B-4DCD-9068-8AB0B4F7999C}\ScriptletURL]
            @
            ="file:///D:/lower2upper.wsc "

            [HKEY_CLASSES_ROOT\CLSID\{9B88510F-9D5B-4DCD-9068-8AB0B4F7999C}\VersionIndependentProgID]
            @
            ="XrhTest.LowerToUpper"
            從以上注冊表項目可以看出, 當我們要創(chuàng)建 wsc 組件時, COM 運行時將會加載 scrobj.dll 鏈接庫, scrobj.dll 鏈接庫將根據(jù) scriptletURL 的鍵值 file:///D:/lower2upper.wsc 加載 wsc 腳本, 最后由 scrobj.dll 將腳本解釋成一個 COM 組件實例, 將這個實例指針返回給調用者.

            最后, 我們來編寫 C++ 客戶端, 隨便創(chuàng)建一個 C++ 文件, 然后用 VC6 編譯, 運行, 查看結果. 示例代碼如下:
            #include <atlbase.h>
            extern CComModule _Module; 
            #include 
            <atlcom.h>

            void main()
            {
                CoInitialize(NULL);

                {
                    HRESULT hr 
            = E_FAIL;
                    CComQIPtr
            <IDispatch> spTmp;
                    hr 
            = spTmp.CoCreateInstance(L"XrhTest.LowerToUpper");
                    
            if (SUCCEEDED(hr))
                    {
                        CComDispatchDriver spDisp(spTmp); 
                        CComVariant varParam(L
            "The quick brown fox jumps over the lazy dog"); 
                        CComVariant varResult;
                        hr 
            = spDisp.Invoke1(L"toUpper"&varParam, &varResult);
                        
            if (SUCCEEDED(hr))
                        {
                            MessageBoxW(NULL, (LPCWSTR) varResult.bstrVal, L
            "MB_OK", MB_OK); 
                        }
                    }
                }

                CoUninitialize(); 
            }

            CComModule _Module; 
            如果不出意外, 運行結果將彈出一個全是大寫文本的對話框. 如下圖:


            以上所講的組件注冊將會在注冊表內留下痕跡, 不夠綠色. 如果組件不注冊, 或者腳本內沒有 <registration> 元素, 可以使用以下介紹的方法來使用 wsc 組件.
            #include <atlbase.h>
            extern CComModule _Module; 
            #include 
            <atlcom.h>

            HRESULT CreateScriptComponent(LPCTSTR lpszScriptletURL, OUT IDispatch 
            ** ppDispatch)
            {
                HRESULT hr 
            = E_FAIL;
                
            do
                
            {
                    
            if (NULL == ppDispatch) {
                        
            break;
                    }


                    CComPtr
            <IBindCtx> pbc;
                    CComPtr
            <IMoniker> pMoniker;
                    
                    hr 
            = CreateBindCtx(0&pbc);
                    
            if (FAILED(hr)) {
                        
            break;
                    }

                    
                    CComBSTR strPath(L
            "script:");
                    strPath.Append(lpszScriptletURL);
                    ULONG lEaten 
            = 0;
                    hr 
            = MkParseDisplayName(pbc, strPath, &lEaten, &pMoniker);
                    
            if (FAILED(hr)) {
                        
            break;
                    }

                    
                    hr 
            = BindMoniker(pMoniker, 0, __uuidof(IDispatch), (void**)ppDispatch);
                    
            if (FAILED(hr)) {
                        
            break;
                    }
             
                }
             while(false);

                
            return hr;
            }


            int _tmain(int argc, _TCHAR* argv[])
            {
                HRESULT hr 
            = E_FAIL;
                CoInitialize(NULL);
                
                
            do
                
            {
                    CComPtr
            <IDispatch> pScript;
                    hr 
            = CreateScriptComponent(
                        _T(
            "file:///d:/lower2upper.wsc"), // _T("d:\\lower2upper.wsc")
                        &pScript);
                    
            if (FAILED(hr)) {
                        
            break;
                    }


                    CComDispatchDriver spDisp(pScript); 
                    
                    CComVariant varParam(L
            "The quick brown fox jumps over the lazy dog"); 
                    CComVariant varResult;
                    HRESULT hr 
            = spDisp.Invoke1(L"toUpper"&varParam, &varResult);
                    
            if (SUCCEEDED(hr)) {
                        MessageBoxW(NULL, (LPCWSTR) varResult.bstrVal, L
            "MB_OK", MB_OK); 
                    }

                }

                
            while (false);
                
                CoUninitialize();
                
                
            return 0;
            }


            CComModule _Module; 


            參考文獻:
            http://blog.csdn.net/broadview2006/archive/2009/03/19/4004361.aspx
            http://www.vckbase.com/document/viewdoc/?id=1518
            延伸閱讀:
            <<怎樣在 Windows 環(huán)境下調試 JScript 腳本>>
            <<幾行代碼讓你的程序加入vbscipt腳本擴展功能>>
            http://support.microsoft.com/kb/221992/en-us
            http://support.microsoft.com/kb/223139/en-us
            http://support.microsoft.com/kb/196135/en-us
            http://support.microsoft.com/kb/168214/
            http://support.microsoft.com/kb/183698/


            PS, 一個稍微有點用的例子:

            源代碼:    http://www.shnenglu.com/Files/free2000fly/jsTest.zip
            posted on 2009-05-23 23:06 free2000fly 閱讀(3162) 評論(2)  編輯 收藏 引用

            評論:
            # re: 從 C++/ATL 客戶程序調用 Javascript 編寫的組件 2009-05-27 10:44 | smm
            牛,搞技術的真厲害啊  回復  更多評論
              
            久久久亚洲裙底偷窥综合| 一本久久a久久精品综合香蕉| 久久综合久久美利坚合众国| 精品久久久久久无码人妻热| 久久亚洲国产午夜精品理论片| 久久综合九色综合网站| 亚洲午夜久久久久妓女影院| 思思久久99热只有频精品66| 日韩欧美亚洲国产精品字幕久久久| 久久精品国产半推半就| 精品国产乱码久久久久久郑州公司 | 久久亚洲春色中文字幕久久久| 亚洲国产视频久久| 国产婷婷成人久久Av免费高清| 77777亚洲午夜久久多喷| www性久久久com| 99久久精品九九亚洲精品| 久久精品国产精品亚洲人人| 欧美久久天天综合香蕉伊| 思思久久好好热精品国产| 久久精品免费一区二区| 久久99精品久久久久久久久久| MM131亚洲国产美女久久| 亚洲国产二区三区久久| 日韩十八禁一区二区久久| 77777亚洲午夜久久多喷| 久久99国产精品99久久| 久久精品国产一区二区三区| 99久久国产亚洲综合精品| 国内精品久久人妻互换 | 狠狠色丁香婷综合久久| 国产综合精品久久亚洲| 久久精品国产免费观看三人同眠| 久久国产精品99国产精| 久久AⅤ人妻少妇嫩草影院| 一本色道久久88精品综合| 久久精品国产一区二区三区日韩| 欧美一级久久久久久久大| 久久久免费精品re6| 久久国产香蕉一区精品| 麻豆成人久久精品二区三区免费 |