`
qimo601
  • 浏览: 3446466 次
  • 性别: Icon_minigender_1
  • 来自: 苏州
社区版块
存档分类
最新评论

VC项目配置基础 (VC6.0 和VC2005)

阅读更多

 

转载:http://blog.csdn.net/jwcoffee/article/details/5826981

一.预处理宏

1. 通用宏

VC6.0 中:

Project Setting à C/C++ à Preprocessor definitions

VC2005 

项目属性 à 配置属性 à C/C++ à 预处理器定义

 

WIN32 :指明是 Window 32 位系统的编译器,一般用作平台识别。

_MBCS/_UNICODE :指明该工程使用的字符集(多字节字符集 /UNICODE )。

 VC6.0  “Project Setting à C/C++ à Project Options” 处将会有 /D "_MBCS"  /D "_UNICODE" 开关。

 VC2005   项目属性 à 配置属性 à 常规 à 项目默认值 à 字符集  中选择  使用多字节字符集   使用 Unicode 字符集  ;在  项目属性 à 配置属性 à C/C++ à 使用 UNICODE 响应文件  中选择       。在  项目属性 à 配置属性 à C/C++ à 命令行 ” 处将会有 /D "_MBCS"  /D "_UNICODE" /D "UNICODE" 开关。

当项目中的文件具有 UNICODE 路径(例如中文路径)时,应在  项目属性 à C/C++ à 常规    项目属性à 链接器 à 常规  中开启  使用 UNICODE 响应文件  开关。

_CONSOLE/_WINDOWS :指明应用程序的类型(控制台程序 /Windows 窗口应用程序)。

_DEBUG/NDEBUG :指明编译版本( Debug/Release )。

除此之外, VC 不同的项目类型,有一些特定的宏,以在编译器区分项目类型。

2. 特定宏

 1  Win32 Static Library 项目

VC6.0 中:

Project Setting à C/C++  Category  General  à Preprocessor definitions  _LIB

如果选择了 MFC Support  _WINDOWS,_AFXDLL

VC2005 

项目属性 à 常规 à 配置类型 à 静态库 (.lib)

项目属性 à C/C++ à 预处理器 à 预处理器定义: _LIB

 2  Win32 Dynamic-Link Library 项目

VC6.0 中:

Project Setting à C/C++ à Preprocessor definitions  _WINDOWS,_USRDLL,DLL_EXPORTS

VC2005 

项目属性 à 常规 à 配置类型 à 动态库 (.dll)

项目属性 à C/C++ à 预处理器 à 预处理器定义: _WINDOWS;_USRDLL;DLL_EXPORTS

 3  MFC DLL 项目

<1>Regular DLL with MFC statically linked (带静态链接 MFC 的规则 DLL 

VC6.0 中:

Project Setting à C/C++ à Preprocessor definitions  _WINDOWS,_WINDLL,_USRDLL

VC2005 

项目属性 à C/C++ à 预处理器 à 预处理器定义: _WINDOWS;_USRDLL

<2>Regular DLL using shared MFC DLL (使用共享 MFC DLL 的规则 DLL 

VC6.0 中:

Project Setting à C/C++ à Preprocessor definitions  _WINDOWS,_WINDLL,_AFXDLL , _USRDLL

VC2005 

项目属性 à C/C++ à 预处理器 à 预处理器定义: _WINDOWS;_USRDLL

<3>MFC Extension DLL  using shared MFC DLL )( MFC 扩展 DLL 

VC6.0 中:

Project Setting à C/C++ à Preprocessor definitions  _WINDOWS,_WINDLL,_AFXDLL,_USRDLL

VC2005 

项目属性 à C/C++ à 预处理器 à 预处理器定义: _WINDOWS; _AFXEXT

 DLL 项目中, _USRDLL 宏表示生成 Export Lib 

 

关于 VC 编译器预处理宏,参考:

 Predefined Macros  VC6.0  

 C/C++ Preprocessor Reference-Predefined Macros  VC8.0 )》

 What’s the difference between the WIN32 and _WIN32 defines in C++ 

 

二.工作目录和控制台程序运行参数

VC6.0 中:

“Project Setting à Debug à Working directory” 处填写 exe 程序的工作目录。

 “Project Setting à Debug à Program argument” 处填写 main 运行参数。

VC2005 

  项目属性 à 配置属性 à 调试 à 工作目录  处填写 exe 程序的工作目录。

  项目属性 à 配置属性 à 调试 à 命令参数  处填写 main 运行参数。

 

默认的工作目录为 ProjectDir ,即 *.dsw/*.vcproj 所在目录。

通过编译器启动( Ctrl + F5 )应用程序时,可以将所依赖的 lib  dll 库文件所在目录设为工作目录。应用程序执行期间,创建、保存文件将在工作目录中。

工作目录是指当前目录, GetCurrentDirectory() 得到的路径; SetCurrentDirectory 来改变。

运行目录是指 exe 所在路径,可通过 GetModuleFileName() 得到。

 

三.附加头文件包含

VC6.0 中:

VC6.0 默认 include 包含路径: Tools à Options à Directories à Include files 

对于特定项目的头文件包含,在 “Project Setting à C/C++  Category  Preprocessor  àAdditional include directories” 处添加附加头文件目录,相对目录参考 *.dsp 文件。

目录路径不需添加双引号,路径分隔符为 ’/’  ’/’ ,不必考虑反斜杠 ’/’ 的转义。多个路径之间以逗号 分隔。

相应的在 “Project Setting à C/C++ à Project Options” 中将会出现 “/I” 的包含命令。

VC2005 

VC2005 默认 include 包含路径:工具 à 选项 à 项目和解决方案 à VC++ 目录 à 包含文件。

对于特定项目的头文件包含,在  项目属性 à 配置属性 à C/C++ à 常规 à 附加包含目录  处添加附加包含目录,相对目录参考 *.vcproj 文件。

目录路径不需添加双引号,路径分隔符为 ’/’  ’/’ ,不必考虑反斜杠 ’/’ 的转义。多个路径之间以分号 分隔。

相应的在  项目属性 à 配置属性 à C/C++ à 命令行 ” 中将会出现 /I ” 的包含命令。

关于 #include 的两种包含方式

#include   <std*.h> 为编译器指定的包含路径下的头文件: 即在 VC6.0 中的 “Tools à Options àDirectories à Include files” (对应 VC2005   工具 à 选项 à 项目和解决方案 à VC++ 目录 à包含文件  )处指定的包含目录。默认情况下包括

 1  $(VCInstallDir)include  /Microsoft Visual Studio /VC98/INCLUDE 

 2  $(VCInstallDir)atlmfc/include  /Microsoft Visual Studio /VC98/ATL/INCLUDE /Microsoft Visual Studio /VC98/MFC/INCLUDE 

 3  $(VCInstallDir)PlatformSDK/include  VC2005 )。

用户也可以自己添加包含路径到此。

对于 “Tools à Options à Directories à Include files”   工具 à 选项 à 项目和解决方案à VC++ 目录 à 包含文件  )目录下的文件的包含,一般可使用尖括号包含。系统对尖括号的包含优先到编译器设置的包含路径下定位,再到附加包含目录下进行定位。

#include "MyHeader.h" 为在 “Tools à Options à Directories à Include files”   工具à 选项 à 项目和解决方案 à VC++ 目录 à 包含文件  )处人工添加的 包含路径下的头文件或者 附加包含目录下的头文件。

对于编译器提供的标准库函数头文件( “Tools à Options à Directories à Include files”   工具 à 选项 à 项目和解决方案 à VC++ 目录 à 包含文件  )),一般使用尖括号进行包含声明,当然使用双引号包含也没有错。

对于在 “Tools à Options à Directories à Include files”   工具 à 选项 à 项目和解决方案 à VC++ 目录 à 包含文件  )处人工添加的 包含路径和附加包含目录下的头文件的包含可以使用尖括号进行包含,但一般使用双引号。

原则上,对于工程或文件可见的包含目录下的头文件包含,使用以上两种包含方式中的任一种都不会出错,主要是它们在搜索目录时的顺序不一样。习惯上使用尖括号包含 标准库函数头文件,使用双引号包含用户自定义头文件。建议除标准 SDK (如 DirectX 等),一般针对具体工程使用附加头文件包含即可,尽量不要去动编译器的 “Tools àOptions à Directories à Include files” (对应 VC2005   工具 à 选项 à 项目和解决方案 àVC++ 目录 à 包含文件  )作编译器级全局配置。下面的链接库包含处理同此。

External Dependencies 里面显示的是你的工程要用到的头文件,不在你的工程里面,而且也不在 VC 的默认包含路径中。参考:《 VC6.0 External Dependencies 》。

 

四.附加链接库包含

VC6.0 中:

VC6.0 默认 lib 包含路径: Tools à Options à Directories à Library files

对于特定项目的头文件包含,可以通过以下两步添加附加链接库:

1.  “Project Setting à Link  Category  Input  à Additional library path” 处添加附加库目录,相对目录参考 *.dsp 文件。

目录路径不需添加双引号,路径分隔符为 ’/’  ’/’ ,不必考虑反斜杠 ’/’ 的转义。多个路径之间以逗号 分隔。

相应的将会在 “Project Setting à Link à Project Options” 处同步 /libpath ” 库包含命令。

2.  “Project Setting à Link  Category  General  à Object/Library Modules” 处添加库文件名 YourLib.lib  也可在文件中使用 #pragma comment(lib, "YourLib.lib" ) 显式 导入所依赖的静态库),多个库之间以空格 分隔。

相应的将会在 “Project Setting à Link à Project Options” 处同步包含的库名称。

VC2005 

VC2005 默认 lib 包含路径:工具 à 选项 à 项目和解决方案 à VC++ 目录 à 库文件

对于特定项目的库文件包含,可以通过以下两种方式添加附加库目录:

1.

 1 )在  项目属性 à 配置属性 à 链接器 à 常规 à 附加库目录  处输入附加库目录路径,相对目录参考*.vcproj 文件。

目录路径不需添加双引号,路径分隔符为 ’/’  ’/’ ,不必考虑反斜杠 ’/’ 的转义。多个路径之间以分号 分隔。

相应的将会在  项目属性 à 配置属性 à 链接器 à 命令行  处同步 “/LIBPATH” 库包含命令。

 2 )在  项目属性 à 配置属性 à 链接器 à 输入 à 附加依赖项 ” 处添加库文件名 YourLib.lib  也可在文件中使用 #pragma comment(lib, "YourLib.lib") 显式 导入所依赖的静态库),多个库之间以空格 分隔。

相应的将会在  项目属性 à 配置属性 à 链接器 à 命令行  处同步包含的库名称。

2.

  项目属性 à 配置属性 à 链接器 à 命令行 ” 处添加库文件名 YourLib.lib  必要时添加相对目录,保证 YourLib 的可见性)。

 

五.生成文件目录设置

VC6.0 中:

 “Project Setting à General à Output directories”  “Output files” 处填写 *.exe *.lib/*.dll 的生成目录,相应在 “Project Setting à Link (或 Library  à Output file name” 处将会同步文件输出路径。相对目录参考 *.dsp 文件。

 “Project Setting à General à Output directories”  “Intermediate files” 处填写中间文件生成目录。相对目录参考 *.dsp 文件。

VC2005 

  项目属性 à 常规 à 输出目录  处填写输出目录,在  项目属性 à 常规 à 中间目录  处填写中间目录,相对目录参考 *.vcproj 文件。

  项目属性 à 链接器(或管理员) à 常规 à 输出文件  处填写输出文件路径。

输出目录( OutDir )一般为 $(SolutionDir)$(ConfigurationName)

输出文件( OutputFile )一般为 $(OutDir)/$(ProjectName).exe  *.lib  *.dll 

说明 

$(SolutionDir)  *.sln 文件所在文件夹,尾带 ‘/’ 

$(ProjectDir)  *.vcproj 文件所在文件夹,尾带 ‘/’ 

$(ConfigurationName)  *.sln  *.vcproj 文件所在文件夹下的 debug  release 文件夹,参考*.vcproj 文件中的 <Configurations> 配置项。

具体在  项目属性 à 配置属性 à 调试 à 命令  下拉点击  编辑  ,展开   (M )>>” ,可以看到很多项目内置宏。

一般的配置为:

输出目录  OutDir ): $(ProjectDir)$(PlatformName)/$(ConfigurationName)

中间目录  IntDir ): $(OutDir)/Intermediate

输出文件  $(OutDir)/$(ProjectName).lib(dll  exe)

 

六.关于相对目录

相对目录是相对某个文件而言的,例如在 VC 项目属性配置附加包含目录、附加库目录则是相对 *.dsp *.vcproj 文件而言的;在某个 *.c  *.cpp 文件中使用 #include 包含命令,是相对这个 *.c  *.cpp 文件而言的。

当前目录是可见的,一般直接引用文件名(夹),对于子文件夹可以添加 ”./” 

.. :父目录

../include :父目录下的 include 目录

../.. :祖父目录

../../include :祖父目录下的 include 目录

 

七.依赖项目联编

一个解决方案 (dsw  sln) 可以创建很多辅助子项目 (dsp  vcproj) ,如何设置使在编译主项目的时,先编译所依赖的辅助项目呢?

一般会配置辅助子项目的 OutDir 和主项目相同,这样生成的 lib  dll 对于主项目 exe 直接可见。

VC6.0 中:

选择菜单 “Project à Dependencies” 可以选择需要联编的项目。

VC2005 

在解决方案资源管理器中右击项目名称,选择  引用    项目依赖项  菜单,可选择项目依赖项,并可以设置依赖顺序。

 

八.附加DLL 调试

VC6.0 中:

如果你需要调试的 DLL 是动态装入( LoadLibrary )的,则需要在 “Project Setting à Debug Category  Additional DLLs   处添加这个 DLL 文件。

 

九.导出makefile

VC6.0 中选择菜单 “Project à Export Makefile” 即可导出 Makefile 文件 *.mak 

VC6 以后不再支持 makefile 输出了。

参考:《 VC MAKE文件语法 》,《 vs6 IDE导出的 makefile使 》,《 教你在 VS2005MakeFile 

 

十.代码的编辑与阅读导航

Visual Studio 本身就带有充分的代码组织、编辑、分析以及阅读能力的支持。

VC6.0  VC2005 中的 “Edit à Find in Files” 支持指定项目、工程或文件内的关键字搜索。

VC6.0  “Tools à Source Browser” ,提供对 “Definitions and References”  “File Outline”  “Base Classes and Members”  “Derived Classes and Members”  “Call Graph” “Callers Graph” 等导航功能支持。

VC2005 右键快捷菜单中支持  查找所有引用  ;右键快捷菜单中的  调用浏览器  支持函数调用关系图和被调用关系图的查看。  类视图设置  中支持显示  基类型    派生类型    继承成员  等功能。

此外,在阅读代码时,我们可以使用书签( Bookmark )来设置锚点,这样就可以实现基于书签的自定义索引导航。

下面介绍常用的编程辅助插件软件及源代码层次结构分析工具软件。

1. Visual Assist X 是一款非常好的 Microsoft Visual Studio 辅助插件,支持 C/C ++, C #,ASP  Visual Basic  Java  HTML 等语言,能自动识别各种关键字、系统函数、成员变量、自动给出输入提示、自动更正大小写错误、自动标示错误等,有助于提高开发过程的自动化和开发效率。

2  Windows 下的 Source Insight 是一个面向项目开发的程序编辑器和代码导航浏览器, 它还能显示reference trees  class inheritancediagrams  call trees 。相应的 Linux 下阅读源代码的利器Source Navigator 能很好地解决文件定位和跳转问题。

3  Rational Rose 是利用 UML (统一建模语言)进行分析和设计面向对象软件系统的强大的可视化工具,可以进行项目需求分析、结构规划和生成框架代码,还可以支持从现有系统逆向转出工程代码,生成 Rose 模型的功能。

逆向工程( Reverse Engineer )就是从现有系统的代码来生成模型的功能。通过 Rational Rose 分析已有的代码,可了解代码结构和数据结构,生成类层次关系图、数据模型图和组件图。

 

十一. VC6 常用快捷键

 

Alt+F7  Project Settings

 

Ctrl+J/K :寻找上一个 / 下一个预编译条件

Ctrl+Shift+J/K :寻找上一个 / 下一个预编译条件并将这一块选定

 

Ctrl+Tab :当前打开文档和上一次打开文档切换。

Alt+O :头文件与 cpp 文件的交互显示

 

F12  Goto definition

Shift+F12  Goto reference

 

Ctrl+Home  文档头

Ctrl+Shift+Home  选定从当前位置到文档头

Ctrl+End  文档尾

Ctrl+Shift+End  选定从当前位置到文档尾

Alt+F8 :自动格式重排

Ctrl+F4 :关闭当前文档

 

Ctrl+Z/Alt+Backspace  Undo

Ctrl+Shift+Z/Ctrl+Y  Redo

 

Ctrl+B/Alt+F9  编辑断点

Ctrl+Shift+F9  去掉所有断点

 

Ctrl+D  定位工具条查找输入栏

Alt+F3/Ctrl+F :当前文档 查找

Ctrl+F3  查找下一个

Ctrl+Shift+F3  查找上一个

Ctrl+H :替换

Ctrl+] :括号匹配

 

Ctrl+   向上滚屏

Ctrl+   向下滚屏

Ctrl+   移到前一个单词

Ctrl+   移到后一个单词

Ctrl+Shift+   选定当前位置到前一个单词

Ctrl+Shift+   选定当前位置到后一个单词

 

Ctrl+Backspace  删除当前单词的前半截(以光标为分割)

Ctrl+Del  删除当前单词的后半截(以光标为分割)

Ctrl+L :剪切当前行

Ctrl+Shift+L :删除当前 

 

F2 :上一个书签

Shift+F2 :上一个书签

Alt+F2 :编辑书签

Ctrl  F2 :添加 / 删除一个书签

Ctrl+Shift+F2  清除所有书签

 

 

参考:

 VC的环境设置 

 VC6.0工程设置介绍 

 Visual C++ 6.0环境配置 

 VC 2005 解决方案的目录结构设置和管理 

 Managing Solutions, Projects, and Files 

 File Types Created for Visual C++ Projects 

 

[麻烦各位手下留情,抽空点一下,博文下面的谷歌广告呗]

分享到:
评论

相关推荐

    vc6代码补全插件VC6.0_VA_X.zip

    从压缩包子文件的文件名称列表来看,有两个文件:VC6.0.zip和VC6.0_VA_X_downcc.zip。VC6.0.zip可能是Visual C++ 6.0的基本安装文件,包含了IDE、编译器和必要的库文件。而VC6.0_VA_X_downcc.zip则很可能包含了VA_X...

    OpenGL VC6.0环境位置 OpenGL VC6.0环境位置 OpenGL VC6.0环境位置

    OpenGL VC6.0环境位置 OpenGL VC6.0环境位置 OpenGL VC6.0环境位置

    VC.NET_To_VC6.0.rar_VC.NET VC6.0_vc6.0

    提供了进一步的信息,表明这个压缩包内可能包含一个或多个程序、脚本或教程,用于帮助开发者将使用.NET Framework的项目逆向工程化,以便能在不支持.NET的旧版编译器VC6.0中编译和运行。这个过程通常涉及到语法转换...

    VC 6.0下编译调试ffmpeg

    FFmpeg 是一个开源的多媒体处理框架,包含了音频和视频编码、解码、转换、流媒体等众多功能。...这需要对VC 6.0的项目配置、编译过程以及FFmpeg本身的结构有深入了解。希望这个指南能帮助你在多媒体处理领域更进一步。

    vc6.0.zip_vc6.0

    Visual C++ 6.0(简称VC6.0)是Microsoft公司推出的一款经典且强大的C++集成开发环境,它在编程领域中有着广泛的应用,尤其对于初学者和一些老项目维护者来说,仍然是不可或缺的工具。本篇文章将深入探讨VC6.0的核心...

    VC6.0代码提示工具VC6.0_VA_X

    然而,原始的VC6.0在代码编辑和智能提示方面相对较为基础,对于初学者来说,可能在编写代码时感到不便。为了解决这个问题,"VC6.0代码提示工具VC6.0_VA_X"应运而生。 **代码提示工具的重要性** 1. **提高效率**:...

    VC6.0完全卸载工具

    此外,对于那些依然依赖VC6.0编译环境的项目,可能需要在卸载后重新配置新的开发环境才能继续开发。 总的来说,【VC6.0完全卸载工具】是针对开发者和计算机爱好者的一个实用工具,它解决了在卸载经典但不再需要的VC...

    VC6.0 完美卸载工具

    然而,在某些特定场景下,如维护老项目或研究经典代码时,VC6.0仍有其不可替代的地位。 压缩包中的`当易网百度搜索.url`和`当易网.url`可能是提供下载该工具的网站链接,用户可以通过这些链接获取更多的信息或者...

    VC助手最新版本支持vc6.0 vc2005 vc2008

    标题提到的"VC助手最新版本支持vc6.0 vc2005 vc2008",意味着这款软件已经更新至最新状态,并且兼容微软的三个经典开发环境:Visual C++ 6.0、Visual Studio 2005(也称为VC++ 8.0)和Visual Studio 2008(VC++ 9.0...

    vc6.0-MSDN-CHM.rar_C++帮助 chm_MSDN_VC6_leaderqvv_msdn6.0

    《VC6.0 MSDN帮助文档 CHM版》是一个针对微软Visual C++ 6.0集成开发环境...尽管VC6.0已经较为老旧,但它的帮助文档对于理解C++的基础和深入概念依然具有很高的价值,尤其对于初学者和需要维护旧代码的开发者来说。

    VC6.0配置OpenCV.rar_VC6.0 OPENCV1.0_vc++6.0导入opencv_vc6.0 opencv_v

    在本文中,我们将深入探讨如何在古老的...通过以上步骤,你应该能够在VC6.0环境中成功配置并使用OpenCV1.0进行图像处理和计算机视觉的开发。虽然过程可能较为繁琐,但完成后的成就感和对旧系统的掌握将是非常有价值的。

    VC助手for VC6.0

    "VC助手for VC6.0"是一款专为Visual Studio 6.0用户设计的强大辅助工具,旨在提升VC程序开发的效率和质量。在VC6.0这个经典版本的开发环境中,许多开发者依然依赖其强大的功能和对C++的优秀支持。而VC助手则通过提供...

    VC6.0全集(包含VC6.0中英文版和MSDN以及相关插件)

    ### VC6.0全集(包含VC6.0中英文版和MSDN以及相关插件) #### 一、概述 Microsoft Visual C++ 6.0(简称VC6.0)是微软公司推出的一款非常经典的集成开发环境(IDE),主要用于Windows平台下的C/C++程序开发。该...

    基于VC6.0的TCPIP 通讯

    本项目是基于古老的Visual C++ 6.0(简称VC6.0)开发的TCP/IP通信程序,尽管VC6.0已经有些年头,但它仍然被许多开发者用来编写Windows应用程序,特别是对旧系统兼容性有要求的项目。 TCP/IP协议族是由Internet协议...

    VC6.0编写ModBus协议 rtu规约实例

    "VC6.0编写ModBus协议 RTU规约实例" ModBus是一种常用的工业通信协议,RTU(Remote...VC6.0编写ModBus协议RTU规约实例需要掌握串行通信、ModBus协议解析和RTU设备实现等技术知识,并考虑到错误处理和状态监控等问题。

    VC6.0 NTP时间服务器同步代码

    以下将详细讲解如何在VC6.0中实现NTP时间服务器同步的代码逻辑、涉及的关键技术和相关知识点。 1. **NTP协议理解**: - NTP是一种基于UDP的应用层协议,使用端口号123。 - 它通过发送时间请求包到NTP服务器,然后...

    VC 6.0 英文版

    尽管后来微软推出了更新版本的Visual Studio,如Visual Studio .NET和后续版本,但VC6.0仍然在一些特定领域和老项目维护中占据一席之地。 **主要特点** 1. **集成开发环境**: VC6.0提供了一个包含编辑器、编译器、...

    VC助手最新版本_vc_assist_支持vc6.0_vc2005_vc2008.RAR

    在编程世界中,Visual C++(简称VC)是一款由Microsoft公司推出的强大C++集成开发环境,它包括了从VC6.0到较新的VC2005和VC2008等多个版本。而"VC助手",全称为Visual Assist X,是专为提升VC开发效率而设计的一款...

    vc6.0的详细使用说明

    为了确保编译器能够找到所需的头文件,需要正确配置项目的搜索路径。例如,对于C++标准库头文件,可以在项目的“属性”-&gt;“C/C++”-&gt;“常规”-&gt;“附加包含目录”中添加路径。 #### 五、总结 VC6.0虽然已经不是最新...

    VC6.0 多国语言切换(DLL版本,包含DLL项目)

    标题“VC6.0 多国语言切换(DLL版本,包含DLL项目)”以及描述中的关键信息表明,这是一个关于使用Visual C++ 6.0实现多国语言支持的教程或资源包,特别是通过动态链接库(DLL)的方式进行语言切换。在软件开发中,...

Global site tag (gtag.js) - Google Analytics