# 技术栈与依赖
**本文档引用的文件**
- [GeoMative.vcxproj](file://GeoMative.vcxproj)
- [config.ini](file://config.ini)
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
- [Markup.h](file://h/Markup.h)
- [Markup.cpp](file://cpp/Tools/Markup.cpp)
- [wke.h](file://cpp/miniblink/wke.h)
- [wkeBrowser.cpp](file://cpp/miniblink/wkeBrowser.cpp)
- [test.cpp](file://cpp/miniblink/test.cpp)
- [msado15.tlh](file://Release/msado15.tlh)
- [msadox.tlh](file://Release/msadox.tlh)
- [ChildFrm.h](file://h/ChildFrm.h)
- [ChildView.h](file://h/ChildView.h)
## 目录
1. [项目概述](#项目概述)
2. [MFC框架在UI构建中的作用](#mfc框架在ui构建中的作用)
3. [ADO技术在Access数据库访问中的实现方式](#ado技术在access数据库访问中的实现方式)
4. [CMarkup库在XML文件处理中的应用](#cmarkup库在xml文件处理中的应用)
5. [miniblink嵌入式浏览器组件的集成方法](#miniblink嵌入式浏览器组件的集成方法)
6. [项目构建配置分析](#项目构建配置分析)
7. [技术组件版本兼容性与集成方式](#技术组件版本兼容性与集成方式)
8. [总结](#总结)
## 项目概述
GeomativeStudio项目是一个基于Windows平台的桌面应用程序,采用Visual Studio 2015开发环境构建。项目主要技术栈包括MFC(Microsoft Foundation Classes)框架用于UI构建、ADO(ActiveX Data Objects)技术用于Access数据库访问、CMarkup库用于XML文件处理,以及miniblink嵌入式浏览器组件用于集成Web功能。项目通过GeoMative.vcxproj文件定义了详细的编译器设置和依赖项,确保了跨平台兼容性和功能完整性。
## MFC框架在UI构建中的作用
MFC框架在GeomativeStudio项目中扮演着核心角色,负责整个应用程序的用户界面构建和管理。从项目结构可以看出,UI相关的代码主要分布在`cpp/Views`和`h/`目录下,包含了大量的对话框、视图和框架类。
项目通过MFC的文档/视图架构实现了复杂的数据管理和界面展示。`ChildFrm.h`和`ChildView.h`文件定义了MDI(多文档界面)子窗口框架和视图类,这是MFC典型的UI构建模式。`ChildFrame`类继承自`CMDIChildWnd`,作为子窗口的容器,而`CChildView`类继承自`CWnd`,负责具体的界面绘制和用户交互。
```mermaid
classDiagram
class CMDIChildWnd {
+PreCreateWindow()
+OnCmdMsg()
}
class CChildFrame {
+m_wndView CChildView
+PreCreateWindow()
+OnCmdMsg()
}
class CWnd {
+PreCreateWindow()
+OnPaint()
}
class CChildView {
+OnPaint()
}
CMDIChildWnd <|-- CChildFrame : "继承"
CWnd <|-- CChildView : "继承"
CChildFrame --> CChildView : "包含"
```
**Diagram sources**
- [ChildFrm.h](file://h/ChildFrm.h)
- [ChildView.h](file://h/ChildView.h)
MFC框架通过消息映射机制处理用户交互,如按钮点击、菜单选择等事件。项目中的大量对话框类(如`DailLogin.h`、`MainFrm.h`等)都使用了MFC的对话框模板和控件,实现了丰富的用户界面功能。MFC的静态链接方式(`UseOfMfc>Static`)确保了应用程序的独立性,无需在目标机器上安装MFC运行库。
**Section sources**
- [ChildFrm.h](file://h/ChildFrm.h)
- [ChildView.h](file://h/ChildView.h)
## ADO技术在Access数据库访问中的实现方式
GeomativeStudio项目使用ADO技术实现对Access数据库的访问,主要通过`IOManager.cpp`文件中的代码实现。项目支持Access 2007数据库文件(*.accdb),并使用Microsoft.ACE.OLEDB.12.0提供程序进行连接。
在`IOManager.cpp`文件中,可以看到数据库连接的实现代码:
```cpp
_ConnectionPtr pImpConnection = NULL;
CString szConnection = _T("");
szConnection.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=%s;Jet OLEDB:Database Password=bsgeomative;", szFileName);
pImpConnection.CreateInstance(_uuidof(Connection));
pImpConnection->Open(szConnection.AllocSysString(), "", "", adModeUnknown);
```
项目通过`msado15.tlh`和`msadox.tlh`文件生成了ADO的类型库头文件,这些文件在编译时自动生成,提供了对ADO对象的C++封装。`msado15.tlh`文件定义了`Connection15_Deprecated`接口,包含了ConnectionString、CommandTimeout、Version等属性,以及Open、Close等方法。
```mermaid
classDiagram
class Connection15_Deprecated {
+ConnectionString string
+CommandTimeout int
+ConnectionTimeout int
+Version string
+Errors ErrorsPtr
+DefaultDatabase string
+IsolationLevel IsolationLevelEnum
+Attributes int
+CursorLocation CursorLocationEnum
+Mode ConnectModeEnum
+Provider string
+State int
+Open()
+Close()
}
class Recordset {
+Open()
+Close()
+GetFields()
}
Connection15_Deprecated --> Recordset : "执行查询"
```
**Diagram sources**
- [msado15.tlh](file://Release/msado15.tlh)
- [msadox.tlh](file://Release/msadox.tlh)
数据库连接字符串中包含了数据库密码(`Jet OLEDB:Database Password=bsgeomative;`),这表明项目使用了加密的Access数据库,增强了数据安全性。项目还通过`pRecDBVersion.CreateInstance(_uuidof(Recordset))`创建记录集对象,用于执行SQL查询和数据操作。
**Section sources**
- [IOManager.cpp](file://cpp/Managers/IOManager.cpp)
- [msado15.tlh](file://Release/msado15.tlh)
## CMarkup库在XML文件处理中的应用
CMarkup库在GeomativeStudio项目中用于处理XML文件,主要功能包括XML文件的读取、解析、修改和保存。项目中的`Markup.h`和`Markup.cpp`文件是CMarkup库的核心实现。
`Markup.h`文件定义了`CMarkup`类,提供了丰富的XML操作接口:
- `Load()`方法用于从文件加载XML文档
- `SetDoc()`方法用于设置XML文档内容
- `FindElem()`和`FindChildElem()`方法用于查找元素
- `GetData()`和`GetChildData()`方法用于获取元素数据
- `GetAttrib()`和`GetChildAttrib()`方法用于获取属性值
- `Save()`方法用于保存XML文档
```mermaid
classDiagram
class CMarkup {
+Load()
+SetDoc()
+IsWellFormed()
+FindElem()
+FindChildElem()
+IntoElem()
+OutOfElem()
+ResetChildPos()
+ResetMainPos()
+ResetPos()
+GetTagName()
+GetChildTagName()
+GetData()
+GetChildData()
+GetElemContent()
+GetAttrib()
+GetChildAttrib()
+GetNthAttrib()
+GetAttribName()
+FindNode()
+GetNodeType()
+SavePos()
+RestorePos()
+SetMapSize()
+GetError()
+GetResult()
+GetDocFlags()
}
class FilePos {
+FileOpen()
+FileSpecifyEncoding()
+FileReadText()
+FileClose()
}
CMarkup --> FilePos : "文件操作"
```
**Diagram sources**
- [Markup.h](file://h/Markup.h)
- [Markup.cpp](file://cpp/Tools/Markup.cpp)
`Markup.cpp`文件中的`ReadTextFile()`和`WriteTextFile()`方法实现了XML文件的读写功能,支持多种字符编码。项目通过`MCD_FSEEK`、`MCD_FTELL`等宏定义处理文件指针操作,确保了跨平台兼容性。CMarkup库的使用简化了XML文件的处理,提高了代码的可维护性和可读性。
**Section sources**
- [Markup.h](file://h/Markup.h)
- [Markup.cpp](file://cpp/Tools/Markup.cpp)
## miniblink嵌入式浏览器组件的集成方法
miniblink嵌入式浏览器组件在GeomativeStudio项目中用于集成Web功能,主要通过`cpp/miniblink`目录下的文件实现。`wke.h`是miniblink的核心头文件,定义了WebView、String、Point、Rect等基本类型和接口。
`wkeBrowser.cpp`文件中的代码展示了miniblink的初始化和使用:
```cpp
wkeSetTransparent(g_webView, false);
wkeOnTitleChanged(g_webView, onTitleChanged, NULL);
wkeOnURLChanged(g_webView, onURLChanged, NULL);
wkeOnNavigation(g_webView, onNavigation, NULL);
wkeOnCreateView(g_webView, onBrowserCreateView, NULL);
wkeOnPaintUpdated(g_webView, onPaintUpdatedCallback, NULL);
wkeOnConsole(g_webView, onConsoleMessage, NULL);
wkeSetUserAgent(g_webView, "Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.2228.0 Safari/537.36");
wkeLoadURL(g_webView, "http://github.com/weolar/miniblink49");
```
```mermaid
classDiagram
class wkeWebView {
+loadURL()
+loadHTML()
+loadFile()
+resize()
+paint()
+fireMouseEvent()
+fireMouseWheelEvent()
+fireKeyDownEvent()
+runJS()
+globalExec()
}
class wkeClientHandler {
+onTitleChanged()
+onURLChanged()
+onNavigation()
+onCreateView()
+onPaintUpdated()
+onConsole()
}
class wkeSettings {
+proxy wkeProxy
+mask unsigned int
+extension const char*
}
class wkeWindowCreateInfo {
+parent HWND
+style DWORD
+styleEx DWORD
+x int
+y int
+width int
+height int
+color COLORREF
}
wkeWebView --> wkeClientHandler : "事件回调"
wkeWebView --> wkeSettings : "配置"
wkeWebView --> wkeWindowCreateInfo : "窗口创建"
```
**Diagram sources**
- [wke.h](file://cpp/miniblink/wke.h)
- [wkeBrowser.cpp](file://cpp/miniblink/wkeBrowser.cpp)
`test.cpp`文件中的`onLoadUrlBegin()`和`onLoadUrlEnd()`回调函数实现了URL请求的拦截和处理,支持本地资源的加载和网络请求的hook。miniblink的集成使得项目能够显示Web内容、执行JavaScript代码,并与Web页面进行交互,扩展了应用程序的功能。
**Section sources**
- [wke.h](file://cpp/miniblink/wke.h)
- [wkeBrowser.cpp](file://cpp/miniblink/wkeBrowser.cpp)
- [test.cpp](file://cpp/miniblink/test.cpp)
## 项目构建配置分析
GeomativeStudio项目的构建配置在`GeoMative.vcxproj`文件中定义,使用Visual Studio 2015(平台工具集v142)进行编译。项目支持Debug和Release两种配置,输出目录分别为`./Debug/`和`./Release/`。
```xml
Application
v142
Static
MultiByte
```
项目使用静态链接MFC(`UseOfMfc>Static`),这意味着MFC库被直接编译到可执行文件中,无需在目标机器上安装MFC运行库。字符集设置为多字节(`CharacterSet>MultiByte`),支持中文等非Unicode字符。
```xml
MultiThreadedDebugDLL
Disabled
Level3
./h/;./;./atlmfc/include;%(AdditionalIncludeDirectories)
NDEBUG;_WIN32_WINNT=0x0601;WINVER=0x0601;WIN32;_WINDOWS;_AFXDLL;%(PreprocessorDefinitions)
./lib/;./atlmfc/lib;%(AdditionalLibraryDirectories)
version.lib;imagehlp.lib;Setupapi.lib;Shlwapi.lib;strmiids.lib;ws2_32.lib;%(AdditionalDependencies)
```
项目依赖多个Windows系统库,包括`version.lib`、`imagehlp.lib`、`Setupapi.lib`、`Shlwapi.lib`、`strmiids.lib`和`ws2_32.lib`。这些库提供了版本信息、图像处理、设备安装、字符串处理、流媒体和网络通信等功能。`AdditionalIncludeDirectories`和`AdditionalLibraryDirectories`指定了头文件和库文件的搜索路径,确保编译器能够找到所需的头文件和库文件。
**Section sources**
- [GeoMative.vcxproj](file://GeoMative.vcxproj)
## 技术组件版本兼容性与集成方式
GeomativeStudio项目的技术组件具有良好的版本兼容性和集成性。MFC框架使用Visual Studio 2015的静态链接版本,确保了在Windows 7及以上版本的兼容性。ADO技术使用Microsoft.ACE.OLEDB.12.0提供程序,支持Access 2007及更高版本的数据库文件。
CMarkup库是一个轻量级的XML处理库,不依赖特定的编译器或操作系统,具有良好的跨平台兼容性。miniblink嵌入式浏览器组件基于WebKit内核,支持现代Web标准,能够在Windows平台上稳定运行。
各技术组件通过清晰的接口和模块化设计进行集成。MFC框架负责UI构建和事件处理,ADO技术负责数据库访问,CMarkup库负责XML文件处理,miniblink组件负责Web功能集成。这些组件通过C++类和函数调用进行交互,形成了一个功能完整、结构清晰的应用程序。
项目通过`config.ini`文件进行配置管理,支持语言、URL、数据导出样式、在线设备信息等设置。这种配置方式使得应用程序具有良好的可配置性和可维护性。
**Section sources**
- [config.ini](file://config.ini)
- [GeoMative.vcxproj](file://GeoMative.vcxproj)
## 总结
GeomativeStudio项目采用了一套成熟的技术栈,包括MFC框架、ADO技术、CMarkup库和miniblink嵌入式浏览器组件。这些技术组件各司其职,协同工作,实现了复杂的数据管理、用户界面和Web功能。项目构建配置合理,确保了跨平台兼容性和功能完整性。通过模块化设计和清晰的接口,各技术组件能够高效集成,为开发者提供了良好的开发体验和维护便利。