使用VC++6.0製作ASP伺服器控制項簡介

來源:互聯網
上載者:User
c++|伺服器|控制項 用ASP寫網頁的程式員,一定對VBSript語句“Set Conn=Server.Object(‘ADODB.Connection’)”非常熟悉。該語句是利用ASP的Server對象建立了一個資料庫控制項,它提供了一系列的方法和屬性,可以協助我們在ASP中方便的實現資料庫的操作。類似的,在Visual InteDev6.0中,我們還可以看到一些ASP的內建群組件如“Scripting.FileSystemObject”。但是,在有的場合,僅利用這些是不夠的或複雜的,而且ASP的Script語言遠不如C++語言功能強大(如建立鏈表,B+樹結構等),這就使我們想到,是否可以在開發網頁時使用具有良好資料結構的C++語言。雖然CGI,ISAPI等都可謂是用C/C++開發網頁的先驅,但我們知道CGI,ISAPI的開發週期很長,且不與網頁結合,直觀性差,編寫、調試困難;而在穩定性上,由於ISAPI是動態連結的方式,因此在執行若出現問題,會使得Web伺服器一起癱瘓。而ASP正好能補足這些缺點。
由此可見,如果能學會編寫ASP組件就能結合ASP的長處編寫出強大的網頁。可惜的是,筆者在市面上很少看到有專門講如何用VC++來製作ASP組件的書籍。一般VC書籍只講一些寫Windows視窗程序或再加上編寫普通的動態連結程式庫。而ASP書籍更是只談ASP中內建群組件的使用方法。其實,如果要真正掌握編寫ASP組件的機制,要牽涉到大量的COM技術的知識。而一些講COM技術的書是很深奧的,且很少能結合有用的執行個體。為此,筆者想藉此文以最簡單的方法向大家介紹編寫過程。所謂簡介,正說明將不涉及COM知識的具體細節,僅給出實現方法。
一、建立工程
開啟VC++6.0,選擇New Projects中的ALT COM AppWizard, 並輸入好工程名(如MyStudio),記住該工程名將成為ASP組件名的一部分(其實可以修改,但很麻煩),在下一頁上選擇Server Type 為DLL,並可考慮在Support MFC前打勾(想必使用MFC編程的人不少)。按Finish結束。在產生的程式碼中有四個標準的匯出函數註冊DLL的,我們不必關心。

二、建立COM對象(建立ATL活動模版庫類)
在菜單上選擇Insert New Class,並建立一個ATL Class,如取名為CmyComponent,你會發現在介面表中出現了一個ImyComponent,以後建立該介面的方法和屬性就可以在ASP中使用了。把Aggregatable選項去掉,我們不需要它。保持其他不變。

三、添加介面方法
在ClassView中,右擊ImyComponent,在出現的菜單中按Add Method。如圖,在Method Name中可寫上方法名如InitMyComp。在Parameters中寫上方法的參數如[in]int Number1,[out,retbal]int* Number2。這裡要特別說明的是參數的寫法。

1.對於傳入的參數必須在參數前加上[in],然後可跟上如int n或float f等。且每個傳入參數前都必須寫明。
2.對於調用方法的返回,不再是該方法名前的類型(因為所有這些方法都返回HRESULT,即表明是否調用成功),所以使用傳出的參數,在參數前必須加上[out,retval],然後可跟上如int* n 或者float* f等(如果返回的是int 或float 類型值時)。且每個方法僅限於返回一個這樣的參數。在函數體中可如寫上如“*Number2=Number1;”,表示把輸入參數作為傳出參數。

3.對於最常用的字串參數在此我們使用BSTR str而不是通常的char* 或CString,所以在參數中需要寫作[in]BSTR str 或[out,retval]BSTR* str。需要特別注意與CString的轉換。如建立一個函數StrConv([in]BSTR bstr1,[out,retval]BSTR* bstr2),在函數體中可寫上如:
CString str;
str=bstr1;
str=str.Left(str.GetLength()-1);
*bstr2=str.AllocSysString();
4.對於想把一個ASP對象作為參數的方法(如Request對象),可以使用[in]Iunkown *pIUnk,在函數體內,可用如下語句:(具體請查閱MSDN中的相關類的內容)
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.對於不定個數參數,可使用SAFEARRAY,但使用方法較為複雜。可以在參數中輸入如下的內容[in]SAFEARRAY array,並按Attribute…按鈕,在Name中選擇vararg。按確定後修改idl檔案在把[in]SAFEARRAY array改為[in]SAFEARRAY(VARIANT) array。然後再開啟MyComponent.h檔案把該函數的參數SAFEARRAY array改為SAFEARRAY* array。再開啟MyComponent.cpp檔案修改參數,在函數體內使用COleSafeArray類實現該參數的控制,如“COleSafeArray SArray(array,VT_BSTR)”,具體操作可查閱MSDN中的該類的成員函數。
四、添加介面屬性
在ClassView中,右擊ImyComponent,在出現的菜單中按Add Property。如圖,在Property中可選擇屬性類型如float,在下面可寫上屬性名稱如MyFloat。保持其他不變。這裡需要說明的是在產生的put_MyFloat和get_MyFloat函數體中的書寫。

不妨舉個小例:
1.在CMyComponent 中新增成員變數m_myFloat
2.在put_MyFloat 中寫上:m_myFloat=newVal;
3.在get_MyFloat中寫上:*pVal=m_myFloat
有成員變數也是它優於ISAPI的一個地方,在ISAPI中要在網頁間傳遞資訊,只能通過URL參數或者是Cookie來實現,因為每次調用都是一次新的連結,無法在網頁之間仍然是同一次調用DLL,所以設定成員變數意義不大,只在一次調用中有用。而那兩種方法都只能傳遞很有限的字元,除非利用建立伺服器端臨時檔案(此方法很不好)。再說,ASP中的Session對象本身就是很好的儲存資訊的對象。
至此,我們建立了一個非常簡單的沒有什麼功能的ASP組件,意在說明如何製作。下面,我們書寫一個簡單的ASP網頁,來看看如何使用。網頁如下:
<%@ 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>
顯示結果為:
5
3.9
abc
也許,你現在還看不到編寫ASP組件的巨大魅力。但是,如果你正在編寫搜尋引擎,檔案上傳,自動回複,等等的進階網頁製作,你若能夠充分的利用VC++的優越編程手段,就不必在CGI,ISAPI中苦苦掙紮,可以比較方便的編寫這些功能。比方說使用者想在你的網頁上搜尋幾個著名新聞網站上當前的重要新聞,你就可以使用ASP組件在後台即時的開啟各網站獲得資訊,篩選匹配後顯示給使用者。又比方說,當註冊使用者告知他的email地址,你就可以利用ASP組件自動給新註冊使用者發出確認信函,用最快的方式讓使用者去確認並使註冊成功……其實,你一定還有很多新的想法可以在網頁上得以實現,趕快行動吧。

http://www.ccw.com.cn/htm/app/aprog/01_2_13_4.asp



相關文章

E-Commerce Solutions

Leverage the same tools powering the Alibaba Ecosystem

Learn more >

Apsara Conference 2019

The Rise of Data Intelligence, September 25th - 27th, Hangzhou, China

Learn more >

Alibaba Cloud Free Trial

Learn and experience the power of Alibaba Cloud with a free trial worth $300-1200 USD

Learn more >

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。