本页内容
![]() | 简介 |
![]() | 练习 1:创建 ATL ActiveX 控件 |
![]() | 练习 2:创建 MFC ActiveX 宿主应用程序 |
![]() | 总结 |
要完成此练习,您需要具备:
• | Windows XP Professional。此体验要求具备 Windows XP Professional。 |
• | Visual Studio 2005 |
• | ActiveSync 4.0 |
• | Windows Mobile 5.0 SDK。 下载和安装 Windows Mobile 5.0 SDK for Pocket PC 注意:如果您在先前的动手体验中使用了仿真器,则在开始此体验之前,应当先对仿真器进行硬复位。在仿真器上,单击 File(文件),指向 Reset(复位),然后单击 Hard(硬复位)。 如果在部署过程中收到错误,指出正在使用该进程或文件,这意味着程序仍在仿真器上运行着,必须先退出程序,然后才能部署和运行新的副本。在部署仿真器的体验中,随时都可能出现此错误。有关退出正在运行的应用程序的说明,请参阅此体验中的最后一个任务。 |
简介
许多典型问题应已涵盖在 MSDN 上的“What's New in Visual Studio 2005 for Native Developers”和“将 Microsoft eMbedded Visual C++ 项目迁移到 Visual Studio 2005”两篇文章中。
如果您按 CTRL + 空格键使用 IntelliSense 技术来完成一行代码,则 IDE 可能冻结。这是一个已知错误;因此,请不要按 CTRL + 空格键。
此体验的目标是使用 Visual Studio 2005 来创建用于 Pocket PC 的 ATL ActiveX 控件,以及该 ActiveX 控件对应的 MFC 宿主设备应用程序。该 ActiveX 控件将是具有一种填充颜色的三角形,单击该控件时,填充颜色会发生变化。相应的宿主应用程序将是一个基于对话框的应用程序,用来驻留该 ActiveX 控件。此外,还将用一个测试证书对控件和宿主应用程序都进行签名。
在此体验中,您将执行以下练习:
• | 创建 ATL ActiveX 控件 |
• | 创建 MFC ActiveX 宿主应用程序 |
练习 1:创建 ATL ActiveX 控件
在此练习中,您将使用 Visual Studio 2005 来创建一个用于 Pocket PC 的 ATL ActiveX 控件。
完成 ATL 智能设备项目向导的步骤
1. | 在 Visual Studio 2005 中,单击 File | New | Project(文件 | 新建 | 项目)。 |
2. | 展开 Visual C++,然后选择 Smart Device(智能设备)。 |
3. | 选择 ATL Smart Device Project(ATL 智能设备项目),然后在 Name(名称)框中键入 Ctl1。 |
4. | 单击 OK(确定)。 |
5. | 在 ATL Smart Device Project Wizard(ATL 智能设备项目向导)页中,选择 Platforms(平台)。 |
6. | 确保 Windows Mobile 5.0 Pocket PC SDK 和 Pocket PC 2003 都位于 Selected SDKs(选定的 SDK)区域中。如果它们不在该区域中,则在 Installed SDKs(已安装的 SDK)区域中选择它们,然后单击 Add selected platform SDK to project(将选定的 Platform SDK 添加到项目中)按钮。 |
7. | 选择 Application Settings(应用程序设置)。 |
8. | 确保在 Server type(服务器类型)下选择了 Dynamic-link library (DLL)(动态链接库 [DLL]),且在 Additional options(附加选项)下没有选中任何复选框。 |
9. | 单击 Finish(完成)。 |
创建 ActiveX 类的步骤
1. | 在 Solution Explorer(解决方案资源管理器)中,右键单击 Ctrl1 项目,然后单击 Add | Class(添加 | 类)。 |
2. | 展开 Visual C++,然后选择 SmartDevice(智能设备)。 |
3. | 在 Visual Studio installed templates(Visual Studio 已安装的模板)下,选择 ATL Control(ATL 控件),然后单击 Add(添加)。 |
4. | 在 Names(名称)页上,在 Shortname(简称)框中键入 MyCtl。 |
5. | 选择 StockProperties(常用属性)。 |
6. | 在 Not supported(不受支持)列表中,选择 FillColor(填充颜色)。 |
7. | 单击 Add selected property to the supported list(将选定的属性添加到受支持列表中)按钮将它添加到 Supported(受支持)列表中。 |
8. | 单击 Finish(完成)。请不要更改其他任何选项。 |
向 ActiveX 类添加属性的步骤
1. | 单击 Class View(类视图)选项卡,然后展开 Ctl1。 |
2. | 右键单击 IMyCtl,再单击 Add(添加),然后单击 AddProperty(添加属性)。 |
3. | 在 Propertytype(属性类型)框中,选择 SHORT。 |
4. | 在 PropertyName(属性名称)框中,键入 Sides。 |
5. | 单击 Finish(完成)。 |
向 ActiveX 类添加代码的步骤
1. | 在 Solution Explorer(解决方案资源管理器)中,双击 MyCtl.h。 |
2. | 在 IMyCtl 界面末尾查找以下代码。 public: STDMETHOD(get_Sides)(SHORT* pVal); public: STDMETHOD(put_Sides)(SHORT newVal); |
3. | 将以下代码添加在步骤 2 中的代码之后。这些成员用于绘制控件的边。 private: short m_nSides; POINT m_arrPoint[100]; int m_currentColor; |
4. | 将以下代码添加到 CMyCtl() 构造函数主体。这会将控件初始化,使其具有三个边和一种填充颜色。m_currentColor 用于跟踪当前颜色,以便单击控件时,该控件可以切换为其他颜色。 m_nSides = 3; m_clrFillColor = RGB(0, 0xFF, 0); m_currentColor = 2; |
5. | 删除 OnDraw(ATL_DRAWINFO& di) 方法的主体。 |
6. | 然后,在该方法声明的末尾添加一个分号(因为您将执行自己的 OnDraw)。OnDraw 方法应如下所示。 HRESULT OnDraw(ATL_DRAWINFO& di); |
7. | 在消息映射段中插入以下消息处理程序:BEGIN_MSG_MAP(CMyCtl)。此代码使得 ActiveX 控件可以相应地处理自己的用户单击和响应。 MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLbuttonDown); |
8. | CMyCtl 类的完整消息映射段应如下所示。 BEGIN_MSG_MAP(CMyCtl) MESSAGE_HANDLER(WM_LBUTTONDOWN, OnLbuttonDown); CHAIN_MSG_MAP(CComControl<CMyCtl>) DEFAULT_REFLECTION_HANDLER() END_MSG_MAP() |
9. | 在 MessageMap 段下面添加以下处理程序原型。 LRESULT OnLbuttonDown(UINT, WPARAM, LPARAM, BOOL&) { switch(m_currentColor) { case 1: m_currentColor = 2; m_clrFillColor = RGB(0, 0xFF, 0); break; case 2: m_currentColor = 1; m_clrFillColor = RGB(0xFF, 0xFF, 0); break; } put_FillColor(m_clrFillColor); return 0; } |
10. | 打开 MyCtl.cpp。 |
11. | 将以下代码复制并粘贴到 MyCtl.cpp。此代码用于绘制 ActiveX 控件。 #define GSC_MASK 0x80000000L #define GSC_SETBIT 0x04000000L inline HRESULT wce_OleTranslateColor(OLE_COLOR clr, HPALETTE, COLORREF *retClr) { *retClr = (clr & GSC_MASK) ?GetSysColor(clr & (~GSC_MASK) | GSC_SETBIT) :(COLORREF)(clr & 0x00FFFFFF); return S_OK; } HRESULT CMyCtl::OnDraw(ATL_DRAWINFO& di) { RECT& rc = *(RECT*)di.prcBounds; HDC hdc = di.hdcDraw; COLORREF colFore; HBRUSH hOldBrush, hBrush; HPEN hOldPen, hPen; // 将 m_colFore 转换为 COLORREF 类型 wce_OleTranslateColor(m_clrFillColor, NULL, &colFore); // 创建并选择颜色来绘制圆 hPen = (HPEN)GetStockObject(BLACK_PEN); hOldPen = (HPEN)SelectObject(hdc, hPen); const double pi = 3.14159265358979; POINT ptCenter; double dblRadiusx = (rc.right - rc.left) / 2; double dblRadiusy = (rc.bottom - rc.top) / 2; double dblAngle = 3 * pi / 2; // 从顶端开始 double dblDiff = 2 * pi / m_nSides; // 使每条边转动角度将 // 使 ptCenter.x = (rc.left + rc.right) / 2; ptCenter.y = (rc.top + rc.bottom) / 2; // 计算每条边对应的点 for (int i = 0; i < m_nSides; i++) { m_arrPoint[i].x = (long)(dblRadiusx * cos(dblAngle) + ptCenter.x + 0.5); m_arrPoint[i].y = (long)(dblRadiusy * sin(dblAngle) + ptCenter.y + 0.5); dblAngle += dblDiff; } // 创建并选择将用于填充多边形的 // 画笔 hBrush = CreateSolidBrush(colFore); hOldBrush = (HBRUSH)SelectObject(hdc, hBrush); SelectObject(hdc, hBrush); Polygon(hdc, &m_arrPoint[0], m_nSides); // 选择回原来的笔和画笔,删除我们创建的 // 画笔 SelectObject(hdc, hOldPen); SelectObject(hdc, hOldBrush); DeleteObject(hBrush); return S_OK; } |
12. | 查找以下属性 get 函数。 STDMETHODIMP CMyCtl::get_Sides(SHORT* pVal) |
13. | 然后,将以下代码添加到函数主体(在 return S_OK 之前) *pVal = m_nSides; |
14. | 查找以下属性 put 函数: STDMETHODIMP CMyCtl::put_Sides(SHORT newVal) |
15. | 然后,将以下代码添加到函数主体(在 return S_OK 之前) ATLASSERT(newVal > 2 && newVal < 101); m_nSides = newVal; FireViewChange(); |
16. | 打开 stdafx.h。 |
17. | 在 stdafx.h 开头附近,在 #pragma once 之下添加以下代码。此代码将防止 ATL 8.0 for Devices 在针对非 DCOM 平台使用线程模型编译项目时抛出 #error。 #define _CE_ALLOW_SINGLE_THREADED_OBJECTS_IN_MTA |
18. | 单击 Build(生成),然后单击 BuildSolution(生成解决方案)以生成项目。确保不存在任何编译或链接错误。 |
对 ActiveX 项目进行签名的步骤
1. | 在 Solution Explorer(解决方案资源管理器)中,右键单击 Ctl1 项目,然后单击 Properties(属性)。 |
2. | 展开 Authenticode Signing(Authenticode 签名),然后选择 General(常规)。 |
3. | 将 Authenticode Signature(Authenticode 签名)属性更改为 Yes(是)。 |
4. | 在 Certificate(证书)列表中,单击省略号按钮。 |
5. | 在 Select Certificate(选择证书)对话框中,单击 ManageCertificates(管理证书)。 |
6. | 在 ManageCertificates(管理证书)对话框中,单击 Import(导入)。 Certificate Import Wizard(证书导入向导)将打开。 |
7. | 单击 Next(下一步)。 |
8. | 在 File To Import(要导入的文件)页中,单击 Browse(浏览)。 |
9. | 浏览到 C:/Program Files/Microsoft Visual Studio 8/SmartDevices/SDK/SDKTools/TestCertificates。 |
10. | 在 Files of Type(文件类型)组合框中,将文件类型更改为 Personal Information Exchange (*.pfx,*.p12),如下图所示。 ![]()
|
11. | 选择 TestCert_Privileged。 |
12. | 单击 Open(打开)。 |
13. | 在 File To Import(要导入的文件)页中,单击 Next(下一步)。 |
14. | 保留密码为空,然后单击 Next(下一步)。 |
15. | 确保选择了 Place all certificates in the following store(将所有证书放置在以下存储区中)选项按钮,并将 Certificate Store(证书存储区)属性设置为 Personal(个人)。 |
16. | 单击 Next(下一步)。 |
17. | 单击 Finish(完成)。 |
18. | 当 Import was successful(导入成功)对话框出现时,单击 OK(确定)。 |
19. | 关闭 Managed Certificates(托管证书)对话框。 |
20. | 在 Select Certificate(选择证书)对话框中,您现在应该会看到 Smartphone 2003 Privileged Test 证书,选择该证书,然后单击 OK(确定)。 每次生成该项目时都应该使用此证书对其进行签名。 |
21. | 在 Ctl1 Property Pages(Ctl1 属性页)上,在 Provision Device(供应设备)列表中选择 Privileged Certificate Store(特许证书存储区),如下图所示。 ![]()
|
22. | 单击 OK(确定)。 |
每次部署该项目时,都会为设备的 Privileged Certificate Store(特许证书存储区)配置选定的证书。
部署和注册 ActiveX 控件的步骤
• | 在 Solution Explorer(解决方案资源管理器)中,右键单击 Ctl1 项目,然后选择 Deploy(部署)。仿真器将打开,并将部署和注册 ActiveX 控件。 |
练习 2:创建 MFC ActiveX 宿主应用程序
在此练习中,您将使用 Visual Studio 2005 来创建一个用于 Pocket PC 的 MFC 应用程序,用以驻留在此体验的练习 1 中所创建的 ActiveX 控件。
完成 MFC 智能设备项目向导的步骤
1. | 在包括 Ctl1 项目的解决方案中,右键单击该解决方案,单击 Add(添加),然后单击 NewProject(新建项目)。 |
2. | 展开 Visual C++,然后选择 SmartDevice(智能设备)。 |
3. | 选择 MFC Smart Device Application(MFC 智能设备应用程序),然后在 Name(名称)框中键入类型 MyHostApp,如下图所示。 ![]()
|
4. | 单击 OK(确定)。 MFC 智能设备应用程序向导将打开。 |
5. | 选择 Platforms(平台)。 |
6. | 确保 Pocket PC 2003 和 Windows Mobile 5.0 Pocket PC SDK 都位于 Selected SDKs(选定的 SDK)区域中。如果它们不在该区域中,则在 Installed SDKs(已安装的 SDK)区域中选择它们,然后单击 Add selected platform SDK to project button(将选定的 Platform SDK 添加到项目中)按钮。 |
7. | 选择 Application Type(应用程序类型)。 |
8. | 将 ApplicationType(应用程序类型)更改为 DialogBased(基于对话框)。 |
9. | 选择 AdvancedFeatures(高级功能)。 |
10. | 选中 ActiveX controls(ActiveX 控件)复选框。 |
11. | 单击 Finish(完成)。 |
将 ActiveX 控件添加到对话框的步骤
1. | 在 Solution Explorer(解决方案资源管理器)中,双击 MyCtl.rgs(在 Ctl1 项目 ResourceFiles 节点下面)。 |
2. | 选择 MyCtl类 CLSID 并按 CTRL+C(确保选中了大括号),如下图所示。请注意,项目中将具有的 GUID 与图中所示的不同。 ![]()
|
3. | 在 Solution Explorer(解决方案资源管理器)中,双击 MyHostAppppc.rc。 |
4. | 展开 MyHostApp | MyHostAppppc.rc | Dialog。 |
5. | 双击 IDD_MYHOSTAPP_DIALOG。 |
6. | 在 Dialog Editor(对话框编辑器)中,选择默认的静态文本控件(如下图所示),然后按 Delete 键。 ![]()
|
7. | 从 Toolbox(工具箱)中,将 CustomControl(自定义控件)拖动到对话框的左上角。 |
8. | 在自定义控件的右下角中单击,然后调整其大小,使其占据整个对话框,如下图所示。 ![]()
|
9. | 右键单击该自定义控件,然后选择 Properties(属性)。 |
10. | 在该自定义控件的 Properties(属性)窗口中,单击 Class(类)属性字段,然后按 CTRL+V。 将从剪贴板中粘贴 ActiveX 控件 MyCtl 类 CLSID。 |
11. | 在 Solution Explorer(解决方案资源管理器)中,右键单击 MyHostAppppc.rc2,然后选择 ViewCode(查看代码)。 |
12. | 在 Add Manually Edited Resources Here(在此处添加手动编辑的资源)区域中,粘贴以下代码。必须具有 Dialog Init 段才能正确显示该自定义控件。但并不使用实际 Dialog Init 段的内容。 IDD_MYHOSTAPP_DIALOG DLGINIT BEGIN IDC_CUSTOM1, 0x376, 22, 0 0x0000, 0x0000, 0x0800, 0x0000, 0x094d, 0x0000, 0x043d, 0x0000, 0x0013, 0xcdcd, 0xcdcd, 0 END |
对 ActiveX 项目进行签名的步骤
1. | 在 Solution Explorer(解决方案资源管理器)中,右键单击 MyHostApp 项目,然后选择 Properties(属性)。 | ||
2. | 展开 AuthenticodeSigning(Authenticode 签名),然后选择 General(常规)。 | ||
3. | 将 AuthenticodeSignature(Authenticode 签名)属性更改为 Yes(是)。 | ||
4. | 单击 Certificate(证书),然后选择省略号按钮。 | ||
5. | 在 SelectCertificate(选择证书)对话框中,选择 Smartphone 2003 Privileged Test 证书,然后单击 OK(确定)。
| ||
6. | 选择 ProvisionDevice(供应设备),然后单击 Privileged Certificate Store(特许证书存储区),如下图所示。 ![]()
| ||
7. | 单击 OK(确定)。 |
每次部署该项目时,都会为设备的 Privileged Certificate Store(特许证书存储区)配置选定的证书。
部署解决方案的步骤
1. | 在 Solution Explorer(解决方案资源管理器)中,右键单击 MyHostApp 项目,然后单击 Set As Startup(设为启动项目)。 |
2. | 按 F5。 |
3. | 对话框出现后,单击该控件,注意颜色的变化。 |
以下任务说明了如何终止在设备或仿真器上运行的应用程序。如果在没有附加调试器的情况下启动了应用程序,并且需要终止该应用程序以便可以部署新的应用程序副本,则会用到此任务。将通过在 Visual Studio 中使用远程进程查看器这一远程工具来终止应用程序。
需要知道可执行文件的名称才能终止进程。大多数情况下,此名称就是 Visual Studio 项目的名称。如果您不确定可执行文件的名称,则可以在项目属性中查找。
终止在设备或仿真器上运行的应用程序的步骤
1. | 从 Visual Studio 中,选择 Project(项目),然后选择 xxx Properties(xxx 属性),其中 xxx 代表当前项目的名称。 |
2. | 注意 Assembly Name(程序集名称)字段中的值。此值是可执行文件在设备或仿真器上运行时将使用的名称。 |
3. | 关闭 Properties(属性)对话框。 现在,您就可以终止进程了。 |
4. | 从 Start(开始)菜单中,单击 Start > Microsoft Visual Studio 2005 > Visual Studio Remote Tools > Remote Process Viewer(开始 > Microsoft Visual Studio 2005 > Visual Studio 远程工具 > 远程进程查看器)。 |
5. | 收到 Select a Windows CE Device(选择一个 Windows CE 设备)对话框提示后,选择正在运行该应用程序的仿真器或设备(如下图所示),然后单击 OK(确定)。 ![]()
|
6. | 连接到仿真器或设备之后,在 Remote Process Viewer(远程进程查看器)的顶部窗格中找到您要终止的应用程序,如下图所示。 ![]()
可能需要加宽 Process(进程)列(最左边的列)以完全显示出进程名称。 |
7. | 单击进程名称以选择进程。 |
8. | 要终止进程,请从 RemoteProcess Viewer(远程进程查看器)菜单中选择 File > Terminate Process(文件 > 终止进程)。 注意:在单击 TerminateProcess(终止进程)之前,请确保选择了正确的进程。终止不正确的进程可能会致使设备或仿真器不可用,这样就必须将其复位才能再次使用。 |
9. | 通过在 Remote Process Viewer(远程进程查看器)菜单上选择 Target > Refresh(目标 > 刷新)并再次滚动浏览顶部窗格,来验证进程是否已终止。如果该应用程序名仍然存在,则说明进程未被终止,您需要重复以上步骤。 注意:大多数进程只需执行一次操作即可终止;但是,根据应用程序状态的不同,偶尔会需要执行两次操作才能终止。 |
总结
在此体验中,您执行了以下练习。
• | 创建 ATL ActiveX 控件 |
• | 创建 MFC ActiveX 宿主应用程序 |
在此体验中,您通过使用 Visual Studio 2005 应用程序和类向导创建了一个 ATL ActiveX 控件。还创建了一个基于对话框的 MFC 应用程序来驻留该控件,并使用资源编辑器和自定义控件为 ActiveX 宿主提供了设计时体验。另外,还用一个测试证书对两个项目进行了签名,此证书还被配置给了设备,使得应用程序(和控件)可以在具有安全模型的基于 Microsoft Windows Mobile 的设备上以“特权”模式运行。