307 lines
13 KiB
Markdown
307 lines
13 KiB
Markdown
# 技术栈与依赖
|
||
|
||
<cite>
|
||
**本文档引用的文件**
|
||
- [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)
|
||
</cite>
|
||
|
||
## 目录
|
||
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</UseOfMfc>`)确保了应用程序的独立性,无需在目标机器上安装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
|
||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||
<ConfigurationType>Application</ConfigurationType>
|
||
<PlatformToolset>v142</PlatformToolset>
|
||
<UseOfMfc>Static</UseOfMfc>
|
||
<CharacterSet>MultiByte</CharacterSet>
|
||
</PropertyGroup>
|
||
```
|
||
|
||
项目使用静态链接MFC(`UseOfMfc>Static</UseOfMfc>`),这意味着MFC库被直接编译到可执行文件中,无需在目标机器上安装MFC运行库。字符集设置为多字节(`CharacterSet>MultiByte</CharacterSet>`),支持中文等非Unicode字符。
|
||
|
||
```xml
|
||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||
<ClCompile>
|
||
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
|
||
<Optimization>Disabled</Optimization>
|
||
<WarningLevel>Level3</WarningLevel>
|
||
<AdditionalIncludeDirectories>./h/;./;./atlmfc/include;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
|
||
<PreprocessorDefinitions>NDEBUG;_WIN32_WINNT=0x0601;WINVER=0x0601;WIN32;_WINDOWS;_AFXDLL;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||
</ClCompile>
|
||
<Link>
|
||
<AdditionalLibraryDirectories>./lib/;./atlmfc/lib;%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
|
||
<AdditionalDependencies>version.lib;imagehlp.lib;Setupapi.lib;Shlwapi.lib;strmiids.lib;ws2_32.lib;%(AdditionalDependencies)</AdditionalDependencies>
|
||
</Link>
|
||
</ItemDefinitionGroup>
|
||
```
|
||
|
||
项目依赖多个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功能。项目构建配置合理,确保了跨平台兼容性和功能完整性。通过模块化设计和清晰的接口,各技术组件能够高效集成,为开发者提供了良好的开发体验和维护便利。 |