-----------------------------------------------
                  VFP C++编译软件(VFP C++ Compiler)常见问题
                                2017 年 01 月
                -----------------------------------------------
                深圳市百誉佳软件技术有限公司版权所有,2000-2017



一、试用版下载:

    1、下载VFP C++ Compiler [DEMO VERSION 2017]:
    http://www.baiyujia.com/f_downloadproc_vc.asp

    2、请使用7-Zip解压文件,下载7-Zip:
    http://www.7-zip.org


二、“C/C++编译错误”原因分析:

    1、对于Visual C++ 6.0(或Visual Studio 98),请安装Visual C++ 6.0 Processor Pack。

    请先安装Visual C++ 6.0 SP5,然后安装Visual C++ 6.0 Processor Pack,然后安装Visual
C++ 6.0 SP6。

    如果未安装Visual C++ 6.0 Processor Pack,请选择数据对齐:1字节。

    2、C/C++编译器文件选择FOXRUN8\MAKE.BAT(Visual C++ 8.0)时:

    由于Visual C++ 8.0(及以后版本)在Windows XP(及以后版本)下更改了VC运行库的部署方式:
以前版本一般放在C:\Windows\System32文件夹下即可,现在需要安装Microsoft .NET Framework 2.0
或Microsoft Visual C++ 2005 Redistributable Package,VC运行库放在C:\Windows\Winsxs文件夹下,
可以多个版本并存。

    Visual C++ 8.0编译生成的应用程序发布时一般也需要安装Microsoft .NET Framework 2.0或
Microsoft Visual C++ 2005 Redistributable Package。如果希望编译成“绿色软件”,需要把
MICROSOFT.VC80.CRT.MANIFEST、MSVCR80.DLL拷贝到应用程序所在文件夹下,而且VC运行库
版本号要正确,否则不能启动应用程序。

    对于VFP开发的应用程序,使用Visual C++ 8.0编译器或Visual C++ 7.0/6.0编译器没有大的
区别。如果我们熟悉.NET开发工具,可以使用Visual C++ 8.0编译器,生成的应用程序发布时请附带
Microsoft .NET Framework 2.0或Microsoft Visual C++ 2005 Redistributable Package。如果
我们对.NET开发工具不太熟悉,建议使用Visual C++ 7.0/6.0编译器生成应用程序。

    C/C++编译器版本和VFP版本并无直接联系。换言之,使用VFP 6.0开发的应用程序,可以使用
Visual C++ 8.0编译器;使用VFP 8.0开发的应用程序,也可以使用Visual C++ 6.0编译器。


三、编译速度:

    测试1:AMD Sempron 2600+ 1.6G、512MB内存、Windows 2000环境下,编译生成20MB的EXE文件
和20MB的DLL文件需要10分钟左右。

    测试2:Intel Core 2 Duo P7350 2.0G、2GB内存、Windows XP环境下,编译生成20MB的EXE文件
和50MB的DLL文件需要30分钟左右。

    测试3:Intel Core 2 Duo P7350 2.0G、2GB内存、Windows XP环境下,编译生成60MB的EXE文件
和300MB的DLL文件需要6小时左右。

    Visual C++ 6.0/7.0/8.0/9.0/10.0编译器的编译时间比约为9.5:1.0:1.5:1.2:1.2,因此,
建议使用Visual C++ 7.0编译器以获得较快的编译速度。

    试用版未做优化处理,正式版本可以提高1倍以上的编译速度。


