生产环境构建指南:Web应用——备份

VS2010&MFC对话框编程(2)——对话框种类(模态/非模态对话框) 1、对话框组成     从MFC角度看,分为两类:     (1)对话框模板资源。对话框模板用于指定对话框的控件及其分布,Windows根据对话框模板来创建并显示对话框     (2)对话框类。用于实现对话框的功能,一般从CDialog类、CpropertySheet类、CpropertyPage类派生新类,完成特定的功能。 2、对话框分类     对话框分为模态(Model)对 阅读详情

提供:ZStack云计算

系列教程

本教程为生产环境构建指南——Web应用系列六篇中的第四篇。

内容简介

在为应用中的各组件建立起恢复规划后,大家需要设置备份系统以为其提供支持。在今天的教程中,我们将了解如何利用Bacula构建备份解决方案。使用Bacula这类完整的备份系统能够帮助大家完全掌控备份内容,立足于单个文件级别进行细化管理,同时根据实际需求选择具体备份及还原方式。

DigitalOcean Droplet备份一文(即为完整Droplet保留快照备份)中的方式适用于每周定期备份等较为简单的备份需求。如果大家希望使用DigitalOcean Backups,可参阅文中“为数据库创建热备份”章节的内容。

在这部分教程中,我们将设置Bacula作为应用设置内各服务器(包括db1、app1、app2以及lb1)的备份方案,其中包括如何利用Bacula创建LAMP堆栈备份。我们还将利用Percona XtraBackup为MySQL数据库创建热备份。最后,我们将利用rsync在远程数据中心的服务器上创建一套备份副本。这意味着设置中将包含两台服务器:备份服务器与远程备份服务器(远程备份服务器存在于单独的数据中心内)。

马上进入正题。

在备份服务器上安装Bacula

备份服务器上的Bacula设置方式请参阅如何在Ubuntu 14.04上安装Bacula服务器。

接下来参阅如何利用Bacula备份一套Ubuntu 14.04服务器中的Bacula Director配置(服务器)章节。在这里,我们需要在设置Bacula客户端(位于需要备份的服务器之上)时使用Director名称。

请注意,我们将使用RemoteFile池以处理全部备份任务,因此在实际处理前我们需要对其进行设定调整以满足具体需求。

在各服务器上安装Bacula客户端

请参阅如何利用Bacula备份一套Ubuntu 14.04服务器以了解在各需备份服务器上安装Bacula客户的具体方式。

请注意,大家需要使用各服务器上bacula-fd.conf文件中的FileDaemon Name(通常为添加“-fd”后缀的主机名称)以及Director Password(即Bacula服务器用于同各客户端对接的密码)。

向备份服务器添加Bacula客户端

在每台已经安装了Bacula客户端的服务器上,将Client资源添加至/etc/bacula/conf.d/clients.conf文件。

打开该clients.conf文件:

- sudo vi /etc/bacula/conf.d/clients.conf

以下示例为面向数据库服务器db1的Client资源定义。请注意,Name值应当与FileDaemon资源的Name相匹配,而Password则需要匹配Director资源的Password。大家可以在各Bacula客户端服务器的/etc/bacula/bacula-fd.conf文件中找到这些值:

clients.conf — Example Client resource definition

Client {
Name = db1-fd
Address = db1.nyc3.example.com
FDPort = 9102
Catalog = MyCatalog
Password = "PDL47XPnjI0QzRpZVJKCDJ_xqlMOp4k46"          # password for Remote FileDaemon
File Retention = 30 days            # 30 days
Job Retention = 6 months            # six months
AutoPrune = yes                     # Prune expired Jobs/Files
}

为其它各Bacula客户端服务器创建同样的Client资源。在本示例中,完成后应共有四项Client资源,分别为db1-fd、app1-fd、app2-fd与lb1-fd。通过这样的Bacula Director设置方式,我们将能够保证Bacula客户端接入各服务器。

保存并退出。

更多细节信息可参阅如何利用Bacula备份一套Ubuntu服务器教程中的“安装并配置Bacula客户端”章节。

为数据库创建热备份

为了确保活动数据库备份的可用性,这里我们可以轻松利用Percona XtraBackup为MySQL创建热备份。

安装Percona XtraBackup

请参阅如何在Ubuntu 14.04上利用Percona XtraBackup为MySQL数据库创建热备份以了解在数据库服务器(db1)上安装并配置Percona XtraBackup的具体方式。

