65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.86/5 (4投票s)

2001年11月15日

3分钟阅读

viewsIcon

153622

downloadIcon

1334

处理 cookie 的 Active Server 组件的简单程序

引言

ActiveX 是微软的一组技术,用于为万维网提供交互式内容。 通过 ActiveX,网站可以通过多媒体效果、交互式对象和复杂应用程序而变得生动起来,从而创造出与高质量 CD-ROM 标题相媲美的用户体验。

Cookie 是一种小的信息包,用于在用户的计算机上存储持久状态信息。

在这个项目中,我构建一个 ActiveX 服务器组件,该组件将被 ASP 调用,用于将信息存储在 Cookie 中,并使用 ATL COM 访问 Cookie。该组件将检查 Cookie 的存在,如果不存在,则创建它。 该项目分为七个步骤。按顺序执行它们,因为后面的步骤依赖于您在前面步骤中已完成的任务。

  1. 创建新项目
  2. 添加 ATL 对象
  3. 添加控件的方法 
  4. 构建 ASP 客户端
  5. 测试

1. 创建新项目

首先,您将使用 ATL COM AppWizard 创建初始 ATL 项目。

  1. 在 Visual C++ 环境中,单击“文件”菜单上的“新建”,然后选择“项目”选项卡。

  2. 选择“ATL COM AppWizard”。

  3. 键入“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.aspSetCookie.asp 放在我们的 ASP 服务器上。 首先,我们运行 MyCookie.asp。 填写姓名和密码。 在这种情况下,有关姓名的信息将存储在 Cookie 中。 因此,如果我们想再次进入此网站,那么我们将根据 Cookie 中的信息自动获取我们的姓名。

图 9. 测试我们的 Activex 服务器组件。

参考

来自 Platform SDK 的组件对象模型 (COM),MSDN。

© . All rights reserved.