四、运行库文件参考:

    ┌─────┬──────┬──────┬───────────────┬───────┐
    │ VFP \ VC │  VC 6.0    │  VC 7.0    │    VC 8(9).0                 │ VC 10(11,12) │
    ├─────┼──────┼──────┼───────────────┼───────┤
    │ VFP 6.0  │VFP6R.DLL   │VFP6R.DLL   │VFP6R.DLL                     │VFP6R.DLL     │
    │          │VFP6RCHS.DLL│VFP6RCHS.DLL│VFP6RCHS.DLL                  │VFP6RCHS.DLL  │
    │          │VFPCORE.DLL │VFPCORE.DLL │VFPCORE.DLL                   │VFPCORE.DLL   │
    │          │            │MSVCR70.DLL │MSVCR8(9)0.DLL                │MSVCR100.DLL  │
    │          │            │            │MICROSOFT.VC8(9)0.CRT.MANIFEST│(MSVCR110.DLL)│
    │          │            │            │                              │(MSVCR120.DLL)│
    ├─────┼──────┼──────┼───────────────┼───────┤
    │ VFP 7.0  │VFP7R.DLL   │VFP7R.DLL   │VFP7R.DLL                     │VFP7R.DLL     │
    │          │VFP7RCHS.DLL│VFP7RCHS.DLL│VFP7RCHS.DLL                  │VFP7RCHS.DLL  │
    │          │VFPCORE.DLL │VFPCORE.DLL │VFPCORE.DLL                   │VFPCORE.DLL   │
    │          │MSVCR70.DLL │MSVCR70.DLL │MSVCR70.DLL                   │MSVCR70.DLL   │
    │          │            │            │MSVCR8(9)0.DLL                │MSVCR100.DLL  │
    │          │            │            │MICROSOFT.VC8(9)0.CRT.MANIFEST│(MSVCR110.DLL)│
    │          │            │            │                              │(MSVCR120.DLL)│
    ├─────┼──────┼──────┼───────────────┼───────┤
    │ VFP 8.0  │VFP8R.DLL   │VFP8R.DLL   │VFP8R.DLL                     │VFP8R.DLL     │
    │          │VFP8RCHS.DLL│VFP8RCHS.DLL│VFP8RCHS.DLL                  │VFP8RCHS.DLL  │
    │          │VFPCORE.DLL │VFPCORE.DLL │VFPCORE.DLL                   │VFPCORE.DLL   │
    │          │MSVCR70.DLL │MSVCR70.DLL │MSVCR70.DLL                   │MSVCR70.DLL   │
    │          │            │            │MSVCR8(9)0.DLL                │MSVCR100.DLL  │
    │          │            │            │MICROSOFT.VC8(9)0.CRT.MANIFEST│(MSVCR110.DLL)│
    │          │            │            │                              │(MSVCR120.DLL)│
    ├─────┼──────┼──────┼───────────────┼───────┤
    │ VFP 9.0  │VFP9R.DLL   │VFP9R.DLL   │VFP9R.DLL                     │VFP9R.DLL     │
    │          │VFP9RCHS.DLL│VFP9RCHS.DLL│VFP9RCHS.DLL                  │VFP9RCHS.DLL  │
    │          │VFPCORE.DLL │VFPCORE.DLL │VFPCORE.DLL                   │VFPCORE.DLL   │
    │          │MSVCR71.DLL │MSVCR71.DLL │MSVCR71.DLL                   │MSVCR71.DLL   │
    │          │            │MSVCR70.DLL │MSVCR8(9)0.DLL                │MSVCR100.DLL  │
    │          │            │            │MICROSOFT.VC8(9)0.CRT.MANIFEST│(MSVCR110.DLL)│
    │          │            │            │                              │(MSVCR120.DLL)│
    ├─────┼──────┼──────┼───────────────┼───────┤
    │ VFP Adv. │VFPAR.DLL   │VFPAR.DLL   │VFPAR.DLL                     │VFPAR.DLL     │
    │          │VFPCORE.DLL │VFPCORE.DLL │VFPCORE.DLL                   │VFPCORE.DLL   │
    │          │MSVCR71.DLL │MSVCR71.DLL │MSVCR71.DLL                   │MSVCR71.DLL   │
    │          │            │MSVCR70.DLL │MSVCR8(9)0.DLL                │MSVCR100.DLL  │
    │          │            │            │MICROSOFT.VC8(9)0.CRT.MANIFEST│(MSVCR110.DLL)│
    │          │            │            │                              │(MSVCR120.DLL)│
    ├─────┼──────┼──────┼───────────────┼───────┤
    │ VFP Adv. │N/A         │N/A         │N/A                           │VFPAR.DLL     │
    │ (x64)    │            │            │                              │VFPCORE.DLL   │
    │          │            │            │                              │MSVCR100.DLL  │
    │          │            │            │                              │(MSVCR110.DLL)│
    │          │            │            │                              │(MSVCR120.DLL)│
    └─────┴──────┴──────┴───────────────┴───────┘

    如果使用Visual C++ 8.0编译器,需要把MICROSOFT.VC80.CRT.MANIFEST、MSVCR80.DLL拷贝到应用