创建XtraBackup脚本

Percona XtraBackup现在已经做好为MySQL数据库创建热备份的准备,但这里我们还需要对热备份进行调度。在本示例中,我们选择最简单的实现方式:使用bash脚本与cron任务。

在/usr/loca/bin中创建一个名为run_extra_backup.sh的bash脚本:

- sudo vi /usr/local/bin/run_xtrabackup.sh

添加以下脚本。请确保在其中使用XtraBackup过程中所设置的正确用户及密码内容:

/usr/local/bin/run_xtrabackup.sh

#!/bin/bash

# pre xtrabackup
chown -R mysql: /var/lib/mysql
find /var/lib/mysql -type d -exec chmod 770 "{}" \;

# delete existing full backup
rm -r /data/backups/full

# xtrabackup create backup
innobackupex --user=bkpuser  --password=bkppassword --no-timestamp /data/backups/full

# xtrabackup prepare backup
innobackupex --apply-log /data/backups/full

保存并退出。运行此脚本(使用superuser权限)将删除/data/backups/full中的现有XtraBackup备份,并创建一套新的完整备份。请参阅执行完整热备份以了解更多细节信息。

现在为该脚本提供执行权限:

- sudo chmod +x /usr/local/bin/run_xtrabackup.sh

为了正确备份数据库,我们需要在Bacula备份数据库服务器之前,确保此XtraBackup脚本得以运行及完成。理想的解决方案为对Bacula备份任务进行配置,从而将该脚本作为“预备份脚本”,但大家也可以选择使用cron任务来简化实现方式。

创建一个cron配置文件(将/etc/cron.d中的文件添加至root的crontab当中):

- sudo vi /etc/cron.d/xtrabackup

添加以下cron任务:

/etc/cron.d/xtrabackup

30 22    * * *   root    /usr/local/bin/run_xtrabackup.sh

通过这种方式,该脚本将以root权限于每天10:30pm运行。之所以选择这个时间点,是因为Bacula目前的调度计划为每天11:05 pm进行日常运行——我们稍后会对其进行调整。这意味着XtraBackup脚本有35分钟的时间窗口用于执行任务。

现在,数据库热备份机制已经设置完成,下面来看Bacula备份FileSets。

配置Bacula FileSets

Bacula将在与备份任务相关的FileSets当中创建文件备份,由此创造的FileSets还将用于我们的恢复规划。大家可以参阅添加FileSets (服务器)部分内容以了解更多细节信息。

在备份服务器上打开filesets.conf文件:

- sudo vi /etc/bacula/conf.d/filesets.conf
数据库服务器FileSet

根据数据库服务器恢复规划,我们的数据库服务器需要以下几套备份:

  • MySQL数据库: 每天10:30pm在/data/backups/full中由XtraBackup脚本创建一套备份副本。
  • MySQL配置: 位于/etc/mysql。

我们还需要在XtraBackup脚本中包含:

/usr/local/bin/run_xtrabackup.sh以及相关cron文件。

考虑到备份要求,我们还需要将“MySQL Database”FileSet添加到Bacula配置当中:

filesets.conf — MySQL Database

FileSet {
Name = "MySQL Database"
Include {
Options {
  signature = MD5
  compression = GZIP
}
File = /data/backupsFile = /etc/mysql/my.cnfFile = /usr/local/bin/run_xtrabackup.shFile = /etc/cron.d/xtrabackup
}
Exclude {
File = /data/backups/exclude
}
}

接下来处理应用服务器FileSet。

应用服务器FileSet

根据应用服务器备份要求,我们的应用服务器需要以下几套备份:

  • 应用文件:在本示例中位于/var/www/html。

考虑到备份要求,我们将把“Apache DocumentRoot”FileSet添加至Bacula配置当中:

filesets.conf — Apache DocumentRoot

FileSet {
Name = "Apache DocumentRoot"
Include {
Options {
  signature = MD5
  compression = GZIP
}
File = /var/www/html
}
Exclude {
File = /var/www/html/exclude
}
}

大家可能还需要添加Apache端口配置文件,这里可以简单替换因此不再赘述。

现在,让我们着手处理负载均衡服务器FileSet。

负载均衡服务器FileSet

