|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
由于ASP还是一种Script语言所没除了大量使用组件外,没有办法提高其工作效率。它必须面对即时编绎的时间考验,同时我们还不知其背后的组件会是一个什么样的状况;c++|服务器|控件用ASP写网页的程序员,必定对VBSript语句“SetConn=Server.Object(‘ADODB.Connection’)”十分熟习。该语句是使用ASP的Server工具创立了一个数据库控件,它供应了一系列的办法和属性,能够匡助我们在ASP中便利的完成数据库的操纵。相似的,在VisualInteDev6.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常识的详细细节,仅给出完成办法。
1、创建工程
翻开VC++6.0,选择NewProjects中的ALTCOMAppWizard,并输出好工程名(如MyStudio),记着该工程名将成为ASP组件名的一部分(实在能够修正,但很贫苦),鄙人一页上选择ServerType为DLL,并可思索在SupportMFC前打勾(想必利用MFC编程的人很多)。按Finish停止。在天生的代码中有四个尺度的导出函数注册DLL的,我们不用体贴。
2、创立COM工具(新建ATL举动模版库类)
在菜单上选择InsertNewClass,并新建一个ATLClass,如取名为CmyComponent,你会发明在接口表中呈现了一个ImyComponent,今后创立该接口的办法和属性就能够在ASP中利用了。把Aggregatable选项往失落,我们不必要它。坚持其他稳定。
3、增加接口办法
在ClassView中,右击ImyComponent,在呈现的菜单中按AddMethod。如图,在MethodName中可写上办法名如InitMyComp。在Parameters中写上办法的参数如[in]intNumber1,[out,retbal]int*Number2。这里要出格申明的是参数的写法。
1.关于传进的参数必需在参数前加上[in],然后可跟上如intn或floatf等。且每一个传进参数前都必需写明。
2.关于挪用办法的前往,不再是该办法名前的范例(由于一切这些办法都前往HRESULT,即标明是不是挪用乐成),以是利用传出的参数,在参数前必需加上[out,retval],然后可跟上如int*n大概float*f等(假如前往的是int或float范例值时)。且每一个办法仅限于前往一个如许的参数。在函数体中可如写上如“*Number2=Number1;”,暗示把输出参数作为传出参数。
3.关于最经常使用的字符串参数在此我们利用BSTRstr而不是一般的char*或CString,以是在参数中必要写作[in]BSTRstr或[out,retval]BSTR*str。必要出格注重与CString的转换。如新建一个函数StrConv([in]BSTRbstr1,[out,retval]BSTR*bstr2),在函数体中可写上如:
CStringstr;
str=bstr1;
str=str.Left(str.GetLength()-1);
*bstr2=str.AllocSysString();
4.关于想把一个ASP工具作为参数的办法(如Request工具),可使用[in]Iunkown*pIUnk,在函数体内,可用以下语句:(详细请查阅MSDN中的相干类的内容)
IRequest*pIRequest;
HRESULThr=pIUnk->QueryInterface(IID_IRequest,reinterpret_cast<LPVOID*>(&pIRequest));
Longm_lDataSize;
HRESULThr=pIRequest->get_TotalBytes(&m_lDataSize);
if(FAILED(hr))
returnhr;
if(m_lDataSize==0L)
{
returnS_OK;
}
COleVariantvarBytesToRead;
COleSafeArraysarrayBytes;
varBytesToRead=m_lDataSize;
sarrayBytes.CreateOneDim(VT_UI1,m_lDataSize);
hr=pIRequest->BinaryRead(&varBytesToRead,&sarrayBytes);
if(FAILED(hr))
{
sarrayBytes.Clear();
returnhr;
}
…
5.关于不定个数参数,可以使用SAFEARRAY,但利用办法较为庞大。能够在参数中输出以下的内容[in]SAFEARRAYarray,并按Attribute…按钮,在Name当选择vararg。按断定后修正idl文件在把[in]SAFEARRAYarray改成[in]SAFEARRAY(VARIANT)array。然后再翻开MyComponent.h文件把该函数的参数SAFEARRAYarray改成SAFEARRAY*array。再翻开MyComponent.cpp文件修正参数,在函数体内利用COleSafeArray类完成该参数的把持,如“COleSafeArraySArray(array,VT_BSTR)”,详细操纵可查阅MSDN中的该类的成员函数。
4、增加接口属性
在ClassView中,右击ImyComponent,在呈现的菜单中按AddProperty。如图,在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>
<METANAME="GENERATOR"Content="MicrosoftVisualStudio6.0">
</HEAD>
<BODY>
<%
SetObj=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
</p>asp,你就只能等着微软给你解决,它不乐意你就只好悲催。而且asp跑在windows服务器上,windows服务器跟linux比起来简直弱爆了! |
|