青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-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"
從以上注冊表項目可以看出, 當我們要創建 wsc 組件時, COM 運行時將會加載 scrobj.dll 鏈接庫, scrobj.dll 鏈接庫將根據 scriptletURL 的鍵值 file:///D:/lower2upper.wsc 加載 wsc 腳本, 最后由 scrobj.dll 將腳本解釋成一個 COM 組件實例, 將這個實例指針返回給調用者.

最后, 我們來編寫 C++ 客戶端, 隨便創建一個 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 環境下調試 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://m.shnenglu.com/Files/free2000fly/jsTest.zip
posted on 2009-05-23 23:06 free2000fly 閱讀(3177) 評論(2)  編輯 收藏 引用

評論:
# re: 從 C++/ATL 客戶程序調用 Javascript 編寫的組件 2009-05-27 10:44 | smm
牛,搞技術的真厲害啊  回復  更多評論
  

只有注冊用戶登錄后才能發表評論。
網站導航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <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>
            中文网丁香综合网| 欧美激情视频网站| 欧美xart系列高清| 久久美女艺术照精彩视频福利播放| 欧美三级免费| 亚洲无吗在线| 欧美在线一二三区| 亚洲欧洲精品一区二区三区| 99亚洲一区二区| 亚洲第一页中文字幕| 久久国产直播| 中文一区二区在线观看| 久久久蜜桃精品| 亚洲五月六月| 久久人人97超碰国产公开结果| 亚洲精品国产精品国自产在线| 国产午夜精品一区二区三区欧美 | 亚洲日本一区二区三区| 国产美女精品视频| 欧美日韩免费网站| 国产日韩在线一区| 亚洲成色www久久网站| 亚洲电影有码| 亚洲欧美日韩另类精品一区二区三区| 亚洲午夜精品久久| 麻豆成人在线播放| 亚洲另类在线视频| 久久亚洲高清| 国产精品亚发布| 亚洲国产综合在线| 校园激情久久| 欧美激情精品久久久| 亚洲欧美另类国产| 欧美成人免费va影院高清| 国产欧美日韩精品在线| 亚洲日韩中文字幕在线播放| 欧美在线亚洲在线| 91久久久久久久久| 美女啪啪无遮挡免费久久网站| 国产精品你懂的在线欣赏| 亚洲黄色成人久久久| 久久久久久久综合| 一区二区三区四区五区精品视频| 久久九九国产| 麻豆成人精品| 午夜精品久久久久久99热| 欧美日韩免费观看中文| 亚洲免费观看高清完整版在线观看熊 | 欧美一级欧美一级在线播放| 最新亚洲视频| 免费久久99精品国产自| 国产亚洲欧美在线| 欧美在线一二三| 正在播放欧美视频| 欧美日韩成人在线视频| 亚洲三级免费电影| 欧美3dxxxxhd| 久久欧美中文字幕| 在线精品视频一区二区| 开元免费观看欧美电视剧网站| 欧美伊人久久久久久久久影院| 亚洲激情校园春色| 欧美成年人视频网站| 亚洲国产mv| 欧美高清视频www夜色资源网| 久久九九国产精品| 精品成人一区二区| 欧美77777| 欧美成人免费观看| 亚洲精品四区| 亚洲欧洲一二三| 国产精品久久久久999| 欧美亚洲视频在线看网址| 亚洲图片在线观看| 狠狠色噜噜狠狠色综合久| 麻豆精品一区二区av白丝在线| 久久久久久久97| 亚洲高清视频一区| 亚洲国内精品| 国产精品成人免费| 久久精品视频亚洲| 久久女同互慰一区二区三区| 亚洲黄色免费网站| 99国产精品久久久| 国产亚洲欧美日韩一区二区| 欧美大片在线观看一区二区| 欧美大片va欧美在线播放| 亚洲一区激情| 久久成人这里只有精品| 亚洲乱码国产乱码精品精98午夜| 在线视频亚洲| 欧美第一黄色网| 亚洲免费观看高清在线观看 | 午夜久久久久久| 久久成人免费日本黄色| 亚洲精品美女久久久久| 亚洲欧美日韩国产另类专区| 亚洲欧美激情四射在线日| 国产日韩一区二区三区| 欧美激情久久久| 国产精品男人爽免费视频1| 久久人人爽人人爽| 欧美日韩一区二区视频在线| 久久精品国产欧美激情| 欧美日韩国产在线播放网站| 久久一区激情| 欧美午夜欧美| 欧美.com| 国产日韩一区二区| 中文久久精品| 亚洲激情欧美激情| 欧美一级电影久久| 亚洲一区亚洲| 欧美jjzz| 久久―日本道色综合久久| 欧美日韩国产片| 蜜臀av一级做a爰片久久| 欧美人与性动交cc0o| 久久综合色天天久久综合图片| 欧美日韩在线播| 欧美 亚欧 日韩视频在线| 国产精品视频一区二区高潮| 中文网丁香综合网| 久久久99免费视频| 久久aⅴ国产欧美74aaa| 欧美日韩国产色综合一二三四| 欧美xxx成人| 国产一区二区激情| 一区二区精品| 亚洲精品久久7777| 欧美亚洲三区| 亚洲尤物在线视频观看| 欧美日韩视频在线| 亚洲黄色高清| 亚洲欧洲一区二区三区| 免费观看亚洲视频大全| 久久先锋资源| 激情综合自拍| 欧美中文字幕在线| 久久久99精品免费观看不卡| 国产一区二区在线免费观看| 欧美在线国产精品| 久久手机免费观看| 在线播放亚洲| 欧美电影电视剧在线观看| 欧美高清视频| 日韩亚洲欧美中文三级| 欧美日韩综合| 亚洲男女毛片无遮挡| 久久国产精品久久久久久| 国产一区二区三区在线观看免费| 久久精品国产一区二区三区| 免费在线观看精品| 亚洲人成艺术| 欧美激情一区二区| 9国产精品视频| 欧美一区二区三区电影在线观看| 国产区在线观看成人精品| 欧美一区二区免费| 欧美激情视频一区二区三区免费| 日韩一级二级三级| 欧美午夜精品久久久久久久| 亚洲图片欧美一区| 久久一区激情| 亚洲天堂av图片| 国产乱肥老妇国产一区二| 久久精品国产亚洲一区二区| 久久综合伊人77777蜜臀| 亚洲品质自拍| 国产精品另类一区| 久久综合九色欧美综合狠狠| 亚洲精选视频免费看| 久久高清福利视频| 亚洲日韩中文字幕在线播放| 国产精品美女| 欧美高清日韩| 欧美一区二区三区四区视频| 最新高清无码专区| 久久精视频免费在线久久完整在线看| 亚洲国产精品成人综合色在线婷婷| 欧美国产精品| 久久av一区二区| 一本一本大道香蕉久在线精品| 美女精品自拍一二三四| 夜夜精品视频一区二区| 国模私拍一区二区三区| 欧美日韩另类丝袜其他| 久久永久免费| 日韩亚洲欧美成人| 欧美成人精品h版在线观看| 午夜一区二区三区不卡视频| 亚洲经典自拍| 在线电影国产精品| 国产欧美日韩在线视频| 欧美日韩免费高清| av不卡在线| 欧美激情一区二区三级高清视频| 欧美在线一级视频| 欧美亚洲视频在线观看| 一区二区三区日韩|