# API参考 **本文档引用的文件** - [DevManager.h](file://h\DevManager.h) - [DevManager.cpp](file://cpp\Managers\DevManager.cpp) - [ProManager.h](file://h\ProManager.h) - [ProManager.cpp](file://cpp\Managers\ProManager.cpp) - [SptManager.h](file://h\SptManager.h) - [SptManager.cpp](file://cpp\Managers\SptManager.cpp) - [TdManager.h](file://h\TdManager.h) - [TdManager.cpp](file://cpp\Managers\TdManager.cpp) - [IOManager.h](file://h\IOManager.h) - [IOManager.cpp](file://cpp\Managers\IOManager.cpp) ## 目录 1. [简介](#简介) 2. [DevManager API](#devmanager-api) 3. [ProManager API](#promanager-api) 4. [SptManager API](#sptmanager-api) 5. [TdManager API](#tdmanager-api) 6. [IOManager API](#iomanager-api) 7. [API调用链与依赖关系](#api调用链与依赖关系) 8. [线程安全性说明](#线程安全性说明) 9. [使用示例](#使用示例) ## 简介 本文档为Geomative Studio软件系统中的核心管理器类提供详细的API参考。文档涵盖DevManager、ProManager、SptManager、TdManager和IOManager五个核心管理器类的公共接口,详细说明了各方法的签名、参数、返回值、异常情况以及使用场景。同时,文档解释了API的调用顺序、线程安全性,并提供了实际代码示例,为集成开发和自动化脚本提供了必要的技术参考。 ## DevManager API DevManager类负责管理设备的生命周期,包括设备的添加、删除、查询和状态更新。该管理器维护设备在内存中的链接列表,并处理与数据库的交互。 ### 公共方法 #### GetDeviceByID 根据设备ID获取设备对象。 **方法签名** ```cpp CDevice* GetDeviceByID(DWORD dwDevID) ``` **参数** - `dwDevID`: 设备的唯一标识符 **返回值** - 成功时返回指向CDevice对象的指针,失败时返回NULL **异常情况** - 无显式异常抛出,但会通过调试输出记录操作日志 **使用场景** - 当需要根据设备ID查找特定设备时使用 **Section sources** - [DevManager.h](file://h\DevManager.h#L21) - [DevManager.cpp](file://cpp\Managers\DevManager.cpp#L48-L68) #### GetDevice 根据设备句柄获取设备对象。 **方法签名** ```cpp CDevice* GetDevice(DWORD dwHandle) ``` **参数** - `dwHandle`: 设备的句柄 **返回值** - 成功时返回指向CDevice对象的指针,失败时返回NULL **异常情况** - 无显式异常抛出 **使用场景** - 在设备操作过程中,通过句柄快速获取设备对象 **Section sources** - [DevManager.h](file://h\DevManager.h#L22) - [DevManager.cpp](file://cpp\Managers\DevManager.cpp#L82-L89) #### AddDevice 向系统中添加新设备。 **方法签名** ```cpp BOOL AddDevice(CDevice* const pDev) ``` **参数** - `pDev`: 指向要添加的设备对象的常量指针 **返回值** - 成功时返回TRUE,失败时返回FALSE **异常情况** - 在数据库事务处理中捕获_com_error异常,并显示错误消息 - 操作失败时会回滚数据库事务 **使用场景** - 当检测到新设备并需要将其注册到系统中时使用 **Section sources** - [DevManager.h](file://h\DevManager.h#L30) - [DevManager.cpp](file://cpp\Managers\DevManager.cpp#L203-L280) #### DeleteDevice 从系统中删除设备。 **方法签名** ```cpp BOOL DeleteDevice(DWORD dwHandle) ``` **参数** - `dwHandle`: 要删除设备的句柄 **返回值** - 成功时返回TRUE,失败时返回FALSE **异常情况** - 捕获所有异常,操作失败时回滚数据库事务 **使用场景** - 当设备被移除或不再需要时,从系统中彻底删除设备 **Section sources** - [DevManager.h](file://h\DevManager.h#L37) - [DevManager.cpp](file://cpp\Managers\DevManager.cpp#L383-L432) #### InitialDevLinkList 初始化设备链接列表。 **方法签名** ```cpp void InitialDevLinkList() ``` **参数** - 无 **返回值** - 无 **异常情况** - 无显式异常处理 **使用场景** - 在系统启动或设备管理器初始化时,重新加载所有设备到内存中 **Section sources** - [DevManager.h](file://h\DevManager.h#L29) - [DevManager.cpp](file://cpp\Managers\DevManager.cpp#L160-L201) #### UpdateDevInfo 更新设备信息。 **方法签名** ```cpp void UpdateDevInfo(STSynDevParam stDevParam, BYTE bRemoteDeveTyp) ``` **参数** - `stDevParam`: 包含设备参数的结构体 - `bRemoteDeveTyp`: 远程设备类型 **返回值** - 无 **异常情况** - 捕获_com_error异常并显示错误信息 **使用场景** - 当从设备接收到同步参数时,更新数据库中的设备信息 **Section sources** - [DevManager.h](file://h\DevManager.h#L39) - [DevManager.cpp](file://cpp\Managers\DevManager.cpp#L592-L641) ## ProManager API ProManager类负责管理项目(Project)和测区(Testing Zone)的层次结构,处理项目与设备之间的同步。 ### 公共方法 #### CreateProjectInDB 在数据库中创建新项目。 **方法签名** ```cpp UINT CreateProjectInDB(DWORD& dwID) ``` **参数** - `dwID`: 输出参数,返回创建项目的ID **返回值** - APP_SUCCESS: 创建成功 - APP_CANCLE: 用户取消操作 - APP_FAIL: 创建失败 **异常情况** - 在数据库操作中捕获_com_error异常,显示适当的错误消息并回滚事务 **使用场景** - 当用户通过UI创建新项目时,此方法处理数据库层面的创建逻辑 **Section sources** - [ProManager.h](file://h\ProManager.h#L51) - [ProManager.cpp](file://cpp\Managers\ProManager.cpp#L249-L316) #### CreateProjectInDev 在设备中创建项目。 **方法签名** ```cpp UINT CreateProjectInDev(DWORD dwID, CDevice* const pDev) ``` **参数** - `dwID`: 项目的数据库ID - `pDev`: 指向目标设备的常量指针 **返回值** - APP_SUCCESS: 创建成功 - APP_DUPLICATE: 项目已存在 - APP_FAIL: 创建失败 - APP_OVERFLOW: 项目数量超出限制 **异常情况** - 处理文件传输失败的情况,删除已创建的项目以保持一致性 **使用场景** - 当项目在数据库中创建后,需要将项目同步到指定设备时使用 **Section sources** - [ProManager.h](file://h\ProManager.h#L50) - [ProManager.cpp](file://cpp\Managers\ProManager.cpp#L343-L482) #### CreateDefaultTzInDev 在设备中为项目创建默认测区。 **方法签名** ```cpp UINT CreateDefaultTzInDev(DWORD dwProID, CDevice* const pDev) ``` **参数** - `dwProID`: 项目的ID - `pDev`: 指向目标设备的常量指针 **返回值** - APP_SUCCESS: 创建成功 - APP_DUPLICATE: 测区已存在 - APP_FAIL: 创建失败 **异常情况** - 在数据库操作中捕获_com_error异常,操作失败时回滚事务 **使用场景** - 当项目在设备中创建后,自动创建默认测区以确保项目结构完整性 **Section sources** - [ProManager.h](file://h\ProManager.h#L60) - [ProManager.cpp](file://cpp\Managers\ProManager.cpp#L485-L706) #### ShowProList 显示设备关联的项目列表。 **方法签名** ```cpp bool ShowProList(DWORD dwDevHandle, CListCtrl& proList) ``` **参数** - `dwDevHandle`: 设备句柄 - `proList`: 引用CListCtrl控件,用于显示项目列表 **返回值** - 操作成功返回true,失败返回false **异常情况** - 无显式异常处理 **使用场景** - 在UI中显示特定设备关联的所有项目列表 **Section sources** - [ProManager.h](file://h\ProManager.h#L56) - [ProManager.cpp](file://cpp\Managers\ProManager.cpp#L184-L246) #### ShowTzList 显示项目关联的测区列表。 **方法签名** ```cpp bool ShowTzList(DWORD dwProHandle, CListCtrl& tzList) ``` **参数** - `dwProHandle`: 项目句柄 - `tzList`: 引用CListCtrl控件,用于显示测区列表 **返回值** - 操作成功返回true,失败返回false **异常情况** - 无显式异常处理 **使用场景** - 在UI中显示特定项目下的所有测区列表 **Section sources** - [ProManager.h](file://h\ProManager.h#L58) - [ProManager.cpp](file://cpp\Managers\ProManager.cpp#L53-L92) #### DeleteProjectInDB 从数据库中删除项目。 **方法签名** ```cpp void DeleteProjectInDB(DWORD dwID) ``` **参数** - `dwID`: 要删除项目的ID **返回值** - 无 **异常情况** - 无显式异常处理 **使用场景** - 当需要从数据库中永久删除项目及其相关数据时使用 **Section sources** - [ProManager.h](file://h\ProManager.h#L48) - [ProManager.cpp](file://cpp\Managers\ProManager.cpp#L485-L706) ## SptManager API SptManager类负责管理脚本(Script)的创建、删除和同步,支持1D、2D和3D测量脚本。 ### 公共方法 #### CreateCESConInDB 在数据库中创建1D脚本。 **方法签名** ```cpp UINT CreateCESConInDB(DWORD& dwSConID) ``` **参数** - `dwSConID`: 输出参数,返回创建脚本的ID **返回值** - APP_SUCCESS: 创建成功 - APP_CANCLE: 用户取消操作 - APP_FAIL: 创建失败 **异常情况** - 在数据库操作中捕获_com_error异常,操作失败时回滚事务 **使用场景** - 当用户创建新的1D测量脚本时,此方法处理数据库存储 **Section sources** - [SptManager.h](file://h\SptManager.h#L41) - [SptManager.cpp](file://cpp\Managers\SptManager.cpp#L548-L795) #### Create2DSConInDB 在数据库中创建2D脚本。 **方法签名** ```cpp UINT Create2DSConInDB(DWORD& dwSConID) ``` **参数** - `dwSConID`: 输出参数,返回创建脚本的ID **返回值** - APP_SUCCESS: 创建成功 - APP_CANCLE: 用户取消操作 - APP_FAIL: 创建失败 **异常情况** - 在数据库操作中捕获_com_error异常,操作失败时回滚事务 **使用场景** - 当用户创建新的2D测量脚本时,此方法处理数据库存储 **Section sources** - [SptManager.h](file://h\SptManager.h#L44) - [SptManager.cpp](file://cpp\Managers\SptManager.cpp#L257-L486) #### PutScriptToDev 将脚本下传至设备。 **方法签名** ```cpp UINT PutScriptToDev(DWORD dwSCID, CDevice* const pDev) ``` **参数** - `dwSCID`: 脚本的数据库ID - `pDev`: 指向目标设备的常量指针 **返回值** - APP_SUCCESS: 传输成功 - APP_DUPLICATE: 脚本已存在 - APP_FAIL: 传输失败 **异常情况** - 处理文件传输失败的情况,删除设备上已创建的脚本以保持一致性 **使用场景** - 当需要将数据库中的脚本同步到测量设备时使用 **Section sources** - [SptManager.h](file://h\SptManager.h#L34) - [SptManager.cpp](file://cpp\Managers\SptManager.cpp#L257-L486) #### LoadScriptFromDev 从设备加载脚本。 **方法签名** ```cpp UINT LoadScriptFromDev(CString szSptFileName, CDevice* const pDev) ``` **参数** - `szSptFileName`: 脚本文件名 - `pDev`: 指向源设备的常量指针 **返回值** - APP_SUCCESS: 加载成功 - APP_FAIL: 加载失败 **异常情况** - 无显式异常处理 **使用场景** - 当需要从设备上载脚本到数据库时使用 **Section sources** - [SptManager.h](file://h\SptManager.h#L33) - [SptManager.cpp](file://cpp\Managers\SptManager.cpp#L257-L486) #### GetScript 获取脚本对象。 **方法签名** ```cpp CScript* GetScript(DWORD dwHandle) ``` **参数** - `dwHandle`: 脚本句柄 **返回值** - 成功时返回指向CScript对象的指针,失败时返回NULL **异常情况** - 无显式异常抛出 **使用场景** - 在脚本操作过程中,通过句柄获取脚本对象进行操作 **Section sources** - [SptManager.h](file://h\SptManager.h#L38) - [SptManager.cpp](file://cpp\Managers\SptManager.cpp#L127-L156) #### Delete2DSConInDB 从数据库中删除2D脚本。 **方法签名** ```cpp void Delete2DSConInDB(DWORD dwSConID) ``` **参数** - `dwSConID`: 要删除脚本的ID **返回值** - 无 **异常情况** - 无显式异常处理 **使用场景** - 当需要从数据库中永久删除2D脚本时使用 **Section sources** - [SptManager.h](file://h\SptManager.h#L45) - [SptManager.cpp](file://cpp\Managers\SptManager.cpp#L505-L546) ## TdManager API TdManager类负责管理测试数据(Testing Data)的导入、导出和显示,处理不同类型的测量数据。 ### 公共方法 #### ShowTdListByTz 根据测区显示测试数据列表。 **方法签名** ```cpp bool ShowTdListByTz(DWORD dwTzHandle, CListCtrl& tdList) ``` **参数** - `dwTzHandle`: 测区句柄 - `tdList`: 引用CListCtrl控件,用于显示测试数据列表 **返回值** - 操作成功返回true,失败返回false **异常情况** - 捕获_com_error异常并显示错误消息 **使用场景** - 在UI中显示特定测区下的所有测试数据列表 **Section sources** - [TdManager.h](file://h\TdManager.h#L84) - [TdManager.cpp](file://cpp\Managers\TdManager.cpp#L409-L682) #### ShowTdListByProject 根据项目显示测试数据列表。 **方法签名** ```cpp bool ShowTdListByProject(DWORD dwProHandle, CListCtrl& tdList) ``` **参数** - `dwProHandle`: 项目句柄 - `tdList`: 引用CListCtrl控件,用于显示测试数据列表 **返回值** - 操作成功返回true,失败返回false **异常情况** - 捕获_com_error异常并显示错误消息 **使用场景** - 在UI中显示特定项目下的所有测试数据列表 **Section sources** - [TdManager.h](file://h\TdManager.h#L89) - [TdManager.cpp](file://cpp\Managers\TdManager.cpp#L81-L406) #### Upload2DTdFromDev 从设备上载2D测试数据。 **方法签名** ```cpp BOOL Upload2DTdFromDev(CString szPrCN, CString szTzCN, CString szTdCN, CString strSubTdCN, CDevice* const pDev) ``` **参数** - `szPrCN`: 项目编号 - `szTzCN`: 测区编号 - `szTdCN`: 测试数据编号 - `strSubTdCN`: 子任务编号列表 - `pDev`: 指向源设备的常量指针 **返回值** - 成功返回TRUE,失败返回FALSE **异常情况** - 无显式异常处理 **使用场景** - 当需要从设备上载2D测量数据到数据库时使用 **Section sources** - [TdManager.h](file://h\TdManager.h#L57) - [TdManager.cpp](file://cpp\Managers\TdManager.cpp#L81-L406) #### Import2DTdConToDB 将2D数据导入数据库。 **方法签名** ```cpp BOOL Import2DTdConToDB(DWORD dwTdID, CString szDatFile, CDevice* const pDev, int* pTSN=NULL) ``` **参数** - `dwTdID`: 测试数据ID - `szDatFile`: DAT文件路径 - `pDev`: 指向设备的常量指针 - `pTSN`: 可选参数,指定起始测点号 **返回值** - 成功返回TRUE,失败返回FALSE **异常情况** - 无显式异常处理 **使用场景** - 当需要将设备上的2D测量结果导入数据库进行存储和分析时使用 **Section sources** - [TdManager.h](file://h\TdManager.h#L47) - [TdManager.cpp](file://cpp\Managers\TdManager.cpp#L81-L406) #### DeleteRsp2DTd 删除2D电阻率数据。 **方法签名** ```cpp void DeleteRsp2DTd(DWORD dwID) ``` **参数** - `dwID`: 要删除数据的ID **返回值** - 无 **异常情况** - 无显式异常处理 **使用场景** - 当需要从系统中删除2D电阻率测量数据时使用 **Section sources** - [TdManager.h](file://h\TdManager.h#L79) - [TdManager.cpp](file://cpp\Managers\TdManager.cpp#L81-L406) #### GetTestingData 获取测试数据对象。 **方法签名** ```cpp CTestingData* GetTestingData(DWORD dwHandle) ``` **参数** - `dwHandle`: 测试数据句柄 **返回值** - 成功时返回指向CTestingData对象的指针,失败时返回NULL **异常情况** - 无显式异常抛出 **使用场景** - 在测试数据操作过程中,通过句柄获取数据对象进行操作 **Section sources** - [TdManager.h](file://h\TdManager.h#L82) - [TdManager.cpp](file://cpp\Managers\TdManager.cpp#L81-L406) ## IOManager API IOManager类负责数据的导入和导出功能,支持将项目数据导出为Access数据库文件,以及从外部文件导入数据。 ### 公共方法 #### Export 导出数据到外部文件。 **方法签名** ```cpp UINT Export() ``` **参数** - 无 **返回值** - APP_SUCCESS: 导出成功 - APP_CANCLE: 用户取消操作 - APP_FAIL: 导出失败 **异常情况** - 在数据库操作中捕获_com_error异常,操作失败时回滚事务并删除临时文件 **使用场景** - 当用户需要将项目数据导出为外部文件进行备份或共享时使用 **Section sources** - [IOManager.h](file://h\IOManager.h#L20) - [IOManager.cpp](file://cpp\Managers\IOManager.cpp#L35-L98) #### Import 从外部文件导入数据。 **方法签名** ```cpp UINT Import() ``` **参数** - 无 **返回值** - APP_SUCCESS: 导入成功 - APP_CANCLE: 用户取消操作或文件错误 - APP_FAIL: 导入失败 **异常情况** - 捕获_com_error异常处理数据库连接错误 - 验证导入文件的版本兼容性 **使用场景** - 当用户需要从外部文件导入项目数据时使用 **Section sources** - [IOManager.h](file://h\IOManager.h#L19) - [IOManager.cpp](file://cpp\Managers\IOManager.cpp#L101-L203) #### CreateExpDatabase 创建导出数据库。 **方法签名** ```cpp _ConnectionPtr CreateExpDatabase(CString szFileName) ``` **参数** - `szFileName`: 导出文件的路径和名称 **返回值** - 成功时返回指向_ConnectionPtr的指针,失败时返回NULL **异常情况** - 无显式异常处理 **使用场景** - 在导出操作中,创建新的Access数据库文件作为导出目标 **Section sources** - [IOManager.h](file://h\IOManager.h#L45) - [IOManager.cpp](file://cpp\Managers\IOManager.cpp#L206-L655) ## API调用链与依赖关系 各管理器类之间存在明确的调用链和依赖关系,形成了完整的数据管理流程。 ### 设备-项目-脚本-数据调用链 ```mermaid graph TD A[DevManager] --> |管理| B[设备] B --> |关联| C[ProManager] C --> |管理| D[项目] D --> |包含| E[测区] E --> |关联| F[SptManager] F --> |管理| G[脚本] G --> |执行| H[TdManager] H --> |管理| I[测试数据] I --> |存储| J[IOManager] J --> |导出/导入| K[外部文件] ``` **Diagram sources** - [DevManager.h](file://h\DevManager.h) - [ProManager.h](file://h\ProManager.h) - [SptManager.h](file://h\SptManager.h) - [TdManager.h](file://h\TdManager.h) - [IOManager.h](file://h\IOManager.h) ### 核心依赖关系 1. **DevManager → ProManager**: 设备管理器为项目管理器提供设备信息,项目同步需要设备连接 2. **ProManager → SptManager**: 项目管理器在创建项目时可能需要调用脚本管理器创建默认脚本 3. **SptManager → TdManager**: 脚本管理器在执行测量任务时生成测试数据,由测试数据管理器管理 4. **TdManager → IOManager**: 测试数据管理器依赖IO管理器实现数据的导入导出功能 ### 初始化依赖 系统启动时,各管理器按特定顺序初始化: 1. DevManager首先初始化,建立设备连接 2. ProManager其次初始化,加载项目结构 3. SptManager随后初始化,准备脚本管理 4. TdManager最后初始化,准备数据管理 5. IOManager在需要时初始化,处理数据交换 ## 线程安全性说明 ### DevManager - **线程安全性**: 非线程安全 - **说明**: DevManager的公共方法未实现线程同步机制。在多线程环境中使用时,需要外部同步控制,避免多个线程同时访问同一设备对象。 ### ProManager - **线程安全性**: 部分线程安全 - **说明**: 数据库操作使用事务保护,但在UI交互部分(如对话框显示)存在潜在的线程安全问题。建议在主线程中调用UI相关方法。 ### SptManager - **线程安全性**: 非线程安全 - **说明**: 脚本创建和管理操作未实现线程同步。特别是Create2DSConInDB和CreateCESConInDB方法涉及复杂的UI交互和数据库操作,应在单线程环境中使用。 ### TdManager - **线程安全性**: 部分线程安全 - **说明**: 数据库操作使用事务保护,但文件操作和UI更新部分存在线程安全风险。ShowTdListByTz等显示方法应在UI线程中调用。 ### IOManager - **线程安全性**: 非线程安全 - **说明**: 导入导出操作涉及文件系统和数据库的复杂交互,未实现线程同步。应避免在多线程环境中同时执行多个导入导出操作。 ### 通用线程使用建议 1. **UI相关操作**: 所有涉及UI显示的方法(如ShowProList、ShowTzList)必须在主线程中调用 2. **数据库操作**: 虽然使用事务保护,但建议对同一管理器实例的操作进行同步 3. **设备通信**: 与设备的通信操作应序列化执行,避免多个线程同时访问同一设备 4. **数据一致性**: 在多线程环境中,应使用锁机制保护共享数据,确保数据一致性 ## 使用示例 ### 创建新项目并同步到设备 ```cpp // 1. 创建项目 DWORD dwProjectID; UINT result = theApp.m_pProManager->CreateProjectInDB(dwProjectID); if (result == APP_SUCCESS) { // 2. 获取目标设备 CDevice* pDevice = theApp.m_pDevManager->GetDeviceByID(deviceID); if (pDevice != NULL) { // 3. 在设备中创建项目 result = theApp.m_pProManager->CreateProjectInDev(dwProjectID, pDevice); if (result == APP_SUCCESS) { // 4. 在设备中创建默认测区 result = theApp.m_pProManager->CreateDefaultTzInDev(dwProjectID, pDevice); if (result == APP_SUCCESS) { // 项目创建和同步完成 } } } } ``` ### 创建2D测量脚本并上传到设备 ```cpp // 1. 创建2D脚本 DWORD dwScriptID; UINT result = theApp.m_pSptManager->Create2DSConInDB(dwScriptID); if (result == APP_SUCCESS) { // 2. 获取目标设备 CDevice* pDevice = theApp.m_pDevManager->GetDeviceByID(deviceID); if (pDevice != NULL) { // 3. 将脚本上传到设备 result = theApp.m_pSptManager->PutScriptToDev(dwScriptID, pDevice); if (result == APP_SUCCESS) { // 脚本创建和上传完成 } } } ``` ### 从设备上载2D测量数据 ```cpp // 1. 获取设备 CDevice* pDevice = theApp.m_pDevManager->GetDeviceByID(deviceID); if (pDevice != NULL) { // 2. 从设备上载2D数据 BOOL success = theApp.m_pTdManager->Upload2DTdFromDev( projectCN, zoneCN, dataCN, _T(""), pDevice); if (success) { // 3. 数据导入数据库 DWORD dwTdID = theApp.m_pTdManager->ImportTdHeadToDB( zoneID, headFileName, pDevice); if (dwTdID != 0) { // 4. 导入详细数据 theApp.m_pTdManager->Import2DTdConToDB( dwTdID, datFileName, pDevice); } } } ``` ### 导出项目数据 ```cpp // 1. 创建IOManager实例 CIOManager ioManager(theApp.m_pConnection, theApp.m_pCatalog); // 2. 执行导出操作 UINT result = ioManager.Export(); if (result == APP_SUCCESS) { // 导出成功 } else if (result == APP_CANCLE) { // 用户取消 } else { // 导出失败 } ``` ### 显示项目下的测区列表 ```cpp // 1. 获取项目句柄 DWORD dwProHandle = m_handleProcessor.GenerateHandle(projectID, PZ_STYLE_PRO); // 2. 获取列表控件 CListCtrl& tzList = m_dlg.m_tzList; // 3. 显示测区列表 bool success = theApp.m_pProManager->ShowTzList(dwProHandle, tzList); if (success) { // 列表显示成功 } ```