一个使用 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。