扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
作者:Microsoft Corporation 来源:Microsoft Corporation 2007年9月10日
关键字: Visual C++ Visual Studio 应用程序 迁移
此体验的目标是将一个 Microsoft eMbedded Visual C++ (eVC) Pocket PC 2003 应用程序迁移到 Visual Studio 2005,并为其创建智能设备 CAB 项目。
• |
练习 1 – 将 eMbedded Visual C++ Windows Mobile Win32 项目迁移到 Visual Studio 2005 |
• |
练习 2 – 创建智能设备 CAB 项目 |
练习 1:将 eMbedded Visual C++ Windows Mobile Win32 项目迁移到 Visual Studio 2005
在 Visual Studio 2005 中打开 eMbedded Visual C++ 项目的步骤
1. |
在 Visual Studio 2005 中,选择 File | Open | Project/Solution(文件 | 打开 | 项目/解决方案)。 |
2. |
浏览到 C:\HOL\dirtree。 |
3. |
选择 dirtree.vcp,然后单击 Open(打开)。 |
4. |
在 Visual Studio Conversion Wizard(Visual Studio 转换向导)欢迎页面上,单击 Finish(完成),然后单击 Close(关闭)。 |
5. |
在 Solution Explorer(解决方案资源管理器)中,右键单击 DirTree 项目,然后单击 Properties(属性)。 |
6. |
展开 Configuration Properties | Linker | Input(配置属性 | 链接器 | 输入)。 |
7. |
在 Configuration(配置)下拉列表框中,选择 All Configurations(所有配置)。 |
8. |
在 Platform(平台)下拉列表框中,选择 All Platforms(所有平台)。 |
9. |
单击 Ignore Specific Library(忽略特定库)属性中的省略号,如下图所示。 |
10. |
在文本框中,键入 oldnames.lib,然后单击 OK(确定)。 |
11. |
单击 AdditionalDependencies(附加依赖项)属性中的省略号,然后添加以下 .lib 文件:commctrl.lib coredll.lib aygshell.lib secchk.lib ccrtrtti.lib |
12. |
单击 OK(确定)。 |
创建方向识别功能的步骤
1. |
在 Solution Explorer(解决方案资源管理器)中,展开 DirTree | Resource Files。 |
2. |
双击 treedir.rc 文件。 |
3. |
在 Resource View(资源视图)中,展开 treedir.rc | Dialog。 |
4. |
右键单击 IDD_ABOUT 对话框,然后选择 Copy(复制)。 |
5. |
选择 Dialog 文件夹,然后单击 Paste(粘贴)。 |
6. |
选择 IDD_ABOUT1,然后单击 Properties(属性)选项卡。 |
7. |
在 Properties(属性)窗口,将 ID 值从 IDD_ABOUT1 更改为 IDD_ABOUT_WIDE。 |
8. |
在 Dialog Editor(对话框编辑器)中,调整 IDD_ABOUT_WIDE 的大小,使其约为 215 x 135,如下图所示。(可以在 IDE 的右下角查看对话框的大小。) |
9. |
将图标移动到文本右侧,如上图所示。 |
10. |
在 resource.h 中,添加下行。 #define IDD_ABOUT_WIDE 200 |
11. |
在 globals.h 中,添加下行。 #include <DeviceResolutionAware.h> |
12. |
在 wndproc.cpp 中,导航至 void Main_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify) 并将以下内容: DialogBox(g_hInstance, MAKEINTRESOURCE(IDD_ABOUT), hwnd, (DLGPROC)AboutDlgProc); 替换为: DialogBox(g_hInstance, DRA::GetDisplayMode() != DRA::Portrait ? MAKEINTRESOURCE(IDD_ABOUT_WIDE) :MAKEINTRESOURCE(IDD_ABOUT), hwnd, (DLGPROC)AboutDlgProc); |
13. |
导航至 LRESULT CALLBACK AboutDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 并添加以下 CASE 语句。 case WM_SIZE: DRA::RelayoutDialog( g_hInstance, hwnd, DRA::GetDisplayMode() != DRA::Portrait ?MAKEINTRESOURCE(IDD_ABOUT_WIDE) :MAKEINTRESOURCE(IDD_ABOUT)); return (TRUE); } |
14. |
现在,LRESULT CALLBACK AboutDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) 应为如下所示: LRESULT CALLBACK AboutDlgProc(HWND hwnd, UINT uMsg, WPARAM wParam, LPARAM lParam) { SHINITDLGINFO shidi; switch(uMsg) { case WM_INITDIALOG: //在 Pocket PC 设备上以常规方式创建所有对话框,使其成为 //上端带有 // OK(确定)按钮的全屏对话框。 // 创建一个 Done(完成)按钮并设定其大小。 shidi.dwMask = SHIDIM_FLAGS; shidi.dwFlags = SHIDIF_DONEBUTTON | SHIDIF_SIPDOWN | SHIDIF_SIZEDLGFULLSCREEN; shidi.hDlg = hwnd; //初始化基于 dwFlags 参数的对话框 SHInitDialog(&shidi); // 如果将重点设置在对话框的第一个空间上,应返回非零值, // 否则,如果此例程手动设置重点,则返回零。 return (TRUE); case WM_COMMAND: switch (LOWORD(wParam)) { case IDOK: EndDialog(hwnd, 0); break; case IDCANCEL: EndDialog(hwnd, 0); break; } return (TRUE); case WM_SIZE: DRA::RelayoutDialog (g_hInstance, hwnd, DRA::GetDisplayMode() != DRA::Portrait ?MAKEINTRESOURCE(IDD_ABOUT_WIDE) :MAKEINTRESOURCE(IDD_ABOUT)); return (TRUE); } return (FALSE); } |
在 Pocket PC 2003 上运行应用程序的步骤
1. |
在 Configuration Manager(配置管理器)中,确保选择了 Pocket PC 2003 (ARMV4),如下图所示。 |
2. |
在 Device Deployment(设备部署)工具栏中,确保选择了 Pocket PC 2003 SE Emulator(Pocket PC 2003 SE 仿真器),如下图所示。 |
3. |
按 F5。 重要信息:如果在部署过程中收到错误,指出正在使用该进程或文件,这意味着程序仍在仿真器上运行着,必须先退出程序,然后才能部署和运行新的副本。在部署仿真器的体验中,随时都可能出现此错误。有关退出正在运行的应用程序的说明,请参见此体验的附录。 |
4. |
在仿真器中启动应用程序之后,在应用程序中选择 Help | About(帮助 | 关于),如下图所示。 |
5. |
通过按 Calendar(日历)按钮(功能键 2),旋转仿真器,如下图所示。 |
6. |
监视横向形式的 About(关于)框加载完成。 |
7. |
单击 Debug(调试),然后单击 StopDebugging(停止调试)以终止应用程序。 |
在 Windows Mobile 5.0 Pocket PC 上运行应用程序的步骤
1. |
在 Configuration Manager(配置管理器)中,确保选择了 Windows Mobile 5.0 Pocket PC SDK (ARMV4I)。 |
2. |
在 Device Deployment(设备部署)工具栏中,确保选择了 Windows Mobile 5.0 Pocket PC Emulator(Windows Mobile 5.0 Pocket PC 仿真器)。 |
3. |
按 F5。 |
4. |
在仿真器中启动应用程序之后,在应用程序中选择 Help | About(帮助 | 关于)。 |
5. |
通过按 Calendar(日历)按钮,旋转仿真器。 监视横向形式的 About(关于)框加载完成。 |
练习 2:创建智能设备 CAB 项目
创建智能设备 CAB 项目的步骤
1. |
在 Solution Explorer(解决方案资源管理器)中,右键单击解决方案,然后选择 Add | New Project(添加 | 新建项目)。 |
2. |
展开 Other Project Types | Setup and Deployment(其他项目类型 | 安装和部署)。 |
3. |
选择 Smart Device CAB Project(智能设备 CAB 项目),并在 Name(名称)文本框中输入 DirTreeSetup,然后单击 OK(确定)。 |
4. |
在 Solution Explorer(解决方案资源管理器)中,右键单击新创建的 DirTreeSetup 项目,然后选择 View | File System(视图 | 文件系统)。 |
5. |
在 FileSystem(文件系统)窗口中,右键单击 ProgramFiles 文件夹,然后选择 Add | Folder(添加 | 文件夹)。 |
6. |
将新添加的文件夹命名为 DirTree。 |
7. |
右键单击 DirTree 文件夹,然后选择 Add | Project Output(添加 | 项目输出)。 |
8. |
在 Project(项目)下拉列表框中,确保选择了 DirTree,然后单击 PrimaryOutput(主输出)。 |
9. |
在 Configuration(配置)下拉列表框中,确保选择了 (Active)([活动])。如果您在先前的任务中生成了 DirTree 项目的发行版本,则可以在此 Configuration(配置)下拉列表框中选择 Release(发行)。 |
10. |
单击 OK(确定)。 |
11. |
在 Solution Explorer(解决方案资源管理器)中,右键单击 DirTreeSetup 项目,然后选择 Build(生成)。 |
12. |
可以在 My Documents\Visual Studio 2005\Projects\DirTree\DirTreeSetup\<config>(其中“<config>”为 Release [发行] 或 Debug [调试])中找到 DirTreeSetup.cab 文件。 |
在此体验中,您执行了以下练习:
• |
练习 1 – 将 eMbedded Visual C++ Windows Mobile Win32 项目迁移到 Visual Studio 2005 |
• |
练习 2 – 创建智能设备 CAB 项目 |
在此体验中,您将一个 eMbedded Visual C++ Pocket PC 2003 应用程序迁移到了 Visual Studio 2005,对其进行了编译,并在 Pocket PC 2003 和 Microsoft Windows Mobile 5.0 Pocket PC 上运行了该应用程序。同时,通过在应用程序处于横向模式时使 About(关于)框以“加宽”形式加载,还向应用程序添加了方向识别功能。
注意:许多典型问题应已涵盖在“What's New in Visual Studio 2005 for Native Developers”和“将 Microsoft eMbedded Visual C++ 项目迁移到 Visual Studio 2005”这两本白皮书中。如果用户按 CTRL + 空格键获得 IntelliSense 以完成一行代码,则 IDE 可能会冻结。出现这种情况时,只需告诉用户这是一个已知的错误,不要按 CTRL + 空格键。
此体验的目标是将一个 Microsoft eMbedded Visual C++ MFC Pocket PC 2003 应用程序迁移到 Visual Studio 2005,并为其创建智能设备 CAB 项目。
• |
练习 1 – 迁移基于 Windows Mobile 的 eMbedded Visual C++ MFC 应用程序 |
• |
练习 2 – 创建智能设备 CAB 项目 |
练习 1:迁移基于 Windows Mobile 的 eMbedded Visual C++ MFC 应用程序
在 Visual Studio 2005 中打开 eMbedded Visual C++ 项目的步骤
1. |
在 Visual Studio 2005 中,选择 File | Open | Project/Solution(文件 | 打开 | 项目/解决方案)。 |
2. |
浏览到 C:\HOL\chkbook。 |
3. |
选择 chkbook.vcp,然后单击 Open(打开)。 |
4. |
单击 Finish(完成),然后单击 Close(关闭)。 |
迁移代码的步骤(第 I 部分)
1. |
在 checkdlg.cpp 中,将三次出现的 _tcslen 全部替换为 ::wcslen。 需要执行此操作以区分平台 API 和 MFC API。 |
2. |
在 chkbkdoc.cpp 中,由于 MFC 8.0 for Devices 中不支持 Dump(转储),所以需要注释以下代码。 Void CCheckBookDoc::Dump(CDumpContext& dc) const { CDocument::Dump(dc); } |
3. |
在 chkbkdoc.h 中,注释以下代码。 virtual void Dump(CDumpContext& dc) const; |
4. |
在 chkbkedt.cpp 中,将以下代码: static bSetTabStops = FALSE; 更改为: static BOOL bSetTabStops = FALSE; 由于 Visual Studio 2005 设备编译器具有更加紧密的一致性特征(相对 eMbedded Visual C++ 编译器而言),因此需要这样做。 |
5. |
在 chkbkvw.cpp 中,注释以下代码。 void CCheckBookView::Dump(CDumpContext& dc) const { CView::Dump(dc); } 另外还要注释以下代码。 m_dlg.m_bFullScreen=FALSE; m_dlg.m_bFullScreen is always set to True for Windows Mobile platforms (set in dlgcore.cpp) |
6. |
在 chkbkvw.h 中,注释以下代码。 virtual void Dump(CDumpContext& dc) const; |
迁移资源的步骤
1. |
在 Solution Explorer(解决方案资源管理器)中,右键单击 chkbook.rc 文件,然后选择 ViewCode(查看代码)。 |
2. |
在 Menu 段中,将以下代码: IDR_MAINFRAME MENU PRELOAD DISCARDABLE BEGIN POPUP "&File" BEGIN MENUITEM "&New...\tCtrl+N", ID_FILE_NEW MENUITEM "&Open...\tCtrl+O", ID_FILE_OPEN MENUITEM SEPARATOR MENUITEM "E&xit", ID_APP_EXIT END POPUP "&Edit" BEGIN MENUITEM "&Commit Check", ID_EDIT_COMMIT MENUITEM SEPARATOR MENUITEM "&New Check", ID_EDIT_NEW_CHECK MENUITEM SEPARATOR MENUITEM "Ne&xt Check", ID_NEXT_CHECK MENUITEM "&Prev Check", ID_PREV_CHECK END POPUP "&View" BEGIN MENUITEM "&Check", ID_VIEW_CHECK MENUITEM "&Book", ID_VIEW_BOOK END POPUP "&Help" BEGIN MENUITEM "&About...", ID_APP_ABOUT END END 替换为: IDR_MAINFRAME MENU PRELOAD DISCARDABLE BEGIN POPUP "Menu" BEGIN POPUP "File" BEGIN MENUITEM "New...", ID_FILE_NEW MENUITEM "Open...", ID_FILE_OPEN MENUITEM SEPARATOR MENUITEM "Exit", ID_APP_EXIT END POPUP "Edit" BEGIN MENUITEM "Commit Check", ID_EDIT_COMMIT MENUITEM SEPARATOR MENUITEM "New Check", ID_EDIT_NEW_CHECK MENUITEM SEPARATOR MENUITEM "Next Check", ID_NEXT_CHECK MENUITEM "Prev Check", ID_PREV_CHECK END POPUP "View" BEGIN MENUITEM "Check", ID_VIEW_CHECK MENUITEM "Book", ID_VIEW_BOOK END POPUP "Help" BEGIN MENUITEM "About...", ID_APP_ABOUT END END END |
3. |
注释以下代码。 STRINGTABLE DISCARDABLE BEGIN ID_FILE_MRU_FILE1 "Open this document" ID_FILE_MRU_FILE2 "Open this document" ID_FILE_MRU_FILE3 "Open this document" ID_FILE_MRU_FILE4 "Open this document" ID_FILE_MRU_FILE5 "Open this document" ID_FILE_MRU_FILE6 "Open this document" ID_FILE_MRU_FILE7 "Open this document" ID_FILE_MRU_FILE8 "Open this document" ID_FILE_MRU_FILE9 "Open this document" ID_FILE_MRU_FILE10 "Open this document" ID_FILE_MRU_FILE11 "Open this document" ID_FILE_MRU_FILE12 "Open this document" ID_FILE_MRU_FILE13 "Open this document" ID_FILE_MRU_FILE14 "Open this document" ID_FILE_MRU_FILE15 "Open this document" ID_FILE_MRU_FILE16 "Open this document" END |
4. |
在 String Table 段中,在最后一个 STRINGTABLE DISCARDABLE 段的末尾添加以下行。 IDS_MENU "Menu" IDS_NEW "New" |
将 RCDATA 添加到 RC2 文件的步骤
1. |
在 Solution Explorer(解决方案资源管理器)中,右键单击 Resource Files 文件夹,然后单击 Add | Existing Item(添加 | 现有项)。 |
2. |
双击 Chkbook 示例目录中的 Res 目录,然后将 Files of type(文件类型)更改为 All Files (*.*)(所有文件(*.*))。 |
3. |
选择 chkbook.rc2,然后单击 Add(添加)。 |
4. |
在 Solution Explorer(解决方案资源管理器)中,右键单击 chkbook.rc2,然后选择 ViewCode(查看代码)。 |
5. |
在 Add Manually Edited Resources Here(在此处添加手动编辑的资源)区域中,添加以下代码。 IDR_MAINFRAME RCDATA BEGIN IDR_MAINFRAME, 2, I_IMAGENONE, ID_FILE_NEW, TBSTATE_ENABLED, TBSTYLE_BUTTON | TBSTYLE_AUTOSIZE, IDS_NEW, 0, NOMENU, I_IMAGENONE, IDM_MENU, TBSTATE_ENABLED, TBSTYLE_DROPDOWN | TBSTYLE_AUTOSIZE, IDS_MENU, 0, 0, END |
迁移代码(第 II 部分)
1. |
在 resource.h 中,添加以下行。 #define IDS_NEW 70000 define IDS_MENU 70001 #define IDM_MENU 70002 | ||||||
2. |
在 chkrec.cpp 中,将三次出现的以下内容: if (m_file.m_hFile != (UINT)CFile::hFileNull) 全部更改为: if (m_file.m_hFile != (HANDLE)CFile::hFileNull) | ||||||
3. |
在 chkrec.h 中,将以下内容: m_nRecordLength = sizeof(CCheckRecord); if (m_file.m_hFile != -1) m_file.Close(); 更改为: m_nRecordLength = sizeof(CCheckRecord); if (m_file.m_hFile != (HANDLE) -1) m_file.Close(); | ||||||
4. |
在 mainfrm.cpp 中,做出以下更改:
| ||||||
5. |
在 mainfrm.h 中,做出以下更改:
|
更改项目属性的步骤
1. |
在 Solution Explorer(解决方案资源管理器)中,右键单击该项目,然后选择 Properties(属性)。 |
2. |
在 Configuration(配置)下拉列表框中,选择 AllConfigurations(所有配置)。 |
3. |
在 Platform(平台)下拉列表框中,选择 AllPlatforms(所有平台)。 |
4. |
展开 Linker | Advanced | Entry Point(链接器 | 高级 | 入口点)。 |
5. |
将 wWinMainCRTStartup 更改为 WinMainCRTStartup。 |
6. |
展开 C/C++ | Preprocessor(C/C++ | 预处理器)。 |
7. |
在 Platform(平台)下拉列表框中,选择 Multiple Platforms(多个平台)。 |
8. |
在 Multiple Platforms (多个平台)对话框中,清除 Smartphone 2003 (ARMV4) 和 Windows Mobile 5.0 Smartphone SDK (ARMV4I) 复选框。 |
9. |
单击 PreprocessorDefinitions(预处理器定义)属性中的省略号,如下图所示。 |
10. |
将以下条目添加到列表中。 _WIN32_WCE_PSPC |
11. |
单击 OK(确定),然后单击 Apply(应用)。 |
在 Pocket PC 2003 上运行应用程序的步骤
• |
在 Configuration Manager(配置管理器)中,确保选择了 Pocket PC 2003 (ARMV4)。 |
• |
在 Device Deployment(设备部署)工具栏中,确保选择了 Pocket PC 2003 SE Emulator(Pocket PC 2003 SE 仿真器)。 |
• |
按 F5。 |
在 Windows Mobile 5.0 Pocket PC 上运行应用程序的步骤
1. |
在 Configuration Manager(配置管理器)中,确保选择了 Windows Mobile 5.0 Pocket PC SDK (ARMV4I),如下图所示。 |
2. |
在 DeviceDeployment(设备部署)工具栏中,确保选择了 Windows Mobile 5.0 Pocket PCEmulator(Windows Mobile 5.0 Pocket PC 仿真器),如下图所示。 |
3. |
按 F5。 |
练习 2:创建智能设备 CAB 项目
创建智能设备 CAB 项目的步骤
1. |
在 Solution Explorer(解决方案资源管理器)中,右键单击解决方案,然后选择 Add | New Project(添加 | 新键项目)。 |
2. |
展开 Other Project Types | Setup and Deployment(其他项目类型 | 安装和部署)。 |
3. |
选择 Smart Device CAB Project(智能设备 CAB 项目),然后在 Name(名称)文本框中键入 ChkbookSetup。 |
4. |
在 Solution Explorer(解决方案资源管理器)中,右键单击新创建的 ChkbookSetup 项目,然后选择 View | File System(视图 | 文件系统)。 |
5. |
在 File System(文件系统)窗口中,右键单击 Program Files 文件夹,然后选择 Add | Folder(添加 | 文件夹)。 |
6. |
将新添加的文件夹命名为 Chkbook。 |
7. |
右键单击 Chkbook 文件夹,然后选择 Add | Project Output(添加 | 项目输出) |
8. |
在 Project(项目)下拉列表框中,确保选择了 Chkbook,然后单击 Primary Output(主输出)。 |
9. |
在 Configuration(配置)下拉列表框中,确保选择了 (Active)([活动])。如果您在先前的任务中生成了 Chkbook 项目的 Release(发行)版本,则可以在此 Configuration(配置)下拉列表框中选择 Release(发行)。 |
10. |
单击 OK(确定)。 |
11. |
在 Solution Explorer(解决方案资源管理器)中,右键单击 ChkbookSetup 项目,然后选择 Build(生成)。 |
12. |
可以在 My Documents\Visual Studio 2005\Projects\Chkbook\ChkbookSetup\<config>(其中“<config>”为 Release [发行] 或 Debug [调试])中找到 ChkbookSetup.cab 文件。 |
此任务说明了如何终止在设备或仿真器上运行的应用程序。如果在没有附加调试器的情况下启动了应用程序,并且需要终止该应用程序以便可以部署新的应用程序副本,则会用到此任务。将通过在 Visual Studio 中使用远程进程查看器这一远程工具来终止应用程序。
需要知道可执行文件的名称才能终止进程。大多数情况下,此名称就是 Visual Studio 项目的名称。如果您不确定可执行文件的名称,则可以在项目属性中查找。
1. |
从 Visual Studio 中,选择 Project(项目),然后选择 xxx Properties(xxx 属性),其中 xxx 代表当前项目的名称。 |
2. |
注意 AssemblyName(程序集名称)字段中的值。此值是可执行文件在设备或仿真器上运行时将使用的名称。 |
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. |
连接到仿真器或设备之后,在 RemoteProcessViewer(远程进程查看器)的顶部窗格中找到您要终止的应用程序,如下图所示。 可能需要加宽 Process(进程)列(最左边的列)以完全显示出进程名称。 |
7. |
单击进程名称以选择进程。 |
8. |
要终止进程,请从 RemoteProcessViewer(远程进程查看器)菜单中选择 File > Terminate Process(文件 > 终止进程)。 注意:在单击 Terminate Process(终止进程)之前,请确保选择了正确的进程。终止不正确的进程可能会致使设备或仿真器不可用,这样就必须将其复位才能再次使用。 |
9. |
通过在 Remote Process Viewer(远程进程查看器)菜单上选择 Target > Refresh(目标 > 刷新)并再次滚动浏览顶部窗格,来验证进程是否已终止。如果该应用程序名仍然存在,则说明进程未被终止,您需要重复以上步骤。 |
注意:大多数进程只需执行一次操作即可终止;但是,根据应用程序状态的不同,偶尔会需要执行两次操作才能终止。
在此体验中,您执行了以下练习:
• |
练习 1 – 迁移基于 Windows Mobile 的 eMbedded Visual C++ MFC 应用程序 |
• |
练习 2 – 创建智能设备 CAB 项目 |
在此体验中,您将一个 eMbedded Visual C++ (eVC) MFC Pocket PC 2003 应用程序迁移到了 Visual Studio 2005。另外,还对应用程序代码进行了更改,将端口从 MFC 3.0 for Devices 改为 MFC 8.0 for Devices。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者