程序所在文件夹下。

    如果使用Visual C++ 9.0编译器,需要把MICROSOFT.VC90.CRT.MANIFEST、MSVCR90.DLL拷贝到应用
程序所在文件夹下。

    其它运行库文件可以拷贝到:
    1、应用程序文件夹,
    2、或Windows系统文件夹,
    3、或C:\Program Files\Common Files\Microsoft Shared\VFP。

    重要提示:
    1、Visual C++ 10.0编译生成的软件仅运行于Windows XP SP2及以后平台。
    2、Visual C++ 11.0编译生成的软件仅运行于Windows Vista及以后平台。
    3、Visual C++ 11.0 Update 1及以后更新编译生成的软件仅运行于Windows XP SP2及以后平台。
    4、Visual C++ 12.0编译生成的软件仅运行于Windows XP SP2及以后平台。


五、“<项目名称>.DLL不是Visual Foxpro的EXE文件”问题:

    参考前述“C/C++编译错误”原因分析。

    “<项目名称>.DLL不是Visual Foxpro的EXE文件”问题解决方法:

    如果使用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拷贝到应用程序所在文件夹下。


六、“资源文件不匹配”原因分析:

    VFP9R.DLL的搜索顺序:
    1、应用程序文件夹,
    2、注册表(HKEY_CLASSES_ROOT\VisualFoxProRuntime.9\Shell\Open\Command),
    3、Windows系统文件夹。

    VFP9RCHS.DLL的搜索顺序:
    先LoadLibrary VFP9RCHS,搜索顺序:
    1、应用程序文件夹,
    2、Windows系统文件夹,
    3、PATH环境变量指定的文件夹。
    如果LoadLibrary VFP9RCHS失败,再搜索:
    4、注册表(HKEY_CLASSES_ROOT\VisualFoxProRuntime.9\Shell\Open\Command)。

    VFP9R.DLL和VFP9RCHS.DLL的搜索顺序不一致,是造成“资源文件不匹配”问题的根本原因。

    最常见的情况是:
    ┌──────────┬──────┬──────┬─────┐
    │搜索到VFP运行库位置 │ VFP9R.DLL  │VFP9RCHS.DLL│ 匹配结果 │
    ├──────────┼──────┼──────┼─────┤
    │应用程序文件夹      │   1)x      │   1)x      │          │
    ├──────────┼──────┼──────┼─────┤
    │注册表              │   2)ok     │            │          │
    ├──────────┼──────┼──────┼─────┤
    │Windows系统文件夹   │            │   2)ok     │  error   │
    └──────────┴──────┴──────┴─────┘

    即:在注册表搜索到VFP9R.DLL,但在Windows系统文件夹优先搜索到VFP9RCHS.DLL,
    如果这两个文件版本不一致,就会发生“资源文件不匹配”错误!

    “资源文件不匹配”问题解决方法:

    VFP安装时默认把运行库文件安装到:
    C:\Program Files\Common Files\Microsoft Shared\VFP

    建议同时拷贝到:
    C:\Windows\System32文件夹下
    以避免可能出现的“资源文件不匹配”问题。

    VFP C++编译软件已经把VFP9R.DLL的搜索顺序调整为:
    1、应用程序文件夹,
    2、Windows系统文件夹,
    3、注册表(HKEY_CLASSES_ROOT\VisualFoxProRuntime.9\Shell\Open\Command)。

    这样VFP9R.DLL和VFP9RCHS.DLL的搜索顺序一致,可以避免出现“资源文件不匹配”问题。


七、兼容性问题:

    在Windows 98上有时出现“API call caused an exception”。

    在Windows 2000上偶尔出现“API call caused an exception”。

    Windows XP:暂未出现错误。

    Windows 8.1、Windows Defender,
    如果VFP C++编译软件运行很慢,请设置排除文件夹:
    1、VFP C++编译软件安装文件夹(C:\Program Files\Baiyujia VFP C++ Compiler),
    2、应用程序文件夹,
    3、临时文件夹(C:\Users\xxx\AppData\Local\Temp)。


