----------------------------------------------- VFP C++编译软件(VFP C++ Compiler)用户手册 2024 年 01 月 ----------------------------------------------- 深圳市百誉佳软件技术有限公司版权所有,2000-2024 /-------------------------\ | 第 一 章 开 发 背 景 | \-------------------------/ VFP(包括dBASE、FoxBASE、FoxPro、Visual FoxPro)是生命力最强的开发语言, 从Ashton-Tate公司1980年发布的dBASE II,到Fox Software公司1984年发布的FoxBASE, 到2004年MicroSoft公司发布的Visual FoxPro 9.0,历经40多年的风风雨雨仍然屹立 不倒,仍然拥有庞大的开发者群和铁杆Foxer,这不能不说是一个奇迹。 然而,VFP一直采用伪编译方式,从理论上留下了被反编译的可能。 实际上,正是 这种可能,催生了ReFox、UnFoxAll、VFPDecoder、FoxTools等VFP反编译软件,伪编译 一直是Foxer们抱怨的VFP最大的诟病。 虽然也有一些VFP加密软件, 但正所谓“道高 一尺、魔高一丈”,最终都成了VFP反编译软件的牺牲品。 难道VFP真的不能像Masm、C/C++、Delphi那样编译吗? 记住,凡事皆有可能! 如今, 这已经成为现实,你所拿到的正是一款大家梦寐以求的VFP C++编译软件! /-------------------------\ | 第 二 章 运 行 环 境 | \-------------------------/ 一、硬件环境: IBM兼容PC机(PentiumIII 800MHz以上CPU,256MB以上内存)。 二、软件环境: Microsoft Windows 2000、Windows XP、Windows Vista、Windows 7、Windows 8、 Windows 8.1、Windows 10 (x86/x64)。 Microsoft Visual FoxPro 6.0、Visual FoxPro 7.0、Visual FoxPro 8.0、 Visual FoxPro 9.0、Visual FoxPro Advanced、Visual FoxPro Advanced (x64)。 Microsoft Visual C++ 6.0 (Visual Studio 98)、Visual C++ 7.0 (Visual Studio .NET)、 Visual C++ 7.1 (Visual Studio .NET 2003)、Visual C++ 8.0 (Visual Studio 2005)、 Visual C++ 9.0 (Visual Studio 2008)、Visual C++ 10.0 (Visual Studio 2010)、 Visual C++ 11.0 (Visual Studio 2012)、Visual C++ 12.0 (Visual Studio 2013)、 Visual C++ 14.0 (Visual Studio 2015)、Visual C++ 14.1 (Visual Studio 2017)、 Visual C++ 14.2 (Visual Studio 2019)、Visual C++ 14.3 (Visual Studio 2022)。 /-------------------------\ | 第 三 章 软 件 安 装 | \-------------------------/ 一、安装VFP C++编译软件: VFP C++编译软件为绿色软件,直接拷贝到硬盘即可运行。 建议运行安装程序VCSETUP.EXE把VFP C++编译软件安装到C:\Program Files\Baiyujia VFP C++ Compiler。 二、运行VFP C++编译软件: 双击桌面快捷方式VFP C++ Compiler,或者运行C:\Program Files\Baiyujia VFP C++ Compiler\VC.EXE,可以进入VFP C++编译软件主界面。 现在我们可以双击VCTEST\VCTEST.VCF,进入VFP C++编译软件主界面后点击“开始编译”, 编译完成后生成VCTEST.EXE及VCTEST.DLL。再双击VCTEST.EXE启动测试程序,如果测试程序 运行正常,说明VFP C++编译软件已安装成功。 /-------------------------\ | 第 四 章 变 量 申 明 | \-------------------------/ 一、变量分类 VFP C++编译软件把变量分为普通变量、类变量、宏变量三类。 普通变量:除类变量、宏变量以外的变量,如:x1,x2等。 类变量:如果申明了abc*,那么以abc开头的变量都是类变量。 宏变量:如果申明了xyz&,那么以xyz开头的变量都是宏变量。 二、变量申明 1、普通变量申明 在VFP中,有多种申明、建立变量的方法,如: 方法1:x1=123 方法2:STORE 123 TO x1 方法3:PUBLIC x1、PRIVATE x1、LOCAL x1、... TO x1、... TO ARRAY x1等。 VFP C++编译软件编译时只处理方法1的情况。也就是说,如果我们用x1=123,VFP C++ 编译软件会把x1编译为内部名称;如果变量x1在另外一个文件中被引用,但该文件又没有被 包含在最终执行文件中,那么我们可以用STORE 123 TO x1,这样x1不会被编译为内部名称。 2、类变量申明 在VFP中,有: DISPLAY MEMORY LIKE abc* SAVE TO FileName ALL LIKE abc* RELEASE ALL LIKE abc* VFP C++编译软件可以正确识别这些语句,并把abc*作为类变量编译。 我们也可以用以下格式申明类变量: * LIKE abc* 如果申明了abc*类变量,那么VFP C++编译软件会把abc编译成__vc_xxx,abc123编译成 __vc_xxxa,abcdef编译成__vc_xxxb等。 如果申明了abc*类变量,我们必须显式地申明所有以abc开头的变量。也就是说,下面 的程序编译后可能会有问题: * LIKE abc* abc123=123 STORE "abcdef" TO abcdef 也可以设置: /VCNAMECATEGORY=OFF 不编译类变量名称 解决这个问题。 3、宏变量申明 我们可以用以下格式申明宏变量: * LIKE xyz& 如果申明了xyz&宏变量,那么VFP C++编译软件会把xyz编译成__vc_xxx,xyz123编译成 __vc_xxx123,xyzdef编译成__vc_xxxdef等。 如果申明了xyz&宏变量,我们必须显式地申明所有以xyz开头的变量。也就是说,下面 的程序编译后可能会有问题: * LIKE xyz& xyz123=123 STORE "xyzdef" TO xyzdef 也可以设置: /VCNAMEMACRO=OFF 不编译宏变量名称 解决这个问题。 三、过程申明 同普通变量申明一样,我们必须显式地申明需要编译的过程名称。 如果仅有: PROCEDURE pabc VFP C++编译软件不会把pabc编译成内部名称。 如果有: PROCEDURE pabc * pabc= VFP C++编译软件会把pabc编译成内部名称。 建议使用下面的标准格式申明变量和过程: PROCEDURE pabc PARAMETERS m.x1,m.x2 * pabc= * m.x1= * m.x2= PRIVATE m.x3 m.x3=0 四、保留字 保留字包括VFP保留字及常用WIN32API函数名,DECLARE申明的函数名也是保留字。 VFP C++编译软件会自动把保留字编译成内部名称,用户不必做特殊处理。 建议不要使用保留字做变量名、过程名、字段名等,这可能会引起冲突。 /----------------------------\ | 第 五 章 命 令 行 参 数 | \----------------------------/ 运行VC.EXE /?会显示详细的命令行参数: VFP C++编译软件 for Windows XP 深圳市百誉佳软件技术有限公司版权所有,2000-2024。 用法:VC VFP项目文件 VFP运行文件 C/C++编译器文件 编译选项 /HELP 显示帮助 /VCLEVEL=n 编译加密级别 /VCPRG=ON|OFF 是否编译程序类文件 /VCSCX=ON|OFF 是否编译表单类文件 /VCSTRUC=ON|OFF 是否编译结构化程序 /VCOPT=ON|OFF 是否优化代码 /VCOPT2=ON|OFF 是否优化代码Ⅱ /VCENCRYPT=ON|OFF 是否加密可执行文件 /VCPACKEXE=ON|OFF 是否压缩可执行文件 /VFPLIB=ON|OFF 是否包含VFP运行库 /VCLIB=ON|OFF 是否包含VC运行库 /VCPACKDLL=ON|OFF 是否压缩动态链接库文件 /VCPACK=ON|OFF 是否打包可执行文件 /VCSTEP=ON|OFF 是否单步编译模式 /DEBUG=ON|OFF 是否调试模式 /APPDEBUG=ON|OFF 是否应用程序调试模式 /APPERROR=ON|OFF 是否应用程序错误日志文件 /SILENT=ON|OFF 是否静默模式 /SILENTDISPLAY=ON|OFF 是否静默显示模式 一、VFP项目文件 通常指定为VFP的扩展名为PJX的项目文件,我们还可以指定为: 1、VFP程序文件,扩展名为PRG,如果我们的项目只有一个PRG文件。 2、VFP列表文件,扩展名为LST,该文件中存储了项目的文件清单。 如VCTEST.LST: CONFIG.FPW VCTEST.PRG VCTEST.SCX VCTEST.FRX 其中第一个PRG文件为项目主程序,支持*?等文件通配符。 3、VFP C++编译软件启动文件,扩展名为VCF,该文件中存储了项目的命令行参数。 如VCTEST.VCF: VCTEST.PJX ; VFP项目文件 VFP9\VFP9.EXE ; VFP运行文件 FOXRUN7\MAKE.BAT ; C/C++编译器文件 /VCLEVEL=1 ; 编译加密级别 /VCOUTPUTEXE=... 编译输出可执行文件 /VCOUTPUTDLL=... 编译输出动态链接库文件 通常,编译输出可执行文件名和项目文件名相同,扩展名为EXE或DLL,我们也可以 指定编译输出可执行文件。 通常,编译输出动态链接库文件名和编译输出可执行文件相同,扩展名为DLL或EXE。 对于COM服务程序,VFP C++编译软件只支持扩展名为PJX的项目文件。 VFP C++编译软件可以把COM服务程序编译为: 1、Win32可执行程序/COM服务程序,扩展名为EXE,动态链接库扩展名为DLL; 2、单线程COM服务程序,扩展名为DLL,动态链接库扩展名为EXE; 3、多线程COM服务程序,扩展名为DLL,动态链接库扩展名为EXE。 VFP C++编译软件只做COM服务程序编译处理,不做COM服务程序注册处理。 二、VFP运行文件 指VFP6.EXE、VFP7.EXE、VFP8.EXE、VFP9.EXE、VFPA.EXE等VFP运行文件。目前 VFP C++编译软件只支持Visual FoxPro 6.0/7.0/8.0/9.0/Advanced/Advanced (x64)版本。 Visual FoxPro 6.0编译生成的软件运行时需要VC运行库MSVCRT.DLL、VFP运行库 VFP6R*.DLL(建议使用版本:6.0.8961.0)。 Visual FoxPro 7.0编译生成的软件运行时需要VC运行库MSVCR70.DLL、VFP运行库 VFP7R*.DLL(建议使用版本:7.0.0.9465)。 Visual FoxPro 8.0编译生成的软件运行时需要VC运行库MSVCR70.DLL、VFP运行库 VFP8R*.DLL(建议使用版本:8.0.0.3117)、GDI+图形库GDIPLUS.DLL。 Visual FoxPro 9.0编译生成的软件运行时需要VC运行库MSVCR71.DLL、VFP运行库 VFP9R*.DLL(建议使用版本:9.0.0.5721)、GDI+图形库GDIPLUS.DLL。 Visual FoxPro Advanced编译生成的软件运行时需要VC运行库MSVCR71.DLL、VFP运行库 VFPAR.DLL(建议使用版本:10.0.0.0)、GDI+图形库GDIPLUS.DLL。 Visual FoxPro Advanced (x64)编译生成的软件运行时需要VC运行库MSVCR100.DLL、 VFP运行库VFPAR.DLL(建议使用版本:10.0.0.0)、GDI+图形库GDIPLUS.DLL。 三、C/C++编译器文件 安装时已把C/C++编译器文件拷贝到FOXRUN文件夹内,这里只需指定使用哪种编译模式: MAKE.BAT:默认按最小化大小优化编译; MAKE_O1.BAT:按最小化大小优化编译; MAKE_O2.BAT:按最大化速度优化编译; MAKE_OD.BAT:不优化编译,编译速度快很多,建议调试时使用。 Visual C++ 6.0编译生成的软件运行时需要VC运行库MSVCRT.DLL。 Visual C++ 7.0编译生成的软件运行时需要VC运行库MSVCR70.DLL。 Visual C++ 8.0编译生成的软件运行时需要安装Microsoft .NET Framework 2.0或 Microsoft Visual C++ 2005 Redistributable Package或把MICROSOFT.VC80.CRT.MANIFEST、 MSVCR80.DLL拷贝到应用程序所在文件夹下。 Visual C++ 9.0编译生成的软件运行时需要安装Microsoft .NET Framework 3.5或 Microsoft Visual C++ 2008 Redistributable Package或把MICROSOFT.VC90.CRT.MANIFEST、 MSVCR90.DLL拷贝到应用程序所在文件夹下。 Visual C++ 10.0编译生成的软件运行时需要VC运行库MSVCR100.DLL,仅运行于Windows XP SP2及以后平台。 Visual C++ 11.0编译生成的软件运行时需要VC运行库MSVCR110.DLL,仅运行于Windows Vista及以后平台。 Visual C++ 11.0 Update 1及以后更新编译生成的软件运行时需要VC运行库MSVCR110.DLL, 仅运行于Windows XP SP2及以后平台。 Visual C++ 12.0编译生成的软件运行时需要VC运行库MSVCR120.DLL,仅运行于Windows XP SP2及以后平台。 Visual C++ 14.0编译生成的软件运行时需要安装Microsoft Visual C++ 2015 Redistributable Package,仅运行于Windows XP SP2及以后平台。 Visual C++ 14.1编译生成的软件运行时需要安装Microsoft Visual C++ 2017 Redistributable Package,仅运行于Windows XP SP2及以后平台。 Visual C++ 14.2编译生成的软件运行时需要安装Microsoft Visual C++ 2019 Redistributable Package,仅运行于Windows XP SP2及以后平台。 Visual C++ 14.3编译生成的软件运行时需要安装Microsoft Visual C++ 2022 Redistributable Package,仅运行于Windows XP SP2及以后平台。 数据对齐:1字节、2字节、4字节、8字节、16字节。 对于32位系统,建议选择按4或8字节对齐。 对于64位系统,建议选择按8或16字节对齐。 有关C/C++编译器选项请参考C/C++编译器帮助文档。 四、编译选项 前述三个命令行参数必须按顺序输入,即: 第一个参数必须为:VFP项目文件 第二个参数必须为:VFP运行文件 第三个参数必须为:C/C++编译器文件 第四个及以后的命令行参数为编译选项,可以按任意顺序输入。 1、/VCLEVEL=n 编译加密级别 默认为1级,最大为99级。 通常选择1级编译加密即可,选择高的编译加密级别编译生成的可执行文件加密强度 增大、但运行速度略有降低。 考虑到VFP允许的DO命令最大嵌套级数为128级(VFP 9.0已可最大设置为65000级), 如果选择1级编译加密,那么允许的DO命令最大嵌套级数为128/3≈42级;如果选择5级 编译加密,那么允许的DO命令最大嵌套级数为128/3/5≈8级,在某些大型软件或者递归 调用时可能会发生“超出允许的DO嵌套层次”错误。 2、/VCPRG=ON|OFF 是否编译程序类文件 默认为ON,即允许编译程序类文件。 这里的程序类文件包括: 程序文件,扩展名为PRG; 格式文件,扩展名为FMT; 屏幕文件,扩展名为SPR; 菜单文件,扩展名为MPR; 查询文件,扩展名为QPR。 3、/VCSCX=ON|OFF 是否编译表单类文件 默认为ON,即允许编译表单类文件。 这里的表单类文件包括: 表单文件,扩展名为SCX; 类库文件,扩展名为VCX; 报表文件,扩展名为FRX; 标签文件,扩展名为LBX。 4、/VCSTRUC=ON|OFF 是否编译结构化程序 默认为ON,即允许编译结构化程序。 所谓结构化程序,是指包含: DO CASE ... ENDCASE DO WHILE ... ENDDO FOR EACH ... ENDFOR FOR ... ENDFOR IF ... ENDIF SCAN ... ENDSCAN TRY ... ENDTRY 等命令的程序。 5、/VCOPT=ON|OFF 是否优化代码 默认为ON,VFP C++编译软件编译生成已优化代码的可执行文件,运行速度显著提高。 如果设置为OFF,VFP C++编译软件编译生成未优化代码的可执行文件。 通常,优化代码(行数)比率为60%~80%。 6、/VCOPT2=ON|OFF 是否优化代码Ⅱ 默认为ON,VFP C++编译软件编译生成已优化代码Ⅱ的可执行文件,运行速度更快。 如果设置为OFF,VFP C++编译软件编译生成未优化代码Ⅱ的可执行文件。 7、/VCENCRYPT=ON|OFF 是否加密可执行文件 默认为ON,VFP C++编译软件编译生成已加密的可执行文件。 如果设置为OFF,VFP C++编译软件编译生成未加密的可执行文件。 8、/VCPACKEXE=ON|OFF 是否压缩可执行文件 默认为OFF,VFP C++编译软件编译生成未压缩的可执行文件。 如果设置为ON,VFP C++编译软件编译生成已压缩的可执行文件。 通常,VFP C++编译软件编译生成的加密的可执行文件文件压缩率为10%~30%, 未加密的可执行文件文件压缩率为5%~15%。 9、/VFPLIB=ON|OFF 是否包含VFP运行库 /VFPLIBLANGUAGE=... VFP运行库语言(仅支持Visual FoxPro Advanced) /VFPLIBVERSION=... VFP运行库版本(仅支持Visual FoxPro Advanced) 默认为OFF,VFP C++编译软件编译生成的可执行文件不包含VFP运行库。 如果设置为ON,VFP C++编译软件编译生成的可执行文件包含VFP运行库和VC运行库。 对于Visual FoxPro Advanced,可以选择VFP运行库语言: CHS - 简体中文 CHT - 繁体中文 CSY - 捷克语 DEU - 德语 ENU - 英语 ESN - 西班牙语 FRA - 法语 KOR - 朝鲜语 RUS - 俄语 对于Visual FoxPro Advanced,可以选择VFP运行库版本: AUTO - VFP运行库版本和VFP运行文件版本相同 10.0 - VFP运行库版本为10.0版本 10.1 - VFP运行库版本为10.1版本 10、/VCLIB=ON|OFF 是否包含VC运行库 默认为OFF,VFP C++编译软件编译生成的可执行文件不包含VC运行库。 如果设置为ON,VFP C++编译软件编译生成的可执行文件包含VC运行库。 11、/VCPACKDLL=ON|OFF 是否压缩动态链接库文件 默认为OFF,VFP C++编译软件编译生成未压缩的动态链接文件。 如果设置为ON,VFP C++编译软件编译生成已压缩的动态链接文件。 通常,VFP C++编译软件编译生成的动态链接库文件压缩率为30%~50%。 12、/VCPACK=ON|OFF 是否打包可执行文件 默认为OFF,VFP C++编译软件不打包可执行文件。 如果设置为ON,VFP C++编译软件打包可执行文件。 可以使用MoleBox或Thinstall打包软件打包动态链接库文件以及其它文件(如VFP 运行库文件)到编译生成的可执行文件中。 13、/VCSTEP=ON|OFF 是否单步编译模式 /VCSTEP_ONERROR=ON|OFF 是否单步编译错误处理代码 /VCSTEP_ONESCAPE=ON|OFF 是否单步编译ESC键处理代码 默认为OFF,VFP C++编译软件可以把多个VFP语句编译为一个C函数。 如果设置为ON,VFP C++编译软件把每一个VFP语句编译为一个C函数。 14、/DEBUG=ON|OFF 是否调试模式 默认为OFF,即关闭调试模式。 如果软件编译后运行有问题,可以设置为ON打开调试模式,这样VFP C++编译软件会 生成编译日志文件并保留编译中间文件,便于分析查找原因。 15、/APPDEBUG=ON|OFF 是否应用程序调试模式 默认为OFF,即关闭应用程序调试模式。 如果软件编译后运行有问题,可以设置为ON打开应用程序调试模式,这样VFP C++编译 软件编译生成的应用程序运行时会生成运行日志文件,便于分析查找原因。 16、/APPERROR=ON|OFF 是否应用程序错误日志文件 默认为OFF,即关闭应用程序错误日志文件。 如果软件编译后运行有问题,可以设置为ON打开应用程序错误日志文件,这样VFP C++ 编译软件编译生成的应用程序运行时会生成错误日志文件,便于分析查找原因。 17、/SILENT=ON|OFF 是否静默模式 默认为OFF,会显示VFP C++编译软件主界面。 如果设置为ON,不会显示VFP C++编译软件主界面,便于在批处理中调用。 18、/SILENTDISPLAY=ON|OFF 是否静默显示模式 默认为OFF,会显示VFP C++编译软件主界面。 如果设置为ON,显示VFP C++编译软件主界面后自动编译,便于在批处理中调用。 19、/VCINCREMENTAL=ON|OFF 是否增量编译模式 默认为OFF,VFP C++编译软件编译VFP项目文件中的所有文件。 如果设置为ON,VFP C++编译软件只编译VFP项目文件中修改过的文件。 20、/VCSAVEINCREMENTAL=ON|OFF 是否保留增量编译文件 默认为OFF,VFP C++编译软件不保留编译中间文件。 如果设置为ON,VFP C++编译软件保留编译中间文件以用于增量编译。 21、/VCMULTITASK=ON|OFF 是否多任务编译模式 默认为OFF,即关闭多任务编译模式。 如果设置为ON,VFP C++编译软件运行多个任务编译VFP项目文件中的文件。 22、/VCMULTITASKNUMBER=n 多任务编译任务个数 默认为1个,最大为99个。 通常可以设置为CPU支持的最大线程数,例如,对于2核心4线程的CPU,可以设置为4个。 建议仅用于多核心或多线程CPU。 23、/VCMULTITASK_COMPILEFORM=ON|OFF 是否多任务编译大表单文件 默认为OFF,即关闭多任务编译大表单文件。 如果设置为ON,VFP C++编译软件运行多个任务编译大表单文件。 24、/VCMULTITASKNUMBER_COMPILEFORM=n 多任务编译任务大表单个数 默认为1个,最大为99个。 通常可以设置为CPU支持的最大线程数,例如,对于2核心4线程的CPU,可以设置为4个。 建议仅用于多核心或多线程CPU。 25、/VCMULTITASK_COMPILEDLL=ON|OFF 是否多任务编译动态链接库源文件 默认为OFF,即关闭多任务编译动态链接库源文件。 如果设置为ON,VFP C++编译软件运行多个任务编译动态链接库源文件。 26、/VCMULTITASKNUMBER_COMPILEDLL=n 多任务编译任务动态链接库个数 默认为1个,最大为99个。 通常可以设置为CPU支持的最大线程数,例如,对于2核心4线程的CPU,可以设置为4个。 建议仅用于多核心或多线程CPU。 27、/VCDPIAWARENESSMODE=n DPI感知模式(仅支持Visual FoxPro Advanced) 对于Visual FoxPro Advanced,可以选择编译生成的可执行文件的DPI感知模式: -1 - 无DPI感知模式 0 - DPI无感知 1 - 系统DPI感知 2 - 每监视器DPI感知 3 - 每监视器DPI感知V2 28、/VCREQUESTEXECUTIONLEVEL=n 请求运行级别(仅支持Visual FoxPro Advanced) 对于Visual FoxPro Advanced,可以选择编译生成的可执行文件的请求运行级别: -1 - 无请求运行级别 0 - 以标准用户权限运行 1 - 以当前用户最高权限运行 2 - 以管理员权限运行 29、/VCRUNTIMELIBRARYFILETYPE=n VC运行库文件类型(仅支持Visual FoxPro Advanced) 对于Visual FoxPro Advanced,可以选择编译生成的可执行文件的VC运行库文件类型: -2 - VC运行库文件为MSVCR70.DLL -1 - VC运行库文件为MSVCR71.DLL 0 - VC运行库文件为MSVCR100.DLL 1 - VC运行库文件为MSVCR10064.DLL 2 - VC运行库文件为MSVCRA64.DLL 可以使用“保存编译选项”功能把命令行参数写入到VCF文件中,如VCTEST.VCF: VCTEST.PJX ; VFP项目文件 VFP9\VFP9.EXE ; VFP运行文件 FOXRUN7\MAKE.BAT ; C/C++编译器文件 /VCLEVEL=1 ; 编译加密级别 双击该文件即可调用VFP C++编译软件进行编译。 五、更多编译选项 1、/VCKEYWORD=ON|OFF 是否编译关键字 默认为OFF,VFP C++编译软件不编译关键字。 如果设置为ON,VFP C++编译软件编译关键字。 2、/VCNAME=ON|OFF 是否编译变量名称 默认为OFF,VFP C++编译软件不编译变量名称。 如果设置为ON,VFP C++编译软件编译变量名称。 3、/VCNAMECATEGORY=ON|OFF 是否编译类变量名称 默认为ON,VFP C++编译软件编译类变量名称。 如果设置为OFF,VFP C++编译软件不编译类变量名称。 4、/VCNAMEMACRO=ON|OFF 是否编译宏变量名称 默认为ON,VFP C++编译软件编译宏变量名称。 如果设置为OFF,VFP C++编译软件不编译宏变量名称。 5、/VCNAMETYPE=n 变量名称编码类型 变量名称的编码字符集,包括: 0:英文字母A-Z 1:英文字母O(0x4F)和数字0(0x30) 2:中文汉字0xFAA1-0xFAFA 3:中文汉字Ο(0xA6AF)和О(0xAFB0) 4:MD5编码-16字符 5:MD5编码-32字符 6、/VCNAMEONLYVCV=ON|OFF 是否仅编译用户变量名称文件中指定的变量名称 默认为OFF,VFP C++编译软件编译所有变量名称。 如果设置为ON,VFP C++编译软件仅编译用户变量名称文件(<项目名称>.VCV)中 指定的变量名称。 7、/VCNAMEEXCLUDEVCD2=ON|OFF 是否不编译在字符串定界符内的变量名称 /VCNAMEEXCLUDEVCD3=ON|OFF 是否不编译字段或属性名称 /VCNAMEEXCLUDEVCW=ON|OFF 是否不编译用户保留字文件中指定的变量名称 默认为OFF,VFP C++编译软件编译所有变量名称。 如果设置为ON,VFP C++编译软件不编译在字符串定界符内的变量名称、字段或 属性名称、用户保留字文件(<项目名称>.VCW)中指定的变量名称。 8、/VCNAMEMULTIPROJ=ON|OFF 是否编译可以用于多个项目的变量名称 默认为OFF,VFP C++编译软件编译仅用于单个项目的变量名称。 如果设置为ON,VFP C++编译软件编译可以用于多个项目的变量名称。 9、/VCNAMESCANPROJDIR=ON|OFF 是否扫描项目文件夹及其子文件夹下的文件 默认为ON,VFP C++编译软件扫描项目文件夹及其子文件夹下的文件。如果变量名称 与项目文件夹及其子文件夹下的文件名、字段名称等相同,将不做替换处理。 如果设置为OFF,VFP C++编译软件不扫描项目文件夹及其子文件夹下的文件。 10、/VCNAMESCANDIR=ON|OFF 是否扫描文件夹 /VCNAMESCANDIRLIST=... 扫描文件夹列表 默认为OFF,VFP C++编译软件不扫描其它文件夹。 如果设置为ON,VFP C++编译软件还扫描文件夹列表中指定的文件夹。 11、/VCNAMEONLYTEXTMERGEDELI=ON|OFF 对于文本合并语句,是否仅编译文本 合并分隔符内的变量名称 默认为OFF,对于文本合并语句(包括\、\\、TEXT ... ENDTEXT语句),VFP C++编译 软件编译整个语句中的变量名称。 如果设置为ON,对于文本合并语句(包括\、\\、TEXT ... ENDTEXT语句),VFP C++ 编译软件仅编译文本合并分隔符(默认为<<、>>)内的变量名称。 12、/VCSCXINIT=ON|OFF 是否表单对象属性转换为INIT事件代码 /VCFASTSCXINIT=ON|OFF 是否表单对象属性快速转换为INIT事件代码 /VCSCXINITMODLIST=0,1,2,3,4,5,6,7 模数列表 默认为OFF,VFP C++编译软件不转换表单对象属性。 如果设置为ON,VFP C++编译软件把表单对象属性转换为INIT事件代码。 如果设置快速转换为ON,VFP C++编译软件仅把VFP基类对象属性转换为INIT事件代码。 仅对指定的模数列表中的代码有效。 13、/VCSCXINITFOXRUNOFF=ON|OFF 是否不编译表单对象INIT事件代码 /VCSCXINITFOXRUNOFFMODLIST=0,1,2,3,4,5,6,7 模数列表 默认为OFF,VFP C++编译软件编译表单对象INIT事件代码。 如果设置为ON,VFP C++编译软件在表单对象INIT事件代码中插入:=[FOXURN OFF] 语句,不编译表单对象INIT事件代码。 仅对指定的模数列表中的代码有效。 14、/VCFRXINIT=ON|OFF 是否报表表达式转换为数据环境INIT事件代码 /VCFASTFRXINIT=ON|OFF 是否报表数据快速转换为数据环境INIT事件代码 /VCFRXINITMODLIST=0,1,2,3,4,5,6,7 模数列表 默认为OFF,VFP C++编译软件不转换报表表达式。 如果设置为ON,VFP C++编译软件把报表表达式转换为数据环境INIT事件代码。 如果设置快速转换为ON,VFP C++编译软件仅把文本框控件报表表达式转换为数据环境 INIT事件代码,VFP C++编译软件不转换标签控件报表表达式。 仅对指定的模数列表中的代码有效。 15、/VCFRXINITFOXRUNOFF=ON|OFF 是否不编译报表数据环境INIT事件代码 /VCFRXINITFOXRUNOFFMODLIST=0,1,2,3,4,5,6,7 模数列表 默认为OFF,VFP C++编译软件编译报表数据环境INIT事件代码。 如果设置为ON,VFP C++编译软件在报表数据环境INIT事件代码中插入:=[FOXURN OFF] 语句,不编译报表数据环境INIT事件代码。 仅对指定的模数列表中的代码有效。 16、/VCSCX_RESERVEDPROPERTIES_GRID_HEIGHT=ON|OFF 是否保留属性Grid.Height /VCSCX_RESERVEDPROPERTIES_TEXTBOX_CONTROLSOURCE=ON|OFF 是否保留属性 TextBox.ControlSource /VCSCX_RESERVEDPROPERTIES_OTHERS=ON|OFF 是否保留其它属性 /VCSCX_RESERVEDPROPERTIES_OTHERSLIST= 保留其它属性列表 默认为OFF,VFP C++编译软件不保留属性。 如果设置为ON,VFP C++编译软件保留属性。 所谓保留某属性,是指禁止把该属性转换为INIT事件代码。 17、/VCSCX_CLEANDATA_COMMENT_WHEN_BLANK=ON|OFF 当Comment为空白(Comment = "")时, 是否清除数据Comment /VCSCX_CLEANDATA_OLECONTROL_COMMENT=ON|OFF 是否清除数据OLEControl.Comment /VCSCX_CLEANDATA_CLASS_INFO=ON|OFF 是否清除数据Class Info 默认为OFF,VFP C++编译软件不清除数据。 如果设置为ON,VFP C++编译软件清除数据。 18、/VCFRX_CLEANDATA_SHOW_POSITION=ON|OFF 是否清除数据Show Position /VCFRX_CLEANDATA_PRINTER_DRIVER_INFO=ON|OFF 是否清除数据Printer Driver Info /VCFRX_CLEANDATA_COMMENT_WHEN_BLANK=ON|OFF 当Comment为空白(Comment==" ")时, 是否清除数据Comment /VCFRX_DELETEDATA_COMMENT=ON|OFF 是否删除注释数据(Objtype=0) /VCFRX_DELETEDATA_WHEN_PRINTWHENISFALSE=ON|OFF 是否删除打印条件为.F.(Supexpr ==".F.")的数据 /VCFRX_AUTORELEASEVARIABLES=ON|OFF 是否自动删除报表数据环境INIT事件中定义的 内存变量 默认为OFF,VFP C++编译软件不清除或删除数据。 如果设置为ON,VFP C++编译软件清除或删除数据。 19、/VCTOLARGEPROC=ON|OFF 是否编译为大程序文件格式(仅适用于VFP 9.0) 默认为OFF,VFP C++编译软件不编译为大程序文件格式。 如果设置为ON,VFP C++编译软件编译为大程序文件格式,并自动修复大程序文件问题。 关于大程序文件格式,请参考: 百誉佳网站:www.baiyujia.com/vfpdocuments/f_vhfox.asp 20、/VCNOTDISPLAY_LARGEPROC=ON|OFF 是否不显示项目中包含的大程序文件(仅适用于VFP 9.0) 默认为OFF,VFP C++编译软件显示项目中包含的大程序文件。 如果设置为ON,VFP C++编译软件不显示项目中包含的大程序文件(如果已修复大程序文件问题)。 关于大程序文件问题,请参考: 百誉佳网站:www.baiyujia.com/vfpdocuments/f_vfp9fix2.asp 21、/VCNOTDISPLAY_RELATIONALEXPR=ON|OFF 是否不显示无效的RelationalExpr表达式 默认为OFF,VFP C++编译软件显示无效的RelationalExpr表达式。 如果设置为ON,VFP C++编译软件不显示无效的RelationalExpr表达式(如果已修复无效的 RelationalExpr表达式问题)。 关于无效的RelationalExpr表达式问题,请参考: 百誉佳网站:www.baiyujia.com/vfpdocuments/f_vfp9fix4.asp 22、/VCNOTDISPLAY_COMPILEERROR=ON|OFF 是否不显示编译错误信息 默认为OFF,VFP C++编译软件显示编译错误信息。 如果设置为ON,VFP C++编译软件不显示编译错误信息。 23、/VCFILESEARCHPATH=... 文件搜索路径 指定类库文件和头文件的搜索路径。 24、/VCPLUGIN_MYPROTECT=ON|OFF 是否运行MyProtect插件 /VCPLUGIN_MYPROTECTFILE=... MyProtect插件文件 默认为OFF,VFP C++编译软件不运行MyProtect插件。 如果设置为ON,VFP C++编译软件在生成可执行文件前运行指定的MyProtect插件。 25、/VCEXPANDEXPEVALUATE=ON|OFF 是否使用EVALUATE()函数扩展表达式 /VCEXPANDEXPEVALUATELEVEL=n 扩展次数 /VCEXPANDEXPEVALUATEMODLIST=0,1,2,3,4,5,6,7 模数列表 默认为OFF,VFP C++编译软件不使用EVALUATE()函数扩展表达式。 如果设置为ON,VFP C++编译软件使用EVALUATE()函数扩展表达式。 所谓使用EVALUATE()函数扩展表达式,是指把表达式: x1="ABC" 扩展为: x1=(EVALUATE('"ABC"')) 扩展次数:默认为1次,最大为99次。 仅对指定的模数列表中的语句有效。 26、/VCEXPANDEXPCHR=ON|OFF 是否使用CHR()函数扩展表达式 /VCEXPANDEXPCHRMODLIST=0,1,2,3,4,5,6,7 模数列表 默认为OFF,VFP C++编译软件不使用CHR()函数扩展表达式。 如果设置为ON,VFP C++编译软件使用CHR()函数扩展表达式。 所谓使用CHR()函数扩展表达式,是指把表达式: x1="ABC" 扩展为: x1=(CHR(65)+CHR(66)+CHR(67)) 仅对指定的模数列表中的语句有效。 27、/VCEXPANDEXPCHR_L=m 左扩展字符最大个数 /VCEXPANDEXPCHR_R=n 右扩展字符最大个数 左边使用0-m个字符和右边使用0-n个字符扩展表达式。 28、/VCEXPANDEXP=ON|OFF 是否使用IIF()函数扩展表达式 /VCEXPANDEXPMODLIST=0,1,2,3,4,5,6,7 模数列表 默认为OFF,VFP C++编译软件不使用IIF()函数扩展表达式。 如果设置为ON,VFP C++编译软件使用IIF()函数扩展表达式。 所谓使用IIF()函数扩展表达式,是指把表达式: x1=x2 扩展为: x1=IIF(.T.,x2,123) 或: x1=IIF(.F.,123,x2) 仅对指定的模数列表中的语句有效。 29、/VCEXPANDEXP_IIF_T=m 使用IIF(.T.最大个数 /VCEXPANDEXP_IIF_F=n 使用IIF(.F.最大个数 使用0-m个IIF(.T.和0-n个IIF(.F.扩展表达式。 30、/VCEXPANDEXPSTRUC_IIF_T=m 结构化命令中使用IIF(.T.最大个数 /VCEXPANDEXPSTRUC_IIF_F=n 结构化命令中使用IIF(.F.最大个数 结构化命令中使用0-m个IIF(.T.和0-n个IIF(.F.扩展表达式。 31、/VCEXPANDEXPSCXINIT_IIF_T=m 表单对象INIT事件中使用IIF(.T.最大个数 /VCEXPANDEXPSCXINIT_IIF_F=n 表单对象INIT事件中使用IIF(.F.最大个数 表单对象INIT事件中使用0-m个IIF(.T.和0-n个IIF(.F.扩展表达式。 32、/VCEXPANDEXPFRXINIT_IIF_T=m 报表数据环境INIT事件中使用IIF(.T.最大个数 /VCEXPANDEXPFRXINIT_IIF_F=n 报表数据环境INIT事件中使用IIF(.F.最大个数 报表数据环境INIT事件中使用0-m个IIF(.T.和0-n个IIF(.F.扩展表达式。 33、/VCDECOMPCOND=ON|OFF 是否分解复合条件语句 默认为OFF,VFP C++编译软件不分解复合条件语句。 如果设置为ON,VFP C++编译软件分解复合条件语句。 所谓分解复合条件语句,是指把语句: IF x1 OR x2 ?"Y" ELSE ?"N" ENDIF 分解为: IF x1 ?"Y" ELSE IF x2 ?"Y" ELSE ?"N" ENDIF ENDIF 通常,分解复合条件语句会使程序复杂性呈指数级增长。 ┌──────────┬───────────┬─────────────────┐ │结构化程序命令 │VFP允许的最大嵌套层数 │VFP C++编译软件允许的最大嵌套层数 │ ├──────────┼───────────┼─────────────────┤ │IF ... ENDIF │ 63 │ 143 │ ├──────────┼───────────┼─────────────────┤ │DO CASE ... ENDCASE │ 31 │ 143 │ ├──────────┼───────────┼─────────────────┤ │DO WHILE ... ENDDO │ 63 │ 91 │ ├──────────┼───────────┼─────────────────┤ │FOR ... ENDFOR │ 63 │ 91 │ ├──────────┼───────────┼─────────────────┤ │SCAN ... ENDSCAN │ 63 │ 91 │ ├──────────┼───────────┼─────────────────┤ │TRY ... ENDTRY │ 63 │ 91 │ └──────────┴───────────┴─────────────────┘ 考虑到VFP允许的结构化程序命令最大嵌套级数为63级,某些大型软件分解复合条件语句后 可能会发生“结构嵌套太深”错误。 34、/VCFASTDECOMPIF=ON|OFF 是否快速分解IF语句 /VCFASTDECOMPIFCONDNUMBER=n 条件个数 /VCFASTDECOMPIFRECURSELEVEL=n 递归级数 /VCFASTDECOMPIFCODELINENUMBER=n 代码行数 /VCFASTDECOMPIFCODELENGTH=n 代码长度 /VCFASTDECOMPIFMODLIST=0,1,2,3,4,5,6,7 模数列表 默认为OFF,VFP C++编译软件不快速分解IF语句。 如果设置为ON,VFP C++编译软件快速分解IF语句。 所谓快速分解IF语句,是指把语句: IF x1 OR x2 OR x3 OR x4 OR x5 使用另外一种分解方式,分解速度快,生成代码小。 条件个数:默认为9个,最大为99个。 递归级数:默认为9级,最大为99级。 代码行数:默认为999行,最大为9999行。 代码长度:默认为99999字节,最大为999999字节。 仅对条件个数超过指定的条件个数或递归级数超过指定的递归级数或代码行数超过 指定的代码行数或代码长度超过指定的代码长度、指定的模数列表中的IF语句快速分解。 如果条件太复杂,VFP C++编译软件自动快速分解IF语句。 35、/VCFASTDECOMPDOCASE=ON|OFF 是否快速分解DO CASE语句 /VCFASTDECOMPDOCASECASENUMBER=n CASE个数 /VCFASTDECOMPDOCASECONDNUMBER=n 条件个数 /VCFASTDECOMPDOCASERECURSELEVEL=n 递归级数 /VCFASTDECOMPDOCASECODELINENUMBER=n 代码行数 /VCFASTDECOMPDOCASECODELENGTH=n 代码长度 /VCFASTDECOMPDOCASEMODLIST=0,1,2,3,4,5,6,7 模数列表 默认为OFF,VFP C++编译软件不快速分解DO CASE语句。 如果设置为ON,VFP C++编译软件快速分解DO CASE语句。 所谓快速分解DO CASE语句,是指把语句: CASE x1 AND x2 AND x3 AND x4 AND x5 使用另外一种分解方式,分解速度快,生成代码小。 CASE个数:默认为9个,最大为99个。 条件个数:默认为9个,最大为99个。 递归级数:默认为9级,最大为99级。 代码行数:默认为999行,最大为9999行。 代码长度:默认为99999字节,最大为999999字节。 仅对CASE个数超过指定的CASE个数或条件个数超过指定的条件个数或递归级数超过 指定的递归级数或代码行数超过指定的代码行数或代码长度超过指定的代码长度、指定 的模数列表中的DO CASE语句快速分解。 如果条件太复杂,VFP C++编译软件自动快速分解DO CASE语句。 36、/VCEXPANDINLINE=ON|OFF 是否展开内联函数 /VCEXPANDINLINELEVEL=n 展开次数 /VCEXPANDINLINEMODLIST=0,1,2,3,4,5,6,7 模数列表 默认为OFF,VFP C++编译软件不展开内联函数。 如果设置为ON,VFP C++编译软件展开内联函数。 展开次数:默认为1次,最大为99次。 仅对指定的模数列表中的语句有效。 37、/VCANTIDISASM=ON|OFF 是否防止反汇编(不支持64位程序) /VCANTIDISASMMODLIST=0,1,2,3,4,5,6,7 模数列表 默认为OFF,VFP C++编译软件不生成防止反汇编代码。 如果设置为ON,VFP C++编译软件生成防止反汇编代码。 仅对指定的模数列表中的语句有效。 38、/VCANTIDECOMPILE=ON|OFF 是否防止反编译(仅支持Visual FoxPro Advanced) 默认为OFF,VFP C++编译软件不生成防止反编译代码。 如果设置为ON,VFP C++编译软件生成防止反编译代码。 39、/VCMOVE=ON|OFF 是否移动语句 /VCMOVELEVEL=n 移动次数 /VCMOVEMODLIST=0,1,2,3,4,5,6,7 模数列表 默认为OFF,VFP C++编译软件不移动语句。 如果设置为ON,VFP C++编译软件移动语句。 所谓移动语句,是指把语句: statement 移动为: =[GOTO FOXRUN_GOTO_LABEL_XXX_START] =[FOXRUN_GOTO_LABEL_XXX_END:] ... =[FOXRUN_GOTO_LABEL_XXX_START:] statement =[GOTO FOXRUN_GOTO_LABEL_XXX_END] 移动次数:默认为1次,最大为99次。 仅对指定的模数列表中的语句有效。 40、/VCMOVEGOTO=ON|OFF 是否移动GOTO语句 /VCMOVEGOTOMODLIST=0,1,2,3,4,5,6,7 模数列表 默认为OFF,VFP C++编译软件不移动GOTO语句。 如果设置为ON,VFP C++编译软件移动GOTO语句。 仅对指定的模数列表中的语句有效。 41、/VCFASTMOVE=ON|OFF 是否快速移动语句 /VCFASTMOVELEVEL=n 快速移动次数 /VCFASTMOVEMODLIST=0,1,2,3,4,5,6,7 模数列表 默认为OFF,VFP C++编译软件不快速移动语句。 如果设置为ON,VFP C++编译软件快速移动语句。 快速移动次数:默认为1次,最大为99次。 仅对指定的模数列表中的语句有效。 42、/VCNOTMOVE=ON|OFF 是否不移动语句 /VCNOTMOVEMODLIST=0,1,2,3,4,5,6,7 模数列表 默认为OFF,VFP C++编译软件移动语句。 如果设置为ON,VFP C++编译软件不移动语句。 仅对指定的模数列表中的语句有效。 43、/VCREENCRYPT=ON|OFF 是否运行时再次加密代码 /VCREENCRYPTMODLIST=0,1,2,3,4,5,6,7 模数列表 默认为OFF,即运行时不再次加密代码。 如果设置为ON,代码的安全性更高,但运行速度略有降低。 仅对指定的模数列表中的代码有效。 44、/VCFASTENCRYPT=ON|OFF 是否快速加密代码 /VCFASTENCRYPTMODLIST=0,1,2,3,4,5,6,7 模数列表 默认为OFF,VFP C++编译软件不快速加密代码。 如果设置为ON,VFP C++编译软件仅加密代码中的部分字节,加密、解密速度略快, 运行速度略快。 仅对指定的模数列表中的代码有效。 45、/VCNOTENCRYPT=ON|OFF 是否不加密代码 /VCNOTENCRYPTMODLIST=0,1,2,3,4,5,6,7 模数列表 默认为OFF,VFP C++编译软件加密代码。 如果设置为ON,VFP C++编译软件生成的C代码文件较小,节约编译时间;运行时不需 解密代码,运行速度略快。 仅对指定的模数列表中的代码有效。 46、/VCENCRYPTPCODE=ON|OFF 是否加密伪代码(P-CODE) /VCENCRYPTPCODEMODLIST=0,1,2,3,4,5,6,7 模数列表 默认为OFF,VFP C++编译软件不加密伪代码(P-CODE)。 如果设置为ON,VFP C++编译软件加密伪代码(P-CODE)。 仅对指定的模数列表中的代码有效。 47、/VCFASTENCRYPTPCODE=ON|OFF 是否快速加密伪代码(P-CODE) /VCFASTENCRYPTPCODEMODLIST=0,1,2,3,4,5,6,7 模数列表 默认为OFF,VFP C++编译软件不快速加密伪代码(P-CODE)。 如果设置为ON,VFP C++编译软件快速加密伪代码(P-CODE),加密、解密速度略快, 运行速度略快。 仅对指定的模数列表中的代码有效。 48、/VCNOTENCRYPTPCODE=ON|OFF 是否不加密伪代码(P-CODE) /VCNOTENCRYPTPCODEMODLIST=0,1,2,3,4,5,6,7 模数列表 默认为OFF,VFP C++编译软件加密伪代码(P-CODE)。 如果设置为ON,VFP C++编译软件不加密伪代码(P-CODE)。运行时不需解密 伪代码(P-CODE),运行速度略快。 仅对指定的模数列表中的代码有效。 49、/VCINSERTINITCODE=ON|OFF 是否插入初始化代码 默认为OFF,VFP C++编译软件不插入初始化代码。 如果设置为ON,VFP C++编译软件插入初始化代码文件(<项目名称>.VCI)中 指定的初始化代码。 50、/VCADDPROC=ON|OFF 是否载入附加过程文件 /VCADDPROCLIST=... 附加过程文件列表 默认为OFF,VFP C++编译软件不载入附加过程文件。 如果设置为ON,VFP C++编译软件载入附加过程文件列表中指定的过程文件。 51、/VCADDFLL=ON|OFF 是否载入附加库文件 /VCADDFLLLIST=... 附加库文件列表 默认为OFF,VFP C++编译软件不载入附加库文件。 如果设置为ON,VFP C++编译软件载入附加库文件列表中指定的库文件。 52、/VCNOTCOMPILEFILELIST=... 不编译文件列表 指定不编译文件列表。 53、/VCNEWNAMEMODE=n 创建名称表索引模式(仅支持Visual FoxPro Advanced) 对于Visual FoxPro Advanced,可以选择创建名称表索引模式: 0 - 旧模式创建名称表索引 1 - 新模式创建名称表索引 2 - 自动模式创建名称表索引 为编译生成兼容性最好的代码,请参考以下设置: /VCKEYWORD=OFF ; 不编译关键字 /VCNAME=OFF ; 不编译变量名称 /VCSCXINIT=OFF ; 不把表单对象属性转换为INIT事件代码 /VCFRXINIT=OFF ; 不把报表表达式转换为数据环境INIT事件代码 /VCEXPANDEXPEVALUATE=OFF ; 不使用EVALUATE()函数扩展表达式 /VCEXPANDEXPCHR=OFF ; 不使用CHR()函数扩展表达式 /VCEXPANDEXP=OFF ; 不使用IIF()函数扩展表达式 /VCDECOMPCOND=OFF ; 不分解复合条件语句 /VCEXPANDINLINE=OFF ; 不展开内联函数 /VCANTIDISASM=OFF ; 不防止反汇编 /VCMOVE=OFF ; 不移动语句 为编译生成文件大小最小的代码,请参考以下设置: /VCENCRYPT=OFF ; 不加密可执行文件 /VCPACKEXE=ON ; 压缩可执行文件 /VFPLIB=OFF ; 不包含VFP运行库 /VCLIB=OFF ; 不包含VC运行库 /VCPACKDLL=ON ; 压缩动态链接库文件 为编译生成运行速度最快的代码,请参考以下设置: /VCKEYWORD=OFF ; 不编译关键字 /VCSCXINIT=OFF ; 不把表单对象属性转换为INIT事件代码 /VCFRXINIT=OFF ; 不把报表表达式转换为数据环境INIT事件代码 /VCEXPANDEXPEVALUATE=OFF ; 不使用EVALUATE()函数扩展表达式 /VCEXPANDEXPCHR=OFF ; 不使用CHR()函数扩展表达式 /VCEXPANDEXP=OFF ; 不使用IIF()函数扩展表达式 为编译生成加密强度最高的代码,请参考以下设置: /VCLEVEL=3 ; 编译加密级别 /VCENCRYPT=ON ; 加密可执行文件 /VCPACKEXE=ON ; 压缩可执行文件 /VCPACKDLL=ON ; 压缩动态链接库文件 /VCKEYWORD=ON ; 编译关键字 /VCNAME=ON ; 编译变量名称 /VCSCXINIT=ON ; 把表单对象属性转换为INIT事件代码 /VCFRXINIT=ON ; 把报表表达式转换为数据环境INIT事件代码 /VCEXPANDEXPEVALUATE=ON ; 使用EVALUATE()函数扩展表达式 /VCEXPANDEXPEVALUATELEVEL=3 ; 扩展次数 /VCEXPANDEXPCHR=ON ; 使用CHR()函数扩展表达式 /VCEXPANDEXPCHR_L=20 ; 左扩展字符最大个数 /VCEXPANDEXPCHR_R=30 ; 右扩展字符最大个数 /VCEXPANDEXP=ON ; 使用IIF()函数扩展表达式 /VCEXPANDEXP_IIF_T=20 ; 使用IIF(.T.最大个数 /VCEXPANDEXP_IIF_F=30 ; 使用IIF(.F.最大个数 /VCDECOMPCOND=ON ; 分解复合条件语句 /VCEXPANDINLINE=ON ; 展开内联函数 /VCEXPANDINLINELEVEL=3 ; 展开次数 /VCANTIDISASM=ON ; 防止反汇编 /VCMOVE=ON ; 移动语句 /VCMOVELEVEL=3 ; 移动次数 /VCMOVEGOTO=ON ; 移动GOTO语句 /VCREENCRYPT=ON ; 运行时再次加密代码 /VCENCRYPTPCODE=ON ; 加密伪代码(P-CODE) /-------------------------\ | 第 六 章 扩 展 代 码 | \-------------------------/ 一、代码杂注 通常,C/C++代码中可以加入一些杂注来控制编译选项,如#pragma optimize等。 同样,我们也可以在VFP代码中加入下面的杂注来控制VFP C++编译软件编译选项: =[FOXRUN ON] =[FOXRUN OFF] VFP C++编译软件扫描到=[FOXRUN OFF],其后的代码不编译,直到遇到=[FOXRUN ON]。 我们还可以在VFP代码中加入下面的杂注来控制VFP C++编译软件单步编译选项: =[FOXSTEP ON] =[FOXSTEP OFF] VFP C++编译软件扫描到=[FOXSTEP OFF],其后的代码不单步编译,直到遇到=[FOXSTEP ON]。 二、标号和GOTO语句 可以使用标号和GOTO语句,例如: =[LABEL1:] =[GOTO LABEL1] 使用GOTO语句注意事项: GOTO语句只能跳转到函数体内,不能跨函数跳转。 三、内联函数 可以用以下格式申明内联函数: * inline [PROCEDURE | FUNCTION] pabc 使用内联函数注意事项: 如果在内联函数中使用#DEFINE预处理语句定义了常量,需要在内联函数中使用 #UNDEF预处理语句取消已定义的常量,否则展开内联函数后编译时会发生“常量已经 用#DEFINE定义”错误。 通常,仅展开下列命令中的内联函数: ? @ \ | \\ = IF CASE DO WHILE RETURN STORE WAIT 四、内联C语句 可以使用内联C语句,例如: =[__C MessageBoxA(0,mytext,mytitle,0);] 五、内联汇编语句(不支持64位程序) 可以使用内联汇编语句,例如: =[__ASM CALL MessageBoxA] 六、包含C文件 可以包含C文件,例如: =[INCLUDE VCTEST.C] 七、包含汇编文件(不支持64位程序) 可以包含汇编文件,例如: =[INCLUDEASM VCTEST.ASM] 八、局部编译选项 可以用以下格式设置局部编译选项: =[VCOPTION 编译选项] 可以用以下格式恢复全局编译选项: =[VCOPTION $(DEFAULT)] /-------------------------\ | 第 七 章 特 殊 代 码 | \-------------------------/ 一、代码更改: SET LIBRARY TO FileName 被自动更改为: SET LIBRARY TO FileName ADDITIVE SET DATASESSION TO nDataSessionNumber 被自动更改为: SET DATASESSION TO nDataSessionNumber SET TALK OFF 二、下列命令编译后可能会有问题: RETRY RETURN TO 请参考示例程序VCTEST_RETRY\VCTEST.PRG、VCTEST_RETURN_TO\VCTEST.PRG。 三、错误处理程序问题: ON ERROR DO perrorun WITH ERROR(),MESS(),MESS(1),SYS(16),LINENO() 请参考示例程序VCTEST_ON_ERROR\PERRORUN.PRG。 四、字段名称冲突问题: 请参考示例程序VCTEST_FIELD\VCTEST.PRG。 五、递归调用问题: 请参考示例程序VCTEST_GETNEXTID\F_GETNEXTID.PRG。 六、API函数库合并编译问题: 请参考示例程序VCTEST_ADD\FOXRUN.H、VCTEST_ADD\VCTEST.PRG。 七、版本信息问题: 请参考示例版本信息文件VCTEST\VERSIONINFO.TXT。 八、下列命令必须显式运行,不能以宏替换方式运行: RETURN RETRY SUSPEND RESUME CANCEL QUIT READ EVENTS CLEAR EVENTS DOEVENTS ERROR ON ERROR ON SHUTDOWN SET LIBRARY RELEASE LIBRARY SET PROCEDURE RELEASE PROCEDURE CLEAR ALL CLEAR PROGRAM CLEAR MEMORY RELEASE ALL CLOSE ALL CLOSE PROCEDURE PRIVATE ALL 所谓以宏替换方式运行,是指: x1="RETURN" &x1 九、下列命令必须显式运行,不能以宏替换方式运行,运行时亦被忽略: APPEND PROCEDURES ASSERT BUILD APP BUILD EXE BUILD PROJECT CREATE FORM CREATE MENU CREATE QUERY CREATE SCREEN CREATE VIEW DEBUGOUT MODIFY CONNECTION MODIFY DATABASE MODIFY FORM MODIFY MENU MODIFY PROCEDURE MODIFY PROJECT MODIFY QUERY MODIFY SCREEN MODIFY VIEW SET DEBUG SET DEVELOPMENT SET DOHISTORY SET ECHO SET LIBRARY TO SET STEP /-------------------------\ | 第 八 章 编 译 对 比 | \-------------------------/ ┌───────┬─────────────┬─────────────┐ │编译项目 │Masm、C/C++、Delphi编译器 │VFP C++编译软件 │ ├───────┼─────────────┼─────────────┤ │变量名、函数名│编译为地址 │编译为NTI序号 │ ├───────┼─────────────┼─────────────┤ │结构化命令 │编译为JA/JB/JMP等汇编命令 │编译为JA/JB/JMP等汇编命令 │ ├───────┼─────────────┼─────────────┤ │目标文件 │编译生成EXE文件 │编译生成EXE文件和DLL文件 │ ├───────┼─────────────┼─────────────┤ │目标文件压缩性│可使用UPX等压缩软件压缩 │可使用UPX等压缩软件压缩 │ ├───────┼─────────────┼─────────────┤ │VC运行库 │MSVCR*.DLL │MSVCR*.DLL、VFPCORE.DLL │ ├───────┼─────────────┼─────────────┤ │API函数库 │KERNEL32.DLL、USER32.DLL │VFP?R.DLL、VFP?R???.DLL │ └───────┴─────────────┴─────────────┘ /-------------------------\ | 第 九 章 其 它 事 项 | \-------------------------/ VFP C++编译软件从理论上彻底避免了编译生成的可执行文件被反编译的可能。相信随着 VFP C++编译软件的流行,ReFox、UnFoxAll、VFPDecoder、FoxTools等VFP反编译软件将会逐步 消失。当然,编译与反编译、加密与解密永远都是矛和盾的关系,如Soft-ICE、OllyDbg、 W32Dasm等汇编语言级的反汇编软件仍然是Cracker们手中的利器。 VFP C++编译软件编译生成的可执行文件是绿色软件,发布时不需附带VFP运行库文件。 欢迎光临http://www.baiyujia.com网站下载最新版本VFP C++编译软件。 如有关于VFP C++编译软件的问题或建议,请向ccb2000@163.com发邮件。 |