• <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>

            life is game

            (本色)
            posts - 11, comments - 4, trackbacks - 0, articles - 0
              C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

            [網(wǎng)頁]+ [ ALT COM AppWizard]

            Posted on 2006-11-23 11:53 原色 閱讀(1153) 評論(1)  編輯 收藏 引用

            以下為轉(zhuǎn)貼(http://www.chinaaspx.com/club/topic_6_16277.htm
            ----------------------------------

            作者:富 亮

            --------------------------------------------------------------------------------

            用ASP寫網(wǎng)頁的程序員,一定對VBSript語句“Set Conn=Server.Object(‘ADODB.Connection’)”非常熟悉。該語句是利用ASP的Server對象創(chuàng)建了一個數(shù)據(jù)庫控件,它提供了一系列的方法和屬性,可以幫助我們在ASP中方便的實現(xiàn)數(shù)據(jù)庫的操作。類似的,在Visual InteDev6.0中,我們還可以看到一些ASP的內(nèi)置組件如“Scripting.FileSystemObject”。但是,在有的場合,僅利用這些是不夠的或復(fù)雜的,而且ASP的Script語言遠(yuǎn)不如C++語言功能強(qiáng)大(如建立鏈表,B+樹結(jié)構(gòu)等),這就使我們想到,是否可以在開發(fā)網(wǎng)頁時使用具有良好數(shù)據(jù)結(jié)構(gòu)的C++語言。雖然CGI,ISAPI等都可謂是用C/C++開發(fā)網(wǎng)頁的先驅(qū),但我們知道CGI,ISAPI的開發(fā)周期很長,且不與網(wǎng)頁結(jié)合,直觀性差,編寫、調(diào)試?yán)щy;而在穩(wěn)定性上,由于ISAPI是動態(tài)鏈接的方式,因此在執(zhí)行若出現(xiàn)問題,會使得Web服務(wù)器一起癱瘓。而ASP正好能補足這些缺點。
            由此可見,如果能學(xué)會編寫ASP組件就能結(jié)合ASP的長處編寫出強(qiáng)大的網(wǎng)頁。可惜的是,筆者在市面上很少看到有專門講如何用VC++來制作ASP組件的書籍。一般VC書籍只講一些寫Windows窗口程序或再加上編寫普通的動態(tài)鏈接庫。而ASP書籍更是只談ASP中內(nèi)置組件的使用方法。其實,如果要真正掌握編寫ASP組件的機(jī)制,要牽涉到大量的COM技術(shù)的知識。而一些講COM技術(shù)的書是很深奧的,且很少能結(jié)合有用的實例。為此,筆者想借此文以最簡單的方法向大家介紹編寫過程。所謂簡介,正說明將不涉及COM知識的具體細(xì)節(jié),僅給出實現(xiàn)方法。
            一、建立工程
            打開VC++6.0,選擇New Projects中的ALT COM AppWizard, 并輸入好工程名(如MyStudio),記住該工程名將成為ASP組件名的一部分(其實可以修改,但很麻煩),在下一頁上選擇Server Type 為DLL,并可考慮在Support MFC前打勾(想必使用MFC編程的人不少)。按Finish結(jié)束。在生成的代碼中有四個標(biāo)準(zhǔn)的導(dǎo)出函數(shù)注冊DLL的,我們不必關(guān)心。
            ::點擊圖片在新窗口中打開::
            二、創(chuàng)建COM對象(新建ATL活動模版庫類)
            在菜單上選擇Insert New Class,并新建一個ATL Class,如取名為CmyComponent,你會發(fā)現(xiàn)在接口表中出現(xiàn)了一個ImyComponent,以后創(chuàng)建該接口的方法和屬性就可以在ASP中使用了。把Aggregatable選項去掉,我們不需要它。保持其他不變。
            ::點擊圖片在新窗口中打開::
            三、添加接口方法
            在ClassView中,右擊ImyComponent,在出現(xiàn)的菜單中按Add Method。如圖,在Method Name中可寫上方法名如InitMyComp。在Parameters中寫上方法的參數(shù)如[in]int Number1,[out,retbal]int* Number2。這里要特別說明的是參數(shù)的寫法。
            ::點擊圖片在新窗口中打開::
            1.對于傳入的參數(shù)必須在參數(shù)前加上[in],然后可跟上如int n或float f等。且每個傳入?yún)?shù)前都必須寫明。
            2.對于調(diào)用方法的返回,不再是該方法名前的類型(因為所有這些方法都返回HRESULT,即表明是否調(diào)用成功),所以使用傳出的參數(shù),在參數(shù)前必須加上[out,retval],然后可跟上如int* n 或者float* f等(如果返回的是int 或float 類型值時)。且每個方法僅限于返回一個這樣的參數(shù)。在函數(shù)體中可如寫上如“*Number2=Number1;”,表示把輸入?yún)?shù)作為傳出參數(shù)。
            ::點擊圖片在新窗口中打開::
            3.對于最常用的字符串參數(shù)在此我們使用BSTR str而不是通常的char* 或CString,所以在參數(shù)中需要寫作[in]BSTR str 或[out,retval]BSTR* str。需要特別注意與CString的轉(zhuǎn)換。如新建一個函數(shù)StrConv([in]BSTR bstr1,[out,retval]BSTR* bstr2),在函數(shù)體中可寫上如:
            CString str;
            str=bstr1;
            str=str.Left(str.GetLength()-1);
            *bstr2=str.AllocSysString();
            4.對于想把一個ASP對象作為參數(shù)的方法(如Request對象),可以使用[in]Iunkown *pIUnk,在函數(shù)體內(nèi),可用如下語句:(具體請查閱MSDN中的相關(guān)類的內(nèi)容)
            IRequest* pIRequest;
            HRESULT hr = pIUnk->QueryInterface(IID_IRequest, reinterpret_cast<LPVOID*>(&pIRequest));
            Long m_lDataSize;
            HRESULT hr = pIRequest->get_TotalBytes(&m_lDataSize);
            if (FAILED(hr))
            return hr;
            if (m_lDataSize == 0L)
            {
            return S_OK;
            }

            COleVariant varBytesToRead;
            COleSafeArray sarrayBytes;
            varBytesToRead = m_lDataSize;
            sarrayBytes.CreateOneDim(VT_UI1, m_lDataSize);
            hr = pIRequest->BinaryRead(&varBytesToRead, &sarrayBytes);
            if (FAILED(hr))
            {
            sarrayBytes.Clear();
            return hr;
            }

            5.對于不定個數(shù)參數(shù),可使用SAFEARRAY,但使用方法較為復(fù)雜。可以在參數(shù)中輸入如下的內(nèi)容[in]SAFEARRAY array,并按Attribute…按鈕,在Name中選擇vararg。按確定后修改idl文件在把[in]SAFEARRAY array改為[in]SAFEARRAY(VARIANT) array。然后再打開MyComponent.h文件把該函數(shù)的參數(shù)SAFEARRAY array改為SAFEARRAY* array。再打開MyComponent.cpp文件修改參數(shù),在函數(shù)體內(nèi)使用COleSafeArray類實現(xiàn)該參數(shù)的控制,如“COleSafeArray SArray(array,VT_BSTR)”,具體操作可查閱MSDN中的該類的成員函數(shù)。
            四、添加接口屬性
            在ClassView中,右擊ImyComponent,在出現(xiàn)的菜單中按Add Property。如圖,在Property中可選擇屬性類型如float,在下面可寫上屬性名如MyFloat。保持其他不變。這里需要說明的是在生成的put_MyFloat和get_MyFloat函數(shù)體中的書寫。
            ::點擊圖片在新窗口中打開::
            不妨舉個小例:
            1.在CMyComponent 中添加成員變量m_myFloat
            2.在put_MyFloat 中寫上:m_myFloat=newVal;
            3.在get_MyFloat中寫上:*pVal=m_myFloat
            有成員變量也是它優(yōu)于ISAPI的一個地方,在ISAPI中要在網(wǎng)頁間傳遞信息,只能通過URL參數(shù)或者是Cookie來實現(xiàn),因為每次調(diào)用都是一次新的鏈接,無法在網(wǎng)頁之間仍然是同一次調(diào)用DLL,所以設(shè)置成員變量意義不大,只在一次調(diào)用中有用。而那兩種方法都只能傳遞很有限的字符,除非利用創(chuàng)建服務(wù)器端臨時文件(此方法很不好)。再說,ASP中的Session對象本身就是很好的存儲信息的對象。
            至此,我們創(chuàng)建了一個非常簡單的沒有什么功能的ASP組件,意在說明如何制作。下面,我們書寫一個簡單的ASP網(wǎng)頁,來看看如何使用。網(wǎng)頁如下:
            <%@ Language=VBScript %>
            <HTML>
            <HEAD>
            <META NAME="GENERATOR" Content="Microsoft Visual Studio 6.0">
            </HEAD>
            <BODY>
            <%
            Set Obj=Server.CreateObject("MyStudio.MyComponent")
            j=Obj.InitMyComp(5)
            Response.Write(j)
            %>
            <p>
            <%
            Obj.MyFloat=3.9
            j=Obj.MyFloat
            Response.Write(j)
            %>
            <p>
            <%
            str1="abcd"
            str2=Obj.StrConv(str1)
            Response.Write(str2)
            %>
            </BODY>
            </HTML>
            顯示結(jié)果為:
            5
            3.9
            abc
            也許,你現(xiàn)在還看不到編寫ASP組件的巨大魅力。但是,如果你正在編寫搜索引擎,文件上傳,自動回復(fù),等等的高級網(wǎng)頁制作,你若能夠充分的利用VC++的優(yōu)越編程手段,就不必在CGI,ISAPI中苦苦掙扎,可以比較方便的編寫這些功能。比方說用戶想在你的網(wǎng)頁上搜索幾個著名新聞網(wǎng)站上當(dāng)前的重要新聞,你就可以使用ASP組件在后臺實時的打開各網(wǎng)站獲得信息,篩選匹配后顯示給用戶。又比方說,當(dāng)注冊用戶告知他的email地址,你就可以利用ASP組件自動給新注冊用戶發(fā)出確認(rèn)信函,用最快的方式讓用戶去確認(rèn)并使注冊成功……其實,你一定還有很多新的想法可以在網(wǎng)頁上得以實現(xiàn),趕快行動吧。

            Feedback

            # re: [網(wǎng)頁]+ [ ALT COM AppWizard]  回復(fù)  更多評論   

            2008-01-02 17:57 by lhj5168
            ok

            只有注冊用戶登錄后才能發(fā)表評論。
            網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


            免费观看久久精彩视频| 亚洲精品无码久久久久| 久久99国产精品尤物| 久久影院亚洲一区| 久久精品成人一区二区三区| 青青青伊人色综合久久| 天天综合久久久网| 久久综合综合久久97色| 青青国产成人久久91网| 久久国产乱子精品免费女| 2021少妇久久久久久久久久| 久久精品国产亚洲一区二区| 国产欧美一区二区久久| 国产三级观看久久| 四虎久久影院| 久久99热这里只有精品国产| 久久久久无码精品国产不卡| 99久久成人国产精品免费| 国产精品久久久久影院嫩草| 日本久久久精品中文字幕| 色偷偷88欧美精品久久久| 伊人久久综合精品无码AV专区| 久久99精品国产一区二区三区| 东京热TOKYO综合久久精品| 久久精品中文无码资源站| 久久久亚洲欧洲日产国码是AV| 久久精品国产亚洲77777| 国产亚洲综合久久系列| 精品国产91久久久久久久| 久久精品国产亚洲7777| 日韩人妻无码一区二区三区久久99| 久久777国产线看观看精品| 久久免费精品视频| 国内精品久久久久影院亚洲| 人妻少妇久久中文字幕一区二区| 久久精品国产精品亜洲毛片| 日韩精品无码久久一区二区三| 久久青青草原亚洲av无码app| 狠狠色伊人久久精品综合网| 国产精品久久久久久五月尺| 久久久无码精品亚洲日韩蜜臀浪潮|