八、杀毒软件兼容性问题:
    ┌──────────┬─────────────┬─────────────┐
    │杀毒软件名称        │   编译生成的可执行文件   │ 编译生成的动态链接库文件 │
    ├──────────┼─────────────┼─────────────┤
    │Avast               │            ok            │            ok            │
    ├──────────┼─────────────┼─────────────┤
    │Avira (小红伞)      │            ok            │            ok            │
    ├──────────┼─────────────┼─────────────┤
    │ESET NOD32          │            ok            │            ok            │
    ├──────────┼─────────────┼─────────────┤
    │Norton (诺顿)       │            ok            │            ok            │
    ├──────────┼─────────────┼─────────────┤
    │Kingsoft (金山毒霸) │            ok            │            ok            │
    ├──────────┼─────────────┼─────────────┤
    │QQPCMgr (QQ电脑管家)│            ok            │            ok            │
    ├──────────┼─────────────┼─────────────┤
    │360sd               │不压缩:ok                │不压缩:ok                │
    │                    │压缩:QVM11.1.Malware.Gen?│压缩:QVM31.1.Malware.Gen?│
    └──────────┴─────────────┴─────────────┘


九、运行速度问题:

    通常情况下,运行速度相当于单步运行VFP代码速度。

    在优化编译的情况下,运行速度接近于VFP自然编译运行速度,部分语句(如x=x+1等)优化编译后
比VFP自然编译运行速度更快。

    对于某些不能优化的语句,运行时间与VFP自然编译运行时间之比约为7:1(最坏的情况下)。

    如果某段代码编译后运行速度明显下降(如程序启动、初始化部分的代码),而且我们认为运行速度
最重要,这段代码即使被反编译也不会有太大影响,那么我们可以通过设置编译杂注解决这个问题:
    * 这里的代码会编译进动态链接库
    =[FOXRUN OFF]
    * 下面的代码不会编译进动态链接库
    ……
    =[FOXRUN ON]
    * 这里的代码会编译进动态链接库


十、绿色软件问题:

    如果希望编译成“绿色软件”,请选择“包含VFP运行库”。

    编译生成的软件只需要<项目名称>.EXE和<项目名称>.DLL两个程序文件(及一些数据文件)就可以
在任何电脑上运行(即使那台电脑没有安装VFP运行库),也可以直接在U盘上运行。

    如果使用Visual C++ 8.0编译器,需要把MICROSOFT.VC80.CRT.MANIFEST、MSVCR80.DLL拷贝到应用
程序所在文件夹下。

    如果使用Visual C++ 9.0编译器,需要把MICROSOFT.VC90.CRT.MANIFEST、MSVCR90.DLL拷贝到应用
程序所在文件夹下。

    可以使用MoleBox或Thinstall打包软件打包<项目名称>.DLL以及其它文件(如VFP运行库文件)到
<项目名称>.EXE中。


十一、防止反编译问题:

    编译生成的EXE文件是可以反编译的(如VFP监听程序),由C代码编译生成的DLL文件只能反汇编。

    如果打开调试模式,FOXRUNPRGTEMP1、FOXRUNVCXTEMP1、FOXRUNSCXTEMP1、FOXRUNFRXTEMP1、
FOXRUNLBXTEMP1文件夹下的文件就是最终包含在EXE文件中的文件,而这些文件基本上不包含有用的
VFP源代码。换句话说,即使反编译出EXE文件中的文件,也没有什么使用价值。

    通常,编译生成的DLL文件可达数十MB,其C源代码可达数百MB,反汇编和分析DLL文件将是一项
庞大的、耗时的、很可能没有任何结果和意义的任务。


