瓜哥教我VS2015开发FLL,VFP混合C语言怎么样?

加菲猫的VFP 2022-03-10 15:13:14

作者:瓜哥,网名木瓜,myfll(通用扩展库)作者,很多人都得益于他的FLL类库,自myfll之后,他又做了myimg(图像库),foxjson(json解析库),fws(CGI库),是位名副其实的技术大拿,猫猫也在瓜哥的帮助下受益良多。现在瓜哥也在狐友会社群里面活跃,社群每月直播分享会即将启动。

1.使用向导创建win32项目,为了跟vc6区分,这个放在了D盘

这一步要选择类型为dll,空项目

然后再项目上点右键添加一个代码文件:

把pro_ext.h 和winapims.lib两个文件拷到main.cpp所在位置的lib下(方便把自己的代码跟库区分)

然后把代码复制过来,然后修改项目配置:


同样,也要修改release的版本的配置


另外,VS2008以上版本的调试,需要手动指定,如下图:
这里可以点右边的箭头找到VFP9.exe的位置

此时,配置完成,可以按F5直接运行开始调试,在要需要设置断点的代码按下F9,运行到这里就会转到调试状态。

VS2015生成发行版本,同样是生成->批生成,选择x86的release版本即可

最终VS2015的项目结构如下


与VC6的目录结构不同,多了一层项目文件夹
其他版本其实都差不多,可以参照这两个版本的配置。

创建FLL项目总结:
1.创建标准的DLL空工程
2.复制VFP两个文件到自己的工程(实际上如果你熟练使用后,可以把头文件和库文件复制到VC默认的include和lib文件夹,这样不用每个项目去复制了。)
3.修改配置,关键是修改动态连接C运行库 /MD和 调用约定 __fastcall
4.修改调试的方式,即默认启动VFP,在VFP里我们手动调用DLL

六.用一个完整功能函数进一步了解FLL开发
上面只是FLL基本框架,代码部分需要学习C/C++语法才可以,不明白的地方就网上搜一下。

FLL的核心是需要一个全局变量 _FoxTable ,它在pro_ext.h中定义,winapims.lib中声明,需要你自己编写它的实体,

FoxTable的定义如下:

这个结构体声明了你这个FLL有多少个函数,函数的地址在哪里,即FoxInfo结构

所以,在这个代码上面,定义了FoxInfo数组:


FoxInfo的定义如下:

funcName:vfp调用时的函数名字
function: C中的函数地址(函数名)
parmCount:参数的个数
parmTypes:每个参数的类型
对于这些更加详细的介绍,可以参阅VFP的帮助文档:

能够被VFP调用的C函数,标准格式如下:

void 函数名(ParamBlk* parm)
{
}

函数需要接收一个ParamBlk类型的指针,本身不能有返回值,返回VFP有特定的几个函数_RetXXX开头的函数,在头文件中有声明:

ParamBlk是一个变长数组结构体


其中pCount指明了参数有几个,即FoxParameter p[]多少个
FoxParameter是一个联合体,VFP中以值传递时,我们需要用Value访问,如果VFP是以引用传递时,需要用Locator访问

下面以再添加一个函数为例演示接收参数和返回结果。
我们在VFP端输入一个整型参数和一个字符参数,FLL返回两者连接后的结果:
VFP调用为 IntAndStr(123,”test”) 返回结果是 123test

1.先添加一个C函数和函数列表

这里演示了VFP调用名字跟C中函数名不同的用法,因为C的函数名最终都编译为地址,用什么名字都无所谓,FoxInfo结构第一个即VFP端函数名字,第二个是C端的函数名,第三个2 表示此函数接收两个参数,最后一个“IC”分别表示,第一个参数为I只接收整型,第二个参数C只接受字符型,如果你在VFP端传递了不符合要求的类型,在VFP端就会报错,参数错误。


现在来写具体代码:

void test2(ParamBlk* parm)
{
    //获取整型参数
    int   p1=parm->p[0].val.ev_long;

    //获取字符型参数
    int len=parm->p[1].val.ev_length;//字符串参数的长度
    //C的字符串是以0结尾,而VFP的字符串并不一定是0结果,所以要处理下
    //先设置长度以容纳0,然后修改
    _SetHandSize(parm->p[1].val.ev_handle,len+1);
    char* p2=(char*)_HandToPtr(parm->p[1].val.ev_handle);//获取字符串参数的指针

    p2[len]='\0';

    
    //调用windows api wsprintf连接两个数据
    char buffer[1024];
    wsprintf(buffer,"%d%s",p1,p2);

    _RetChar(buffer); //把字符串结果返回给VFP
    
}

参数的获取主要使用Value结构,只有字符型,需要注意用句柄转换成C指针,还要保证大小 。按F5运行,VFP中就可以调用了:

开发VFP扩展库,需要的基本功能就这些,而具体的每种类型数据的读写,VFP的帮助中写的列详细,具体用到时,查下帮助就可以了。

更多资料:http://www.sn58.cn/

...全文
188 1 打赏 收藏 举报
写回复
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
MW_BO 04-12

木瓜大侠,顶顶有名 好多受益于他的作品

  • 打赏
  • 举报
回复 1
发帖
VFP

2545

社区成员

VFP,是Microsoft公司推出的数据库开发软件,用它来开发数据库,既简单又方便。
社区管理员
  • VFP社区
加入社区
帖子事件
创建了帖子
2022-03-10 15:13
社区公告
暂无公告