根据负载均衡服务器恢复规划,我们需要的备份包括:

  • SSL证书(PEM)与相关文件: 在本示例中位于/root/certs
  • HAProxy配置文件:位于/etc/haproxy

考虑到备份要求,我们需要将“Apache DocumentRoot”FileSet添加至Bacula配置当中:

filesets.conf — SSL Certs and HAProxy Config

FileSet {
Name = "SSL Certs and HAProxy Config"
Include {
Options {
  signature = MD5
  compression = GZIP
}
File = /root/certsFile = /etc/haproxy
}
Exclude {
File = /root/exclude
}
}

保存并退出。

现在我们的FileSets已经配置完成。下面创建负责使用这些FileSets的Bacula备份Job。

创建Bacula备份Job

在这里,我们要创建负责运行并创建服务器备份的Bacula备份Job。

首先在/etc/bacula/conf.d中创建一个jobs.conf文件:

- sudo vi /etc/bacula/conf.d/jobs.conf
数据库服务器备份Job

作为数据库服务器备份任务,我们需要创建一个名为“Backup db1”的Job,请注意使用我们之前指定的正确Client(db1-fd)与FileSet(MySQL Database):

jobs.conf — Backup db1

Job {
Name = "Backup db1"
JobDefs = "DefaultJob"
Client = db1-fd
Pool = RemoteFile
FileSet="MySQL Database"
}

接下来设置应用服务器备份任务。

应用服务器备份Job

在应用服务器方面,我们需要创建两个备份Job,分别为“Backup app1”与“Backup app2”.请注意使用之前指定的正确Client(app1-fd与app2-fd)及FileSet(Apache DocumentRoot)。

App1 Job:

jobs.conf — Backup app1

Job {
Name = "Backup app1"
JobDefs = "DefaultJob"
Client = app1-fd
Pool = RemoteFile
FileSet="Apache DocumentRoot"
}

App2 Job:

jobs.conf — Backup app2

Job {
Name = "Backup app2"
JobDefs = "DefaultJob"
Client = app2-fd
Pool = RemoteFile
FileSet="Apache DocumentRoot"
}

Now we will set up the load balancer server backup job.

负载均衡服务器备份Job

作为负载均衡服务器备份任务,我们需要创建“Backup lb1”Job。注意使用之前指定的正确Client(lb1-fd)与FileSet(SSL Certs与HAProxy Config):

jobs.conf — Backup lb1

Job {
Name = "Backup lb1"
JobDefs = "DefaultJob"
Client = lb1-fd
Pool = RemoteFile
FileSet="SSL Certs and HAProxy Config"
}

保存并退出。

现在我们的备份Job已经配置完成,最后一步是重启Bacula Director。

重启Bacula Director

在备份服务器上重启Bacula Director以应用各项变更:

- sudo service bacula-director restart

现在,大家可能需要测试自己的客户端连接与备份任务,具体方式可参阅如何利用Bacula备份一台服务器。这份教程讲解了如何恢复Bacula备份。请注意,恢复MySQL数据库的具体方式可参阅执行备份恢复部分内容。

审查备份计划

我们可以修改Bacula Director配置(/etc/bacula/bacula-dir.conf)以调整Bacula备份计划。全部备份Job都将使用“DefaultJob”JobDef,其使用“WeeklyCycle”计划,具体定义为:

  • 每月第一个周日11:05pm进行完整备份
  • 其余各周日11:05pm进行差异备份
  • 周五到周六11:05pm进行增量备份

大家可以利用Bacula控制器检查Director状态进行验证,其应当输出全部预设任务:

Director Status — Scheduled Jobs

Scheduled Jobs:
Level          Type     Pri  Scheduled          Name               Volume
===================================================================================
Incremental    Backup    10  20-May-15 23:05    BackupLocalFiles   MyVolume
Incremental    Backup    10  20-May-15 23:05    Backup lb1         Remote-0002
Incremental    Backup    10  20-May-15 23:05    Backup app2        Remote-0002
Incremental    Backup    10  20-May-15 23:05    Backup app1        Remote-0002
Incremental    Backup    10  20-May-15 23:05    Backup db1         Remote-0002

大家可以随意调整备份任务中的预设内容。将应用服务器的备份与Percona XtraBackup脚本执行设定为同一时间(10:30pm)能够防止应用与数据库间的备份内容出现不一致冲突。

设置远程备份