十二、调试模式:

    如果打开调试模式,VFP C++编译软件会生成编译日志文件并保留编译中间文件,便于分析查找原因。

    编译中间文件包括:

    <项目名称>.VCL:编译日志文件(LOG_FILE);
    <项目名称>.VCD:字典文件(DICTIONARY_LIST_FILE);
    <项目名称>.VCD2:在字符串定界符内的变量名称列表文件(DICTIONARY_LIST_FILE2);
    <项目名称>.VCD3:字段或属性名称列表文件(DICTIONARY_LIST_FILE3);
    <项目名称>.VCDX:不能编译的变量名称列表文件(DICTIONARY_LIST_FILEX);
    <项目名称>.VCN:名称表索引文件(NAME_TABLE_INDEX_FILE);
    <项目名称>.VCK:关键字文件(KEYWORDS_LIST_FILE);

    <项目名称>$VCV$.TMP:类库、表单路径文件(CLASSLOC_FILE);
    <项目名称>$VCM$.TMP:类库、表单代码文件(ALLMETHODS_FILE);
    <项目名称>$VC3$.TMP:类库、表单自定义方法、属性名称文件(ALLRESERVED3_FILE);
    <项目名称>$VCI$.TMP:类库、表单表单Init事件包含PARAMETERS语句文件(ALLINITPARA_FILE);
    <项目名称>$VCE$.TMP:优化代码文件(EXECUTE_FILE);
    <项目名称>$VCN$.TMP:内联函数文件(INLINE_FILE);
    <项目名称>$VCN2$.TMP:已编译的内联函数文件(INLINE_FILE2);
    <项目名称>$VCINCDATA$.TMP:增量编译数据文件(INCREMENTALDATA_FILE);
    <项目名称>$VCINCMEM$.TMP:增量编译内存变量文件(INCREMENTALMEM_FILE);
    <项目名称>$VCINCVCF$.TMP:增量编译编译选项文件(INCREMENTALVCF_FILE);
    <项目名称>$VCTASKDATA$.TMP:多任务编译数据文件(MULTITASKDATA_FILE);
    <项目名称>$VCTASKMEM$.TMP:多任务编译内存变量文件(MULTITASKMEM_FILE);
    <项目名称>$VCTASKVCF$.TMP:多任务编译编译选项文件(MULTITASKVCF_FILE);

    FOXRUNPRGTEMP<n>\*.*:程序类文件
    FOXRUNVCXTEMP<n>\*.*:类库文件
    FOXRUNSCXTEMP<n>\*.*:表单文件
    FOXRUNFRXTEMP<n>\*.*:报表文件
    FOXRUNLBXTEMP<n>\*.*:标签文件


十三、应用程序调试模式:

    如果打开应用程序调试模式,VFP C++编译软件编译生成的应用程序运行时会生成运行日志文件,便于
分析查找原因。

    应用程序运行日志文件包括:

    <项目名称>DEBUG_<计算机名称>.LOG:运行日志文件(APPLICATION_DEBUG_LOG_FILE)。


十四、应用程序错误日志文件:

    通常情况下,VFP C++编译软件编译生成的应用程序运行发生错误时仅返回一段代码的最后一个错误信息。
    如果打开应用程序错误日志文件,VFP C++编译软件编译生成的应用程序运行发生错误时会生成所有错误
日志文件,便于分析查找原因。

    应用程序错误日志文件包括:

    <项目名称>ERROR_<计算机名称>.LOG:错误日志文件(APPLICATION_ERROR_LOG_FILE)。


十五、保留字:

    如果变量名称与下列保留字(RESERVED WORDS)相同,将不做替换处理:

    单个字母名称;
    以下划线开头的名称;
    以_ACCESS结尾的名称;
    以_ASSIGN结尾的名称;
    VFP保留字(关键字);
    FOXTOOLS.FLL函数名;
    常用WIN32API函数名;
    DECLARE-DLL语句申明的API函数名(DECLARE_FUNCTION_LIST);
    CREATE TABLE|DBF语句中的字段名称(CREATE_FIELD_LIST);
    GetProfileString、GetPrivateProfileString语句中的条目名称(PROFILE_KEY_LIST);
    SELECT-SQL语句中的AS字段名称(AS_FIELD_LIST);
    项目文件夹及其子文件夹下的文件名(FILENAME);
    项目文件夹及其子文件夹下的表文件的字段名称(FIELD_NAME);
    项目文件夹及其子文件夹下的数据库中的视图参数名称(DBC_VIEW_PARAMETERS);
    项目文件夹及其子文件夹下的配置文件中的条目名称(KEY_NAME_IN_INIFILE);
    项目文件夹及其子文件夹下的内存变量文件中的变量名称(VARIABLE_NAME_IN_MEMFILE);
    项目中包含的FXP/APP/EXE文件中的变量名称(VARIABLE_NAME_IN_APPFILE);
    项目中包含的FXP/APP/EXE文件中的过程名称(PROCEDURE_NAME_IN_APPFILE);
    项目中包含的FXP/APP/EXE文件中的类名称(CLASS_NAME_IN_APPFILE);
    用户保留字文件(<项目名称>.VCW)中指定的保留字。


