使用VC++6.0制作ASP服务器控件简介

2016-01-29 20:16 14 1 收藏

使用VC++6.0制作ASP服务器控件简介,使用VC++6.0制作ASP服务器控件简介

【 tulaoshi.com - ASP 】

用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。这里要特别说明的是参数的写法。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/asp/)

1.对于传入的参数必须在参数前加上[in],然后可跟上如int n或float f等。且每个传入参数前都必须写明。
2.对于调用方法的返回,不再是该方法名前的类型(因为所有这些方法都返回HRESULT,即表明是否调用成功),所以使用传出的参数,在参数前必须加上[out,retval],然后可跟上如int* n 或者float* f等(如果返回的是int 或float 类型值时)。且每个方法仅限于返回一个这样的参数。在函数体中可如写上如“*Number2=Number1;”,表示把输入参数作为传出参数。

(本文来源于图老师网站,更多请访问https://www.tulaoshi.com/asp/)

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中,右击I

来源:https://www.tulaoshi.com/n/20160129/1510940.html

延伸阅读
标签: ASP
       ---- 音乐服务器(Music Server)是指一个提供音乐在线服务的服务器,它包括高端提供门户服务的网站、Web数据库和低端的操作平台、硬件设施。目前,在Internet和Intranet上有不少这样的站点,特别是在一些高速宽带的局域网中(如校园网),音乐服务器给上网的朋友提供了休闲娱乐的好去处,同时也给...
Every so often people ask me the question how should they estimate memory consumption by MySQL Server in given configuration. What is the formula they could use. 经常有人问我配置MySQL时该如何估算内存的消耗。那么该使用什么公式来计算呢? The reasons to worry about memory usage are quite understandable. If ...
标签: ASP
  使用定制的服务器控件 在asp+中提供了45个已经做好了的服务器控件,我们可以将他们象黑盒子一样的使用。除此以外,开发者还可以使用任何第三方开 发的服务器控件 在下面的例子中,我们要用到一个通过<acme:calendar runat=server标签声明的组件,请注意,在文件的第一行必须使用<% Register % 来声明 "Acme Xml "标签...
标签: ASP
  使用定制的服务器控件 在asp+中提供了45个已经做好了的服务器控件,我们可以将他们象黑盒子一样的使用。除此以外,开发者还可以使用任何第三方开发的服务器控件 在下面的例子中,我们要用到一个通过<acme:calendar runat=server标签声明的组件,请注意,在文件的第一行必须使用<% Register % 来声明 "Acme Xml "标签...
标签: Web开发
---- 音乐服务器(Music Server)是指一个提供音乐在线服务的服务器,它包括高端提供门户服务的网站、Web数据库和低端的操作平台、硬件设施。目前,在Internet和Intranet上有不少这样的站点,特别是在一些高速宽带的局域网中(如校园网),音乐服务器给上网的朋友提供了休闲娱乐的好去处,同时也给网站带来了较高的访问率。 ----像其他站点一...

经验教程

841

收藏

27
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部