# Main模块
**本文引用的文件**
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp)
- [Global.cpp](file://cpp/Main/Global.cpp)
- [GeoMative.h](file://h/GeoMative.h)
- [DevManager.h](file://h/DevManager.h)
- [TdManager.h](file://h/TdManager.h)
- [ProManager.h](file://h/ProManager.h)
- [ExecManager.h](file://h/ExecManager.h)
## 目录
1. [引言](#引言)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
## 引言
本文件聚焦于GeomativeStudio项目的Main模块,系统性阐述CGeoMativeApp作为MFC应用程序主类的职责与实现,包括:
- 应用程序初始化流程(InitInstance)与生命周期管理(ExitInstance)
- 全局变量与全局函数的定义与作用域
- 各管理器(m_pDevManager、m_pProManager、m_pTdManager、m_pExecManager、m_pSptManager、m_pIOManager)的创建与依赖关系
- 通过AfxGetApp()全局函数访问应用程序实例并在不同模块间传递调用模式
## 项目结构
Main模块位于cpp/Main目录,包含两个关键文件:
- GeoMative.cpp:MFC应用主类CGeoMativeApp的实现,涵盖初始化、消息处理、退出清理等
- Global.cpp:全局变量、全局函数与跨模块共享的数据结构定义
```mermaid
graph TB
subgraph "Main模块"
A["GeoMative.cpp
CGeoMativeApp实现"]
B["Global.cpp
全局变量/函数"]
H["GeoMative.h
CGeoMativeApp声明"]
end
subgraph "管理器模块"
D["DevManager.h"]
T["TdManager.h"]
P["ProManager.h"]
E["ExecManager.h"]
end
A --> H
A --> D
A --> T
A --> P
A --> E
B --> A
```
图表来源
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L1-L120)
- [Global.cpp](file://cpp/Main/Global.cpp#L1-L60)
- [GeoMative.h](file://h/GeoMative.h#L115-L182)
- [DevManager.h](file://h/DevManager.h#L1-L69)
- [TdManager.h](file://h/TdManager.h#L1-L109)
- [ProManager.h](file://h/ProManager.h#L1-L77)
- [ExecManager.h](file://h/ExecManager.h#L1-L42)
章节来源
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L1-L120)
- [Global.cpp](file://cpp/Main/Global.cpp#L1-L60)
- [GeoMative.h](file://h/GeoMative.h#L115-L182)
## 核心组件
- CGeoMativeApp:MFC应用主类,负责应用初始化、主窗口创建、资源加载、全局对象创建、网络与数据库初始化、线程与定时器管理、退出清理等
- 全局变量与函数:集中定义跨模块使用的全局状态、工具函数、线程入口与回调等
- 管理器集合:设备、项目、测试数据、执行、脚本、IO等管理器,由CGeoMativeApp统一创建与协调
章节来源
- [GeoMative.h](file://h/GeoMative.h#L115-L182)
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L139-L210)
- [Global.cpp](file://cpp/Main/Global.cpp#L20-L70)
## 架构总览
CGeoMativeApp作为应用入口,承担以下职责:
- 初始化MFC环境、OLE、控件容器、3D控件支持
- 设置工作目录、创建缓存目录、加载主框架窗口
- 建立数据库连接(ADO/ADOX)、初始化日志、诊断信息、跨孔配置
- 创建各管理器实例并注入数据库连接
- 读取配置(config.ini)、语言切换、用户登录、网络连接与心跳
- 启动扫描线程、系统时间线程、定时器
- 在退出时释放所有资源与线程
```mermaid
classDiagram
class CGeoMativeApp {
+InitInstance() bool
+ExitInstance() int
+PreTranslateMessage(pMsg) bool
+OnFileExit() void
+OnHelpAbout() void
+GetDBPasswordInfo() void
+GetPasswordPtr(map) void
+GetDevPassword(name, info) void
+OnCfgTerrain() void
+GetCfgUrl() bool
+Get2dDataExpStyle() int
-InitalDiagnosisInfo() void
-SetDBAttributeUpdateInfo() void
-ProcConPtrCloseExpect() void
-ParserSigCrossHole(index) bool
-GeCrossHoleCfg() bool
+m_pDevManager : CDevManager*
+m_pProManager : CProManager*
+m_pTdManager : CTdManager*
+m_pExecManager : CExecManager*
+m_pSptManager : CSptManager*
+m_pIOManager : CIOManager*
+m_pConnection : _ConnectionPtr
+m_pCatalog : _CatalogPtr
+m_NetWorkOper : CNetWorkOper
+m_uiUserID : UINT32
+m_ucIsMultiChannel : EN_CHANNEL_INFO
+m_mapCrossHole : map
}
class CDevManager
class CProManager
class CTdManager
class CExecManager
class CSptManager
class CIOManager
CGeoMativeApp --> CDevManager : "创建并持有"
CGeoMativeApp --> CProManager : "创建并持有"
CGeoMativeApp --> CTdManager : "创建并持有"
CGeoMativeApp --> CExecManager : "创建并持有"
CGeoMativeApp --> CSptManager : "创建并持有"
CGeoMativeApp --> CIOManager : "创建并持有"
```
图表来源
- [GeoMative.h](file://h/GeoMative.h#L115-L182)
- [DevManager.h](file://h/DevManager.h#L1-L69)
- [TdManager.h](file://h/TdManager.h#L1-L109)
- [ProManager.h](file://h/ProManager.h#L1-L77)
- [ExecManager.h](file://h/ExecManager.h#L1-L42)
## 详细组件分析
### CGeoMativeApp类与生命周期管理
- 构造与析构
- 构造函数初始化各管理器指针为空,清理计数器与路径等成员
- 析构函数负责释放数据库连接、主窗口、各管理器实例、菜单/加速键资源、COM/临界区等
- 初始化(InitInstance)
- OLE初始化、控件容器启用、3D控件支持
- 设置注册表键、设置当前工作目录、创建CACHE目录结构
- 加载主框架窗口、显示最大化、初始化COM、清空跨孔配置映射
- 建立数据库连接(ADO/ADOX),设置锁数量上限
- 初始化网络(WSAStartup)、日志、诊断信息、跨孔配置
- 密码验证(数据库密码、几何密码)、系统时间线程、数据库升级
- 创建各管理器实例(Dev/Pro/Td/Exec/Spt/IO),读取config.ini配置(传输方式、用户ID、多通道、语言、时区等)
- 在线模式:登录对话框、心跳定时器、网络连接、设备通知注册、工作线程启动
- 离线/USB模式:设备扫描线程、设备链接初始化、MAC地址生成、扫描线程
- 资源清理与菜单刷新
- 退出(ExitInstance)
- 注销网络回调、释放主窗口、管理器、关闭数据库连接、释放ADO/ADOX、停止扫描线程、反初始化COM、删除临界区、调用基类退出
```mermaid
sequenceDiagram
participant App as "CGeoMativeApp"
participant Frame as "主框架窗口"
participant DB as "数据库(ADO/ADOX)"
participant Net as "网络(CNetWorkOper)"
participant Th as "线程(扫描/系统时间)"
App->>App : 构造函数初始化
App->>App : InitInstance()
App->>App : OLE/控件容器初始化
App->>Frame : 创建并加载主框架
App->>App : 设置工作目录/CACHE目录
App->>DB : 建立连接/设置锁上限
App->>App : 日志/诊断/跨孔配置初始化
App->>App : 密码验证/系统时间线程
App->>App : 数据库升级
App->>App : 创建管理器实例
App->>App : 读取config.ini/语言切换
alt 在线模式
App->>Net : 初始化/连接/心跳/注册通知
else 离线/USB模式
App->>Th : 启动扫描线程
end
App-->>Frame : 显示并更新窗口
App->>App : ExitInstance()
App->>Th : 释放线程/临界区/COM
App->>DB : 关闭连接/释放ADO/ADOX
App->>Frame : 释放主窗口
App-->>App : 返回基类ExitInstance
```
图表来源
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L139-L210)
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L211-L420)
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L421-L642)
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L644-L737)
章节来源
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L139-L210)
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L211-L420)
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L421-L642)
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L644-L737)
### 全局变量与全局函数的作用
- 全局变量
- 系统语言、UI偏移、传输模式、UI语言、系统时间、扫描标志、MAC地址、设备序列号、PLC/设备ID、时区、在线传输开关、任务状态、时间戳等
- 设备链接表(aDevLinkTable[256])、扫描临界区(g_ScanTabSection)、系统时间(g_sysCurTime)
- 全局函数
- 列表排序比较函数(ListStrCompare、SptListStrCompare)
- 消息泵辅助(DoEvent)
- 延迟与事件循环(TransDelay)
- 字符串处理(SplitterString、StatStringCount、GetSubStringInHeadAndTail)
- 数学与信号处理(多项式拟合、积分、二分法求根)
- 状态文本与编码转换(GetGRStatus、GetGrCodeText、U2G/G2U)
- 时间转换(Tm2GmtStr/Tm2LocalStr、Str2GmtTm/Str2LocalTm)
- 网络序转换(tcp_htonf/tcp_ntohf)
- 在线任务状态文本(OnLineLocalTaskState/OnLineTask)
- 测试失败原因文本(GetTestFailedReason)
- 设备枚举(DeviceEnumCommPort)
- 扫描线程入口(DevLinkScanThreadFunction)
- 系统时间线程入口(GetSysTimeFunction)
- 错误钩子(CBTHookProc)
这些全局变量与函数贯穿于设备扫描、网络通信、UI交互、数据处理等模块,确保模块间共享状态与工具能力。
章节来源
- [Global.cpp](file://cpp/Main/Global.cpp#L20-L120)
- [Global.cpp](file://cpp/Main/Global.cpp#L120-L320)
- [Global.cpp](file://cpp/Main/Global.cpp#L320-L600)
- [Global.cpp](file://cpp/Main/Global.cpp#L600-L1000)
- [Global.cpp](file://cpp/Main/Global.cpp#L1000-L1539)
### 管理器创建与依赖关系
- 管理器创建顺序与注入
- 数据库连接(m_pConnection)与目录(m_pCatalog)在InitInstance中建立
- 管理器构造函数均接收_connection指针,确保所有管理器共享同一数据库上下文
- 管理器职责概览
- CDevManager:设备发现、在线/离线设备管理、远程设备集合维护
- CProManager:工程/测区管理、DMS树构建与同步、默认测区创建
- CTdManager:测试数据导入/导出、在线同步、2D/3D转换
- CExecManager:测试执行流程控制(2D/CE电阻率测试)
- CSptManager:脚本管理(2D/3D/CE)
- CIOManager:IO与外部接口(含数据库与Catalog)
- 依赖关系
- CGeoMativeApp持有各管理器指针,负责创建与销毁
- 各管理器内部持有_connection指针,避免重复连接
- 网络层(CNetWorkOper)与扫描线程(DevLinkScanThreadFunction)通过CGeoMativeApp间接协作
```mermaid
flowchart TD
Start(["InitInstance入口"]) --> DBInit["建立数据库连接
ADO/ADOX"]
DBInit --> CreateMgrs["创建管理器实例
Dev/Pro/Td/Exec/Spt/IO"]
CreateMgrs --> ConfigRead["读取config.ini
传输方式/用户ID/语言/时区"]
ConfigRead --> OnlineCheck{"在线模式?"}
OnlineCheck --> |是| NetInit["网络初始化/连接/心跳/注册"]
OnlineCheck --> |否| ScanThread["启动扫描线程"]
NetInit --> SysTime["启动系统时间线程"]
ScanThread --> SysTime
SysTime --> Done(["初始化完成"])
```
图表来源
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L421-L642)
- [DevManager.h](file://h/DevManager.h#L1-L69)
- [ProManager.h](file://h/ProManager.h#L1-L77)
- [TdManager.h](file://h/TdManager.h#L1-L109)
- [ExecManager.h](file://h/ExecManager.h#L1-L42)
章节来源
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L421-L642)
- [DevManager.h](file://h/DevManager.h#L1-L69)
- [ProManager.h](file://h/ProManager.h#L1-L77)
- [TdManager.h](file://h/TdManager.h#L1-L109)
- [ExecManager.h](file://h/ExecManager.h#L1-L42)
### AfxGetApp()的应用与模块间调用模式
- theApp全局实例
- Global.cpp中声明并定义CGeoMativeApp theApp,供全工程使用
- 各模块通过extern声明theApp,从而在任意位置访问CGeoMativeApp实例
- AfxGetApp()调用模式
- 在扫描线程入口DevLinkScanThreadFunction中,通过AfxGetApp()->GetMainWnd()向主窗口发送WM_NEWLINK/WM_DETECT_LINE消息
- 在线任务状态文本函数OnLineLocalTaskState/OnLineTask中,根据UI语言选择中文或英文提示
- 调用链示意
```mermaid
sequenceDiagram
participant Thread as "扫描线程"
participant App as "CGeoMativeApp"
participant MainWnd as "主窗口"
participant Handlers as "消息处理器"
Thread->>App : AfxGetApp()
App-->>Thread : 返回theApp实例
Thread->>App : GetMainWnd()
App-->>Thread : 返回主窗口指针
Thread->>MainWnd : SendMessage(WM_NEWLINK/WM_DETECT_LINE)
MainWnd->>Handlers : 分发消息并处理
```
图表来源
- [Global.cpp](file://cpp/Main/Global.cpp#L1000-L1166)
- [Global.cpp](file://cpp/Main/Global.cpp#L20-L30)
章节来源
- [Global.cpp](file://cpp/Main/Global.cpp#L20-L30)
- [Global.cpp](file://cpp/Main/Global.cpp#L1000-L1166)
## 依赖关系分析
- 组件耦合
- CGeoMativeApp与各管理器之间为“聚合”关系,通过指针持有,便于解耦与独立扩展
- 管理器之间无直接依赖,通过CGeoMativeApp协调,降低环状依赖风险
- 外部依赖
- 数据库:ADO/ADOX连接与事务
- 网络:CNetWorkOper封装的网络操作与线程
- 系统服务:COM初始化/反初始化、线程与临界区、文件系统(CACHE目录)
- 潜在循环依赖
- 通过全局theApp与AfxGetApp()访问主类,避免了管理器对主类的直接包含,降低循环依赖概率
```mermaid
graph LR
App["CGeoMativeApp"] --> DevMgr["CDevManager"]
App --> ProMgr["CProManager"]
App --> TdMgr["CTdManager"]
App --> ExecMgr["CExecManager"]
App --> SptMgr["CSptManager"]
App --> IOMgr["CIOManager"]
App --> Net["CNetWorkOper"]
App --> DB["ADO/ADOX 连接"]
```
图表来源
- [GeoMative.h](file://h/GeoMative.h#L115-L182)
- [DevManager.h](file://h/DevManager.h#L1-L69)
- [ProManager.h](file://h/ProManager.h#L1-L77)
- [TdManager.h](file://h/TdManager.h#L1-L109)
- [ExecManager.h](file://h/ExecManager.h#L1-L42)
章节来源
- [GeoMative.h](file://h/GeoMative.h#L115-L182)
- [DevManager.h](file://h/DevManager.h#L1-L69)
- [ProManager.h](file://h/ProManager.h#L1-L77)
- [TdManager.h](file://h/TdManager.h#L1-L109)
- [ExecManager.h](file://h/ExecManager.h#L1-L42)
## 性能考量
- 数据库连接与锁
- 初始化时设置最大锁数量,避免高并发下的锁竞争
- 线程与临界区
- 设备扫描线程与系统时间线程分离,扫描线程使用临界区保护共享表
- 网络与心跳
- 在线模式下启用心跳定时器与网络工作线程,需注意线程安全与异常恢复
- 文件系统
- 启动阶段创建CACHE目录与子目录,避免运行期频繁创建导致的性能抖动
[本节为通用指导,无需具体文件分析]
## 故障排查指南
- 数据库连接失败
- 现象:InitInstance中捕获_com_error并提示连接失败
- 排查:确认ACCDB路径、密码、Jet OLEDB驱动安装情况
- 网络初始化失败
- 现象:WSAStartup失败或网络连接失败
- 排查:检查IP/端口配置、防火墙、网络连通性
- 扫描线程创建失败
- 现象:创建扫描线程失败或无法发现设备
- 排查:检查传输模式、USB/GD设备状态、权限与驱动
- 退出异常
- 现象:ExitInstance中关闭连接抛出异常
- 排查:查看错误钩子与日志,确保线程安全关闭与资源释放顺序
章节来源
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L293-L310)
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L311-L320)
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L578-L622)
- [GeoMative.cpp](file://cpp/Main/GeoMative.cpp#L644-L737)
- [Global.cpp](file://cpp/Main/Global.cpp#L1168-L1181)
## 结论
CGeoMativeApp作为GeomativeStudio的主入口,承担了完整的应用生命周期管理职责。通过清晰的初始化流程、严格的资源管理与模块化设计,实现了数据库、网络、设备扫描、UI交互等功能的有序协同。全局变量与函数为跨模块共享提供了基础,而theApp/AfxGetApp()的使用模式确保了模块间松耦合与可维护性。建议在后续演进中持续关注线程安全、异常恢复与性能优化,以提升整体稳定性与用户体验。