网络
虚拟私有云 VPC
弹性公网IP EIP
弹性负载均衡 ELB
NAT网关 NAT
云专线 DC
虚拟专用网络 VPN
云连接 CC
VPC终端节点 VPCEP
企业路由器 ER
企业交换机 ESW
全球加速 GA
企业连接 EC
云原生应用网络 ANC
安全与合规
安全技术与应用
Web应用防火墙 WAF
企业主机安全 HSS
云防火墙 CFW
安全云脑 SecMaster
DDoS防护 AAD
数据加密服务 DEW
数据库安全服务 DBSS
云堡垒机 CBH
数据安全中心 DSC
云证书管理服务 CCM
威胁检测服务 MTD
态势感知 SA
认证测试中心 CTC
边缘安全 EdgeSec
应用中间件
微服务引擎 CSE
分布式消息服务Kafka版
分布式消息服务RabbitMQ版
分布式消息服务RocketMQ版
API网关 APIG
分布式缓存服务 DCS
多活高可用服务 MAS
事件网格 EG
管理与监管
统一身份认证服务 IAM
消息通知服务 SMN
云监控服务 CES
应用运维管理 AOM
应用性能管理 APM
云日志服务 LTS
云审计服务 CTS
标签管理服务 TMS
配置审计 Config
应用身份管理服务 OneAccess
资源访问管理 RAM
组织 Organizations
资源编排服务 RFS
优化顾问 OA
IAM 身份中心
云运维中心 COC
资源治理中心 RGC
解决方案
高性能计算 HPC
SAP
混合云灾备
开天工业工作台 MIW
Haydn解决方案工厂
数字化诊断治理专家服务
云生态
云商店
合作伙伴中心
华为云开发者学堂
华为云慧通差旅
开发与运维
软件开发生产线 CodeArts
需求管理 CodeArts Req
流水线 CodeArts Pipeline
代码检查 CodeArts Check
编译构建 CodeArts Build
部署 CodeArts Deploy
测试计划 CodeArts TestPlan
制品仓库 CodeArts Artifact
移动应用测试 MobileAPPTest
CodeArts IDE Online
开源镜像站 Mirrors
性能测试 CodeArts PerfTest
应用管理与运维平台 ServiceStage
云应用引擎 CAE
开源治理服务 CodeArts Governance
华为云Astro轻应用
CodeArts IDE
Astro工作流 AstroFlow
代码托管 CodeArts Repo
漏洞管理服务 CodeArts Inspector
联接 CodeArtsLink
软件建模 CodeArts Modeling
Astro企业应用 AstroPro
CodeArts盘古助手
华为云Astro大屏应用
计算
弹性云服务器 ECS
Flexus云服务
裸金属服务器 BMS
云手机服务器 CPH
专属主机 DeH
弹性伸缩 AS
镜像服务 IMS
函数工作流 FunctionGraph
云耀云服务器(旧版)
VR云渲游平台 CVR
Huawei Cloud EulerOS
云化数据中心 CloudDC
网络
虚拟私有云 VPC
弹性公网IP EIP
弹性负载均衡 ELB
NAT网关 NAT
云专线 DC
虚拟专用网络 VPN
云连接 CC
VPC终端节点 VPCEP
企业路由器 ER
企业交换机 ESW
全球加速 GA
企业连接 EC
云原生应用网络 ANC
CDN与智能边缘
内容分发网络 CDN
智能边缘云 IEC
智能边缘平台 IEF
CloudPond云服务
安全与合规
安全技术与应用
Web应用防火墙 WAF
企业主机安全 HSS
云防火墙 CFW
安全云脑 SecMaster
DDoS防护 AAD
数据加密服务 DEW
数据库安全服务 DBSS
云堡垒机 CBH
数据安全中心 DSC
云证书管理服务 CCM
威胁检测服务 MTD
态势感知 SA
认证测试中心 CTC
边缘安全 EdgeSec
大数据
MapReduce服务 MRS
数据湖探索 DLI
表格存储服务 CloudTable
可信智能计算服务 TICS
推荐系统 RES
云搜索服务 CSS
数据可视化 DLV
数据接入服务 DIS
数据仓库服务 GaussDB(DWS)
数据治理中心 DataArts Studio
湖仓构建 LakeFormation
智能数据洞察 DataArts Insight
应用中间件
微服务引擎 CSE
分布式消息服务Kafka版
分布式消息服务RabbitMQ版
分布式消息服务RocketMQ版
API网关 APIG
分布式缓存服务 DCS
多活高可用服务 MAS
事件网格 EG
开天aPaaS
应用平台 AppStage
开天企业工作台 MSSE
开天集成工作台 MSSI
API中心 API Hub
云消息服务 KooMessage
交换数据空间 EDS
云地图服务 KooMap
云手机服务 KooPhone
组织成员账号 OrgID
云空间服务 KooDrive
管理与监管
统一身份认证服务 IAM
消息通知服务 SMN
云监控服务 CES
应用运维管理 AOM
应用性能管理 APM
云日志服务 LTS
云审计服务 CTS
标签管理服务 TMS
配置审计 Config
应用身份管理服务 OneAccess
资源访问管理 RAM
组织 Organizations
资源编排服务 RFS
优化顾问 OA
IAM 身份中心
云运维中心 COC
资源治理中心 RGC
区块链
区块链服务 BCS
数字资产链 DAC
华为云区块链引擎服务 HBS
解决方案
高性能计算 HPC
SAP
混合云灾备
开天工业工作台 MIW
Haydn解决方案工厂
数字化诊断治理专家服务
价格
成本优化最佳实践
专属云商业逻辑
云生态
云商店
合作伙伴中心
华为云开发者学堂
华为云慧通差旅
其他
管理控制台
消息中心
产品价格详情
系统权限
客户关联华为云合作伙伴须知
公共问题
宽限期保留期
奖励推广计划
活动
云服务信任体系能力说明
开发与运维
软件开发生产线 CodeArts
需求管理 CodeArts Req
流水线 CodeArts Pipeline
代码检查 CodeArts Check
编译构建 CodeArts Build
部署 CodeArts Deploy
测试计划 CodeArts TestPlan
制品仓库 CodeArts Artifact
移动应用测试 MobileAPPTest
CodeArts IDE Online
开源镜像站 Mirrors
性能测试 CodeArts PerfTest
应用管理与运维平台 ServiceStage
云应用引擎 CAE
开源治理服务 CodeArts Governance
华为云Astro轻应用
CodeArts IDE
Astro工作流 AstroFlow
代码托管 CodeArts Repo
漏洞管理服务 CodeArts Inspector
联接 CodeArtsLink
软件建模 CodeArts Modeling
Astro企业应用 AstroPro
CodeArts盘古助手
华为云Astro大屏应用
存储
对象存储服务 OBS
云硬盘 EVS
云备份 CBR
高性能弹性文件服务 SFS Turbo
弹性文件服务 SFS
存储容灾服务 SDRS
云硬盘备份 VBS
云服务器备份 CSBS
数据快递服务 DES
云存储网关 CSG
专属分布式存储服务 DSS
数据工坊 DWR
地图数据 MapDS
键值存储服务 KVS
容器
云容器引擎 CCE
云容器实例 CCI
容器镜像服务 SWR
云原生服务中心 OSC
应用服务网格 ASM
华为云UCS
数据库
云数据库 RDS
数据复制服务 DRS
文档数据库服务 DDS
分布式数据库中间件 DDM
云数据库 GaussDB
云数据库 GeminiDB
数据管理服务 DAS
数据库和应用迁移 UGO
云数据库 TaurusDB
人工智能
AI开发平台ModelArts
华为HiLens
图引擎服务 GES
图像识别 Image
文字识别 OCR
自然语言处理 NLP
内容审核 Moderation
图像搜索 ImageSearch
医疗智能体 EIHealth
企业级AI应用开发专业套件 ModelArts Pro
人脸识别服务 FRS
对话机器人服务 CBS
语音交互服务 SIS
人证核身服务 IVS
视频智能分析服务 VIAS
城市智能体
自动驾驶云服务 Octopus
盘古大模型 PanguLargeModels
IoT物联网
设备接入 IoTDA
全球SIM联接 GSL
IoT数据分析 IoTA
路网数字化服务 DRIS
IoT边缘 IoTEdge
设备发放 IoTDP
企业应用
域名注册服务 Domains
云解析服务 DNS
企业门户 EWP
ICP备案
商标注册
华为云WeLink
华为云会议 Meeting
隐私保护通话 PrivateNumber
语音通话 VoiceCall
消息&短信 MSGSMS
云管理网络
SD-WAN 云服务
边缘数据中心管理 EDCM
云桌面 Workspace
应用与数据集成平台 ROMA Connect
ROMA资产中心 ROMA Exchange
API全生命周期管理 ROMA API
政企自服务管理 ESM
视频
实时音视频 SparkRTC
视频直播 Live
视频点播 VOD
媒体处理 MPC
视频接入服务 VIS
数字内容生产线 MetaStudio
迁移
主机迁移服务 SMS
对象存储迁移服务 OMS
云数据迁移 CDM
迁移中心 MGC
专属云
专属计算集群 DCC
开发者工具
SDK开发指南
API签名指南
DevStar
华为云命令行工具服务 KooCLI
Huawei Cloud Toolkit
CodeArts API
云化转型
云架构中心
云采用框架
用户服务
账号中心
费用中心
成本中心
资源中心
企业管理
工单管理
客户运营能力
国际站常见问题
支持计划
专业服务
合作伙伴支持计划
我的凭证
华为云公共事业服务云平台
工业软件
工业数字模型驱动引擎
硬件开发工具链平台云服务
工业数据转换引擎云服务
更新时间:2025-01-07 GMT+08:00
分享

