一个使用 ATL 的示例 ActiveX 服务器组件






4.86/5 (4投票s)
2001年11月15日
3分钟阅读

153622

1334
处理 cookie 的 Active Server 组件的简单程序
引言
ActiveX 是微软的一组技术,用于为万维网提供交互式内容。 通过 ActiveX,网站可以通过多媒体效果、交互式对象和复杂应用程序而变得生动起来,从而创造出与高质量 CD-ROM 标题相媲美的用户体验。
Cookie 是一种小的信息包,用于在用户的计算机上存储持久状态信息。
在这个项目中,我构建一个 ActiveX 服务器组件,该组件将被 ASP 调用,用于将信息存储在 Cookie 中,并使用 ATL COM 访问 Cookie。该组件将检查 Cookie 的存在,如果不存在,则创建它。 该项目分为七个步骤。按顺序执行它们,因为后面的步骤依赖于您在前面步骤中已完成的任务。
- 创建新项目
- 添加 ATL 对象
- 添加控件的方法
- 构建 ASP 客户端
- 测试
1. 创建新项目
首先,您将使用 ATL COM AppWizard 创建初始 ATL 项目。
- 在 Visual C++ 环境中,单击“文件”菜单上的“新建”,然后选择“项目”选项卡。
 
 
- 选择“ATL COM AppWizard”。
 
 
- 键入“SimpleActiveX”作为项目名称。
您的对话框应如下所示

图 1. 新项目
单击“确定”,ATL COM AppWizard 将显示一个对话框,提供几个选项来配置初始 ATL 项目(图 2)。 之后,单击“完成”按钮

图 2. ATL COM 的设置
2. 添加 ATL 对象
要将对象添加到 ATL 项目,您可以使用 ATL 对象向导。 单击“插入”菜单上的“新建 ATL 对象”,ATL 对象向导随即出现。

图 3. 在项目中插入 ATL
在第一个 ATL 对象向导对话框中,选择要添加到当前 ATL 项目的对象类别。 您可以选择的一些选项包括基本 COM 对象、为在 Internet Explorer 中工作而量身定制的控件和属性页。 在本项目中,我们将创建一个标准控件,因此将类别设置为左侧的“对象”,然后在右侧选择“ActiveX 服务器组件”。 最后,单击“下一步”。
将显示一组属性页,允许您配置要插入到项目中的控件。 键入“Cookie”作为短名称。 其他字段会自动填写。

图 4. ActiveX 服务器组件的属性
单击“属性”选项卡。 为线程模型选择“Both”,为聚合选择“No”,并勾选“支持 ISupportErrorInfo”复选框。 

图 5. “属性”选项卡的属性。
单击“ASP”选项卡以获取默认属性,然后单击“确定”按钮

图 6. ASP 的属性
3. 向控件添加方法
ICookies 是包含您的自定义方法和属性的接口(图 7)。 将方法添加到此接口的最简单方法是在“ClassView”中右键单击它,然后选择“添加方法”,然后它将显示类似于图 8 的对话框。

图 7. 为此项目添加方法

图 8. 添加方法的属性
键入“GetCookie”作为“方法名称”,将“[out,retval] BSTR *bVal”作为“参数”。 最后,单击“确定”
此方法的源代码:GetCookie()
STDMETHODIMP CCookies::GetCookie(BSTR *bCookie)
{
	
	HRESULT hr;
	CComPtr<IRequestDictionary>pWriteDictionary;
	CComPtr<IRequestDictionary>pReadDictionary;
	
	
	if(bCookie==NULL) return E_POINTER;
	if(m_bOnStartPageCalled)
	{
			
		hr=m_piRequest->get_Cookies(&pReadDictionary);
		if(FAILED(hr)) 
			return S_FALSE;
		CComVariant vtIn(_T("LOGIN"));
		CComVariant vtOut;
		hr=pReadDictionary->get_Item(vtIn,&vtOut);
		if(FAILED(hr))
			return S_FALSE;
		hr=VariantChangeType(&vtOut,&vtOut,0,VT_BSTR);
		if(FAILED(hr))
			return S_FALSE;
		if(!wcslen(V_BSTR(&vtOut)))
		{
			CComVariant vtRespon;
			vtRespon="<html><body><center>Fill your name and password<br>"
			         "<form method=post action=setcookie.asp>";
			m_piResponse->Write(vtRespon);
			vtRespon="Name     : <input type=text name=user><br>Password : "
			         "<input type=password name=password><br>"
			         "<input type=submit value=OK>";
			m_piResponse->Write(vtRespon);
			vtRespon="</center></form></body></html>";
			m_piResponse->Write(vtRespon);
		}
		else
		{
			*bCookie=::SysAllocString(V_BSTR(&vtOut));
			CComVariant vtRespon;
			vtRespon="<html><body><center>Welcome ";
			m_piResponse->Write(vtRespon);
			
			vtRespon=*bCookie;
			m_piResponse->Write(vtRespon);
			
			vtRespon="<br></form></body></html>";
			m_piResponse->Write(vtRespon);
		}
	}
	return S_OK;
}
最后,构建此项目成为一个 DLL 应用程序。
4. 构建 ASP 客户端
此代码用于客户端应用程序,MyCookie.asp
<%
    Set obj=Server.CreateObject("SimpleActiveX.Cookies")
    str=obj.GetCookie()
%>
<html>
    <title>
       Test ActiveX Server Component   
    </title>
    <body>
       The cookie stored is "<%=str%>"  
    </body>
</html>
以及用于 SetCookie.asp 的代码
<% 
   response.cookies("LOGIN")=Request.form("user")
   response.cookies("LOGIN").expires=date+365
%>
<html>
   <title>
      SetCookie.asp
   </title>
   <body>
   </body>
   <center>
       Your login has been verified
   </center>
   </body> 	
</html>
5. 测试
要测试此项目,我们必须将文件 MyCookie.asp 和 SetCookie.asp 放在我们的 ASP 服务器上。 首先,我们运行 MyCookie.asp。 填写姓名和密码。 在这种情况下,有关姓名的信息将存储在 Cookie 中。 因此,如果我们想再次进入此网站,那么我们将根据 Cookie 中的信息自动获取我们的姓名。

图 9. 测试我们的 Activex 服务器组件。
参考
来自 Platform SDK 的组件对象模型 (COM),MSDN。