现在大家已经可以设置一台远程服务器以存储全部Bacula备份副本。这台远程服务器应当处于不同地理区域,从而保证在生产数据中心遭遇自然灾害时业务仍然不受影响。在本示例中,我们将使用DigitalOcean的旧金山(SF01)服务区作为远程备份服务器。

我们还需要利用公共SSH密钥、rsync与cron将备份副本由备份服务器发送至远程备份服务器。

在远程服务器上创建一个用户,用于实现rsync登录。

接下来,在备份服务器上以root权限生成一条无密码SSH密钥对。将该公共密钥安装在此前创建的远程备份用户之上,具体请参阅如何设置SSH密钥一文。

在备份服务器上,通过rsync命令将Bacula备份数据(位于/bacula/backup)复制到远程备份服务器当中。具体参阅如何使用rsync。具体命令内容如下:

- rsync -az /bacula/backup remoteuser@remotebackups_public_hostname_or_IP:/path/to/remote/backup

将该命令添加至脚本当中,例如/usr/local/bin/rsync_backups.sh,并为其提供执行权限。

最后,我们还需要设置一个cron任务,负责以root权限在Bacula备份任务完成后运行该rsync_backups.sh脚本。具体请参阅如何利用cron设置日常任务一文。

到这里工作就全部完成了,大家可以等待一天并观察远程备份服务器上是否出现了备份副本。

其它注意事项

这里我们并没有谈到备份的磁盘需求。大家当然需要在设计备份方案时考虑磁盘空间资源,同时根据具体情况设定备份规划。

除了为应用服务器创建备份之后,大家可能还需要将其它服务器纳入备份计划。例如,大家应当配置Bacula以创建中央监控日志记录服务器备份。

总结

现在,大家应该已经拥有指向应用服务器的日常备份机制与远程备份副本了。请确保我们有能力对文件进行恢复,同时将数据恢复步骤添加到恢复计划当中。

在下一篇教程中,我们将了解如何对生产服务器设置进行监控:生产环境构建指南:Web应用——监控。

本文来源自DigitalOcean Community。英文原文:Building for Production: Web Applications — Backups By Mitchell Anicas

翻译:diradw

构建基于单文档MFC的对话框应用 开发者可能需要创建一些自定义控件以满足特定的用户界面需求。这些控件可以是带图标的按钮或者有特殊功能的面板等。自定义绘制:通过OnCtlColor消息来处理控件的自定义绘制。图标资源:使用资源编辑器来设计控件的图标,并在绘制过程中加载它们。消息映射:将自定义控件的消息与相应的处理函数关联。// 示例代码:自定义绘制控件// 设置静态控件的背景颜色和字体// 加载图标资源return hbr; 阅读详情

相关推荐

攻防世界-Reverse-Game

攻防世界,game,逆向

wuh2333的博客 777

轻量级web服务器nginx学习(4)———nginx的日志管理(日志切割及日志备份的实现)

文章目录1.nginx日志简介2.日志切割与日志备份 1.nginx日志简介 nginx的产生的相关的日志默认是在/usr/local/nginx/logs的目录里面。 日志文件的介绍 access.log:该日志文件是用来记录客户在访问该nginx时产生的每一个请求,格式可以自定义,通过访问日志就可以得到用户地域来源跳转来源,使用终端,某个URL访问等相关信息。 error.log:错...

llllyr的博客 277

高通引导文件获取全攻略:ELF/MBN提取与EDL救砖实战

在智能手机底层维护中,引导加载程序(Bootloader)是系统启动的第一道关卡。高通平台通过PBL、SBL1/XBL等阶段完成硬件初始化和安全校验,一旦引导分区损坏,设备便可能陷入黑砖状态。此时,掌握ELF与MBN格式的引导镜像获取方法,成为维修工程师和刷机用户的核心技能。通过官方固件包解包或借助EDL模式直接从设备分区备份,均能获得原厂匹配的引导文件。配合Firehose工具和9008端口通信,即可实现分区级读写与救砖恢复。本文从启动链路原理出发,对比两种获取路径的适用场景,并针对驱动识别、文件校验、分

weixin_30175731的博客 428

web操作日志丢失_脚本日志监控分析,解密跑批任务高效运维之道