十六、编译变量名称:

    所谓编译变量名称,是指把变量名称:
    x1
    x2
    替换为:
    __VC_A
    __VC_B

    VFP C++编译软件只编译用等号赋值过的变量名称(例如:x1=123)。

    对于<项目名称>.VCD2文件中列出的替换后可能有问题的语句,例如:
    cancelar Caption = "Cancelar"
    建议选择“不编译在字符串定界符内的变量名称”,
    这样所有的在字符串定界符内的变量名称(包括cancelar)都不做替换处理。

    对于<项目名称>.VCD3文件中列出的替换后可能有问题的语句,例如:
    fld1 ?STR(t1.fld1,10)
    建议选择“不编译字段或属性名称”,
    这样所有的字段或属性名称(包括fld1)都不做替换处理。

    也可以采用以下解决方法:

    1、可以选择“不编译用户保留字文件中指定的变量名称”,
    并在用户保留字文件(<项目名称>.VCW)中添加一个用户保留字:cancelar,
    这样所有的cancelar都不做替换处理。

    2、可以在把该控件的Caption属性改为"C"+"ancelar",例如:
    Caption = ("C"+"ancelar")
    该控件的Caption属性已无cancelar,但其它地方的cancelar仍将做替换处理。

    3、可以选择“仅编译用户变量名称文件中指定的变量名称”,
    并在用户变量名称文件(<项目名称>.VCV)中添加需要编译的变量名称。


十七、VFP C++编译软件32位版本和VFP C++编译软件64位版本:

    1、VFP C++编译软件32位版本:
    VFP C++编译软件32位版本可运行于32位或64位Windows。
    VFP C++编译软件32位版本运行于32位Windows时,支持Visual FoxPro 6.0、
Visual FoxPro 7.0、Visual FoxPro 8.0、Visual FoxPro 9.0、Visual FoxPro Advanced
版本,仅可编译生成Win32可执行程序。
    VFP C++编译软件32位版本运行于64位Windows时,支持Visual FoxPro 6.0、
Visual FoxPro 7.0、Visual FoxPro 8.0、Visual FoxPro 9.0、Visual FoxPro Advanced、
Visual FoxPro Advanced (x64)版本,可编译生成Win32/Win64可执行程序。

    2、VFP C++编译软件64位版本:
    VFP C++编译软件64位版本仅可运行于64位Windows。
    VFP C++编译软件64位版本运行于64位Windows时,支持Visual FoxPro 6.0、
Visual FoxPro 7.0、Visual FoxPro 8.0、Visual FoxPro 9.0、Visual FoxPro Advanced、
Visual FoxPro Advanced (x64)版本,可编译生成Win32/Win64可执行程序。


十八、参考网站:

    1、百誉佳网站:
    http://www.baiyujia.com

    2、梅子论坛:
    http://www.mzvfp.com/read.php?tid=72598
    http://www.mzvfp.com/read.php?tid=86545

    3、foxite论坛:
    http://www.foxite.com/archives/who-can-hack-this-one-0000260349.htm
    http://www.foxite.com/archives/hook-me-how-easy-to-break-this-0000246991.htm
    http://www.foxite.com/archives/new-functions-of-vfp-compiler-c-asm-0000280713.htm
    http://www.foxite.com/archives/vfp-compiler-demo-0000318456.htm


十九、其它问题:

    如有关于VFP C++编译软件的问题或建议,请向ccb2000@163.com发邮件。