快速入门

本小节以实现初始化SDK为例,介绍如何使用Windows SDK进行二次集成开发。

开发环境准备

在开发的过程中请满足如下环境要求。

表1 环境要求

环境和工具名称

版本要求

说明

操作系统

Windows 10/11专业版

硬件要求:

  • CPU:i5-2400四核 3.1GHz及以上。
  • 内存:4GB及以上。

Microsoft Visual Studio

Visual Studio 2017

安装时需要勾选“使用 C++ 的桌面开发”,“用于 x86 和 x64 的 Visual C++ MFC”,“Windows 10 SDK (10.0.15063.0)”

测试资源及App ID申请

-

请参见“开发前准备”。

SDK快速集成

集成SDK的exe需要打开每个监视器高dpi识别开关、否则在高dpi的电脑(缩放比例大于100%)上面会显示异常(图片模糊、共享时接收端观看画面不全、倾斜等。)

示例:图12 配置“DPI识别功能”

  1. 解压SDK压缩包到本地。

    图1 解压SDK压缩包到本地
    表2 SDK目录介绍

    文件夹

    用途

    include

    该文件夹下放置编译所需头文件

    lib

    该文件夹下有win32和x64两个子文件夹,分别放置对应平台编译所依赖的.lib文件

    dll

    该文件夹下有win32和x64两个子文件夹,分别放置对应平台运行所依赖的.dll和SDK可执行.exe文件

    HwmSdk

    该文件夹下放置win32和x64公共使用的依赖库

    demo

    该文件夹下放置demo代码文件与资源文件

  2. 创建工程项目。

    1. 打开Visual Studio 2017,单击菜单栏的“文件> 新建> 项目”,打开“新建项目”窗口。
      图2 打开新建项目
    2. 在“新建项目”左侧选择“已安装> Visual C++”,然后在右侧模板中选择“MFC 应用程序”,在“名称”输入工程名称“Hello_World”,在“位置”选择工程保存位置,此处选择“E:\”,完成后点击“确定”。
      图3 新建项目
    3. 在“应用程序类型选项”中选择“应用程序类型”为“基于对话框”,其余设置均保持默认值,单击完成。
      图4 应用程序类型选项

  3. 拷贝静态库文件与头文件到项目中。

    1. 在“Hello_World”工程目录下新建“SDK”目录,与.sln文件同级。
      图5 新建“SDK”

    2. 将“SDK”目录下的“lib”和“include”目录拷贝到“Hello_World\SDK”目录下。
      图6 拷贝文件

  4. 修改项目“配置属性”。

    以下操作基于项目配置Debug与平台Win32,更改配置和平台时需要重新添加附加包含目录和附加依赖库。

    1. 在“Hello_World”项目右键单击“属性”。
      图7 项目属性
    2. 在属性页左侧选择“配置属性 > C/C++ > 常规”,将“附加包含目录”的值修改为“..\SDK\include”, 点击“应用”按钮。
      图8 配置“附加包含目录”
    3. 在属性页左侧选择“配置属性 > 链接器> 常规”,将“附加库目录”的值修改为“..\SDK\lib\win32”, 点击“应用”按钮。
      图9 配置“附加库目录”
    4. 在属性页左侧选择“配置属性> 链接器> 输入”,将“附加依赖项”的值修改为“hwm_sdk_agent.lib”,点击“应用”。
      图10 添加“附加依赖项”
    5. 在属性页左侧列表中选择“配置属性 > 常规”,“ 输出目录”值修改为“..\debug\win32”,点击“确定”按钮。
      图11 配置“输出目录”
    6. 在属性页左侧列表中选择“配置属性 > 清单工具 > 输入和输出”,“ DPI识别功能”值修改为“每个监视器高 DPI 识别”,点击“确定”按钮。
      图12 配置“DPI识别功能”

  5. 添加界面资源控件。

    1. 在“资源视图 ”中,打开工程对应的Dialog页面。
      图13 工程Dialog页面
    2. 选中页面上原有全部控件,按Delete键删除。
      图14 删除原有控件
    3. 添加初始化按钮。
      1. 添加初始化按钮控件:打开“工具箱”页面,选中“Button”控件,拖至对话框页面上并调整宽高。
      图15 添加初始化按钮
      1. 修改按钮上面的注释:选中按钮,右击选择“属性。
        图16 打开按钮属性
      2. 在对应的属性页上,找到“Caption”项,将值修改为“Init”。
        图17 修改按钮属性

  6. 添加按钮点击事件处理。

    1. 双击“Init”控件,系统会自动在Hello_WorldDlg.cpp中添加初始化按钮事件方法OnBnClickedButton1()。
      图18 创建初始化按钮事件方法

  7. 添加代码文件。

    1. 添加回调处理类。
      1. 选中项目右键“添加 > 类”。
        图19 添加类
      2. 在“一般C++类向导”中填写类名“callbackProc”,其他保持默认,点击“完成”,保持现有工程。
        图20 添加“callbackProc类”
    2. 添加通知处理类,类名设置为“notifyProc”。
      图21 添加“notifyProc类”

  8. 添加逻辑代码。

    1. 在callbackProc.h文件中包含SDK回调类头文件HwmAgentCallback.h,使callbackProc类继承于基类HwmAgentCallback,可以只拷贝实现HwmAgentCallback.h文件中需要关注的接口调用回调函数。
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      #pragma once
      #include "HwmAgentCallback.h"
       
      class callbackProc : public hwmsdkagent::HwmAgentCallback
      {
      public:
          callbackProc();
          ~callbackProc();
          /**
               * @brief [en] Callback of Init interface.
               *        [cn] 初始化回调
               *
               * @param [in] hwmsdk::HwmErrCode ret    [en] Return code
               *                                       [cn] 返回值
               * @param [in] const char* reason        [en] Fail reason
               *                                       [cn] 失败原因描述
               * @attention [en] NA
               *            [cn] NA
               **/
          void OnInitResult(hwmsdk::HwmErrCode ret, const char* reason, HwmSdkInfo *sdkInfo);
       
          /**
           * @brief [en] Callback of Exit interface.
           *        [cn] 退出回调
           *
           * @param [in] hwmsdk::HwmErrCode ret    [en] Return code
           *                                       [cn] 返回值
           * @param [in] const char* reason        [en] Fail reason
           *                                       [cn] 失败原因描述
           * @attention [en] NA
           *            [cn] NA
           **/
          void OnExitResult(hwmsdk::HwmErrCode ret, const char* reason);
          
          //为节省篇幅,此处省略其他若干回调接口,实际操作时请注意拷贝完整关注的回调函数。
      }
      

      为节省篇幅,上文代码中有部分省略,请根据SDK头文件实现完整代码。

    2. 在callbackProc.cpp文件中定义接口。
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      #include "stdafx.h"
      #include "callbackProc.h"
      
      callbackProc::callbackProc()
      {
       
      }
      callbackProc::~callbackProc()
      {
       
      }
       
      /**
      * 初始化回调
      */
      void callbackProc::OnInitResult(hwmsdk::HwmErrCode ret, const char* reason, HwmSdkInfo *sdkInfo)
      {
          CString retStr;
          retStr.Format(_T("%d"), ret);
          CString tips = _T("OnInitResult code:") + retStr;
          AfxMessageBox(tips);
      }
      
      /**
      * 退出回调*/
      void callbackProc::OnExitResult(hwmsdk::HwmErrCode ret, const char* reason)
      {
          CString retStr;
          retStr.Format(_T("%d"), ret);
          CString tips = _T("OnExitResult code:") + retStr;
          AfxMessageBox(tips);
      }
      
      //为节省篇幅,此处省略若干代码,实际操作时请注意定义实现关注的回调函数接口。
      

      为节省篇幅,上文代码中有部分省略,请根据SDK头文件实现完整代码。不同版本使用预编译头文件的头文件(stdafx.h或pch.h)可能不一样,若有编译错误,以本地默认头文件为准。

    3. 在notifyProc.h文件中包含SDK回调类头文件HwmAgentNotify.h,使callbackProc类继承于基类HwmAgentNotify,可以只拷贝实现HwmAgentNotify.h文件中需要关注的接口调用回调函数。
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      #pragma once
      #include "HwmAgentNotify.h"
       
       
      class notifyProc : public hwmsdkagent::HwmAgentNotify
      {
      public:
          notifyProc();
          ~notifyProc();
       
          /**
           * @brief [en] Notify of sdk disconnected.
           *        [cn] 连接断开通知
           *
           * @attention [en] NA
           *            [cn] NA
           **/
          void OnSdkDisconnected();
      
          //为节省篇幅,此处省略其他若干回调接口,实际操作时请注意拷贝完整关注的回调函数。
      }
      

      为节省篇幅,上文代码中有部分省略,请根据SDK头文件实现完整代码。

    4. 在notifyProc.cpp文件中定义接口。
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      #include "stdafx.h"
      #include "notifyProc.h"
       
      notifyProc::notifyProc()
      {
       
      }
      notifyProc::~notifyProc()
      {
       
      }
       
      //SDK连接断开通知
      void notifyProc::OnSdkDisconnected()
      {
          CString tips = _T("OnSdkDisconnected");
          AfxMessageBox(tips);
      }
      
      //为节省篇幅,此处省略其他若干回调接口,实际操作时请注意拷贝完整关注的回调函数。 
      

      为节省篇幅,上文代码中有部分省略,请根据SDK头文件实现完整代码。不同版本使用预编译头文件的头文件(stdafx.h或pch.h)可能不一样,若有编译错误,以本地默认头文件为准。

    5. 在Hello_WorldDlg.h文件中包含需要用到的头文件。
      1
      #include "HwmErrorCodeDef.h"
      
    6. 在Hello_WorldDlg.h文件中声明将要使用的函数。
      1
      2
      3
      4
      5
      public:
          //初始化接口
          hwmsdk::HwmErrCode Init();
          //退出接口
          static hwmsdk::HwmErrCode Exit();
      
    7. 在Hello_WorldDlg.cpp文件中包含用到的头文件。
      1
      2
      3
      4
      #include "notifyProc.h"
      #include "callBackProc.h"
      #include "HwmSdkAgent.h"
      #include <string>
      
    8. 在Hello_WorldDlg.cpp定义回调和通知对象。
      1
      2
      static notifyProc *notifyObj = new notifyProc();
      static callbackProc *callbackObj = new callbackProc();
      
    9. 在Hello_WorldDlg.cpp文件中定义初始化接口。
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      /**
      *初始化接口
      */
      hwmsdk::HwmErrCode CHello_WorldDlg::Init()
      {
          //组装入参结构体
          hwmsdkagent::HwmInitInfo initParam;
          memset(&initParam, 0, sizeof(hwmsdkagent::HwmInitInfo));
       
          //(win32平台不需要)x64平台需要设置sdk路径,即exe文件路径,对exe文件重命名后,需要对应修改
          //将path路径转换为UTF8格式后拷贝给initParam,此处省略转换代码
          strcpy_s(initParam.exePath, HWM_MAX_FILE_PATH_LEN, GetHwmSdkExePath().c_str());
          //指定日志路径,将路径转换为UTF8格式后拷贝给initParam,此处省略转换代码
          strcpy_s(initParam.logPath, HWM_MAX_FILE_PATH_LEN, GetLogPath().c_str());
          //指定数据路径,将路径转换为UTF8格式后拷贝给initParam,此处省略转换代码
          strcpy_s(initParam.userDataPath, HWM_MAX_FILE_PATH_LEN, GetUserDataPath().c_str());
          strncpy_s(initParam.appId, GetAppId.c_str(), HWM_MAX_APPID_LEN);
       
          initParam.notify = notifyObj;
          initParam.callback = callbackObj;
          hwmsdk::HwmErrCode ret = hwmsdkagent::Init(&initParam);
       
          return ret;
      }
      
    10. 在Hello_WorldDlg.cpp文件中实现初始化按钮点击事件处理。
      1
      2
      3
      4
      5
      6
      7
      8
      9
      void CHello_WorldDlg::OnBnClickedButton1()
      {
          // TODO: 在此添加控件通知处理程序代码
          hwmsdk::HwmErrCode ret = Init();
          if (hwmsdk::HWM_COMMON_SUCCESS != ret)
          {
              AfxMessageBox(_T("Init error"));
          }
      }
      

      上文代码部分与工程代码重复,注意区分,不要重复添加。

    11. 在Hello_WorldDlg.cpp定义退出接口
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      /**
      *退出接口
      */
      hwmsdk::HwmErrCode CHello_WorldDlg::Exit()
      {
          hwmsdk::HwmErrCode ret = hwmsdkagent::Exit();
          if (hwmsdk::HWM_COMMON_SUCCESS != ret)
          {
              AfxMessageBox(_T("Exit error"));
          }
          return ret;
      }
      
    12. 在Hello_World.cpp文件中找到InitInstance接口,在窗口退出时调用Exit接口。
       1
       2
       3
       4
       5
       6
       7
       8
       9
      10
      11
      12
      13
      14
      15
      16
      17
      18
      19
      20
      21
      22
      23
      24
      25
      26
      27
      28
      29
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      // CHello_WorldApp 初始化
       
      BOOL CHello_WorldApp::InitInstance()
      {
          // 如果一个运行在 Windows XP 上的应用程序清单指定要
          // 使用 ComCtl32.dll 版本 6 或更高版本来启用可视化方式,
          //则需要 InitCommonControlsEx()。  否则,将无法创建窗口。
          INITCOMMONCONTROLSEX InitCtrls;
          InitCtrls.dwSize = sizeof(InitCtrls);
          // 将它设置为包括所有要在应用程序中使用的
          // 公共控件类。
          InitCtrls.dwICC = ICC_WIN95_CLASSES;
          InitCommonControlsEx(&InitCtrls);
       
          CWinApp::InitInstance();
       
       
          AfxEnableControlContainer();
       
          // 创建 shell 管理器,以防对话框包含
          // 任何 shell 树视图控件或 shell 列表视图控件。
          CShellManager *pShellManager = new CShellManager;
       
          // 激活“Windows Native”视觉管理器,以便在 MFC 控件中启用主题
          CMFCVisualManager::SetDefaultManager(RUNTIME_CLASS(CMFCVisualManagerWindows));
       
          // 标准初始化
          // 如果未使用这些功能并希望减小
          // 最终可执行文件的大小,则应移除下列
          // 不需要的特定初始化例程
          // 更改用于存储设置的注册表项
          // TODO: 应适当修改该字符串,
          // 例如修改为公司或组织名
          SetRegistryKey(_T("应用程序向导生成的本地应用程序"));
       
          CHello_WorldDlg dlg;
          m_pMainWnd = &dlg;
          INT_PTR nResponse = dlg.DoModal();
          if (nResponse == IDOK)
          {
              // TODO: 在此放置处理何时用
              //  “确定”来关闭对话框的代码
              CHello_WorldDlg::Exit();
          }
          else if (nResponse == IDCANCEL)
          {
              // TODO: 在此放置处理何时用
              //  “取消”来关闭对话框的代码
              CHello_WorldDlg::Exit();
       
          }
          else if (nResponse == -1)
          {
              TRACE(traceAppMsg, 0, "警告: 对话框创建失败,应用程序将意外终止。\n");
              TRACE(traceAppMsg, 0, "警告: 如果您在对话框上使用 MFC 控件,则无法 #define _AFX_NO_MFC_CONTROLS_IN_DIALOGS。\n");
          }
       
          // 删除上面创建的 shell 管理器。
          if (pShellManager != nullptr)
          {
              delete pShellManager;
          }
       
      #if !defined(_AFXDLL) && !defined(_AFX_NO_MFC_CONTROLS_IN_DIALOGS)
          ControlBarCleanUp();
      #endif
       
          // 由于对话框已关闭,所以将返回 FALSE 以便退出应用程序,
          //  而不是启动应用程序的消息泵。
          return FALSE;
      }
      

      上文代码部分与工程代码重复,注意区分,不要重复添加。

  9. 编译及调试工程。

    1. 选中工程,右键选择“重新生成”,进行编译。
      图22 生成文件
    2. 观察“Output”窗口,出现信息“全部重新生成: 成功 1 个,失败 0 个,跳过 0 个”,代表编译成功。
      图23 生成结果
    3. 编译成功后,生成的可执行程序Hello_World.exe在输出目录下,当前输出目录路径为${path}\Hello_World\debug\win32。
      图24 exe文件
    4. 拷贝“SDK\dll”目录和“SDK\HwmSdk”目录下对应文件到输出目录。

      如果配置为win32平台时,拷贝SDK\dll\win32内dll到输出目录,拷贝SDK\HwmSdk内所有文件到输出目录

      图25 拷贝SDK\dll\win32内dll到输出目录:

      图26 拷贝SDK\HwmSdk内所有文件到输出目录

      如果配置为x64平台时,拷贝SDK\dll\x64内dll到输出目录,拷贝SDK\HwmSdk整个文件夹到输出目录,拷贝SDK\dll\x64内HwmSdk.exe到输出目录HwmSdk文件夹下。

      图27 拷贝SDK\dll\x64内dll到输出目录

      图28 拷贝SDK\HwmSdk整个文件夹到输出目录

      图29 拷贝SDK\dll\x64内HwmSdk.exe到输出目录HwmSdk文件夹下

      配置为Win32平台时,目录地址为SDK\dll\win32,配置为x64平台时,目录地址为SDK\dll\x64。HwmSdk内为公共依赖库文件

    5. 双击Hello_World.exe文件,启动界面。
      图30 启动页面
    6. 点击“Init”按钮登录,初始化结果有弹框提示,0表示成功,其他表示失败,初始化成功后有启动通知弹框。
      图31 结果提示
      图32 启动通知

相关文档