众所周知:在运维工作中,脚本发挥着不可替代的作用!几乎没有任何一种复杂的操作系统,能够在不需要用户介入的情况下仍然正常稳定运行。作为系统管理员,运维人员经常需要定期执行特定的任务,以保障系统稳定运行。例如,分析磁盘用量并清理旧文件。将这些繁杂而重复的工作编写为脚本,通过定时任务实现调动执行,减少运维工作量,提升运维效率。运维工作中,常见跑批任务应用举例:系统巡检:检查业务程序的任务执行情...

weixin_39625008的博客 373

Python爬取天天基金网历史数据

前言 最近开始学习基金????,感觉需要收集一些数据统计分析才靠谱????毕竟给A股交学费的感觉可不好受???? 网上有很多公开的数据,我这里选择的是天天基金网进行爬取 页面分析 接口我分析过了,有些验证不太好获取数据,所以直接从html提取 在天天基金网中随便选择一款基金,然后点击进入历史数据页面 容易定位出日增长率的css选择器 还有翻页按钮 程序编写 使用selenium打开chrome浏览器进行爬取,全代码如下 from selenium import webdriver from sel

JiajunBernoulli的博客 2951

ARM系统控制和管理接口System Control and Management Interface

本文档描述了一个可扩展的独立于操作系统的软件接口,用于执行各种系统控制和管理任务,包括电源和性能管理。 本文档描述了系统控制和管理接口(SCMI),它是一组操作系统无关的软件接口,用于系统管理。

AI-安全-功耗 1913

服务器网站如何备份,web服务器如何备份数据

原标题:web服务器如何备份数据以下介绍具体方法:一、网站数据备份当然首先要有服务器的完全控制权限,另一台服务器的FTP空间的用户名和密码。在此假设要备份数据的服务器为:服务器一 备份到另一台服务器:服务器二首先在服务器一上建立backup.ftp文件(这里假设保存至C:\backup.ftp),文件内容如下:open 61.156.*.* //Your Ftp Server 你要备份到的服务器的...

weixin_42501704的博客 1077

世界职业院校技能大赛—人工智能赛道项目逐字稿参考十二

世界职业院校技能大赛—人工智能赛道项目逐字稿参考十二

我是网络安全兼技能大赛工程师,专注网络安全技术学习与技能大赛实战!持续分享最新的技术文章,帮你少走弯路,一起在技术赛道上进步~ 146

如何在生产环境中实施定期备份策略?

在软件开发中,尤其是涉及到数据库或文件系统操作的应用中,数据的安全性至关重要。一个有效的定期备份策略能够确保在发生意外情况(如硬件故障、数据损坏或恶意攻击)时,可以迅速恢复数据,减少业务中断的风险。下面我将从几个方面来讲解如何在生产环境中实施定期备份策略,以及提供一些代码示例。

程序员学习园地。 511

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

javaweb实现mysql备份功能_java实现web应用(备份还原数据库)

----------------------------------------------------->>>>>>>>原理:MySQL 数据库备份原理: Navicat等数据库界面软件通用的数据库备份原理就是直接调用MYSQL本身的系统命令。MySQL本身的系统命令:--opt –h localhost --user=root --passwo...

weixin_29476767的博客 334

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

MFC-对话框与数据交换

       对话框是非常重要的一种窗体,就我看过的应用,除了MDI程序,对话框比文档视图框架用得更多。原因大概有两个,首先对话框可以利用资源编辑器来编辑,这就有了一点快速开发的感觉,尽管比真正的快速开发弱得多;其次,对话框提供一种叫数据交换的方法,让控件与某种数据类型关联起来,比如Edit控件与CString变量关联,对CString变量的操作间接映射到Edit控件,这种方便性是不言而喻的。

colin 7260

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

MFC对话框开发:控件变量绑定与数据交换机制详解

在桌面应用开发中,对话框作为核心交互界面,其功能实现依赖于控件与后台数据的有效连接。MFC框架通过数据交换(DDX)和验证(DDV)机制,为控件与变量之间建立了双向数据绑定通道。这一机制的核心价值在于实现了界面与逻辑的分离,开发者可以通过值变量直接操作控件所代表的数据,同时利用控件变量动态管理界面状态。在实际工程中,这种模式广泛应用于表单数据采集、参数配置、用户输入验证等场景。本文聚焦于MFC对话框开发中的控件变量绑定,深入解析如何通过类向导为控件添加成员变量,并探讨DDX/DDV机制在数据流转与验证中的具

weixin_33674976的博客 403

MFC中对话框的数据交换(DDX)和数据…

DDX : dialog data exchange DDV : dialog data validation 文档描述MFC中的DDX DDV机制,如何使用DDX_和DDV_ 函数和定制自己的DDX_ ,DDV_函数; Dialog Data Exchange概要:对话框的数据交换不依赖于任何宏来实现,全部依赖于C++代码实现,唯一特别之处在于每一个对话框如果想处理自己的数据交互必须重载一个虚

Tiger Liu share his technical articles here 1447

MFC对话框控件变量绑定:从DDX/DDV原理到实战应用详解

在Windows桌面应用开发中,对话框数据交换(DDX)与数据验证(DDV)是实现用户界面与程序逻辑绑定的核心技术。DDX机制通过DoDataExchange函数在对话框控件与成员变量之间建立双向数据通道,而DDV则负责对输入数据进行有效性校验,确保数据完整性。这一技术体系的价值在于实现了UI与业务逻辑的解耦,提升了代码的可维护性和数据安全性。在MFC框架中,通过为控件添加值变量或控件变量,开发者可以便捷地操作界面元素,广泛应用于数据采集、表单验证、配置设置等交互场景。本文以登录对话框为例,深入解析了控件变

weixin_33888907的博客 450

windows第十章 数值型关联变量和控件型关联变量

DoDataExchange的作用是进行数据交换和验证,不需要手动调用,也不能手动调用,是由UpdateData调用的。上例OnInitDialog后也会调用,说明OnInitDialog应该是调用了UpdateData(FALSE)然后把radioButton减少到2个,第一个加了组长,才能用的BOOL,而且。radioButton,我使用BOOL类型会弹出错误提示,而用int就没限制。有些数值型关联变量要特定的类型,否则会报错。当我输入的数据不在范围内,就会出提示。可以看到类别选项是灰色的,点不开。

yerennuo的博客 846

MFC类与类之间的访问与调用(单文档应用程序+多文档应用程序)以及在一个对话框中获取另一个对话框的指针

在实际的应用中,经常需要在多个类之间交换数据,调用另一个类中的函数,框架提供一系列的函数用于多个类之间的交互 1.单文档应用程序的类与类之间的访问 (1)在所有类中获取App指针: CWin *pApp=AfxGetApp(); CXXXApp *pMyApp=(CXXXApp*)pApp; (2)所有类中获取CMainFrame类指针: CMainFrame *pFrame=(...

HW140701的博客 6535

如何在文档视图结构界面程序中弹出对话框并通过edit control控件传递数据

最近写一个MFC的界面程序,主界面一个基于单文档的视图结构,但是需要edit control传递一个数据值给一个变量,即需要手动设置一个参数。在基于对话框的界面中,要通过edit control控件传递一个数据给程序很简单。直接在工具箱中拖一个edit control控件到对话框界面上,再修改该控件的ID,并为其添加一个变量,注意选择所属的基类即可。 但是在基于单文档的界面中就不行了,因为在

JoliceYu的技术博客 1266

MFC中对话框的数据交换(DDX)和数据校验(DDV)

MFC中对话框的数据交换(DDX)和数据校验(DDV)DDX : dialog data exchangeDDV : dialog data validation文档描述MFC中的DDX DDV机制,如何使用DDX_和DDV_ 函数和定制自己的DDX_ ,DDV_函数;Dialog Data Exchange概要:对话框的数据交换不依赖于任何宏来实现,全部依赖于C++代码实现,唯一特别之处在于

永彦的专栏 7715

文档类程序各个类之间的相互访问关系

在实际的应用中,经常需要在多个类之间交换数据,调用另一个类中的函数,框架提供一系列的函数用于多个类之间的交互 1.MFC单文档应用程序的类与类之间的访问 (1)在所有类中获取App指针: CWin *pApp=AfxGetApp(); CXXXApp *pMyApp=(CXXXApp*)pApp; (2)所有类中获取CMainFrame类指针: CM

shaderdx的专栏 2461

对话框插入视图并显示文档数据

对话框插入视图

Jane_ybf的专栏 709
上一篇: 生产环境构建指南:Web应用——恢复规划
下一篇: 生产环境构建指南:Web应用——监控
普通网友
博客等级 码龄10年 769粉丝 269原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值