VFP混合quickjs开发,嵌入JS引擎还会远吗?

1c81a26666d05ad2878c382cbf1dc25e.gif

VFP里面运行JS,可以利用JS很多很多资源,做到以前不能做到的事情,那今天更高级的混合方式来了,混合quickjs来做一些很酷的工作。

首先来看quickjs引擎能做的工作,将JS文件编译成EXE

1 如下JS文件Hello.js

console.log("Hello World");

2 点开始菜单运行CMD,进行DOS环境,执行如下指令,生成hello.js文件

qjsc -e -o hello.c hello.js

2775b1984cdf403f8a8853590733e6a3.png

生成的hello.c文件

/* File generated automatically by the QuickJS compiler. */


#include "quickjs-libc.h"


const uint32_t qjsc_hello_size = 78;


const uint8_t qjsc_hello[78] = {
 0x02, 0x04, 0x0e, 0x63, 0x6f, 0x6e, 0x73, 0x6f,
 0x6c, 0x65, 0x06, 0x6c, 0x6f, 0x67, 0x16, 0x48,
 0x65, 0x6c, 0x6c, 0x6f, 0x20, 0x57, 0x6f, 0x72,
 0x6c, 0x64, 0x10, 0x68, 0x65, 0x6c, 0x6c, 0x6f,
 0x2e, 0x6a, 0x73, 0x0e, 0x00, 0x06, 0x00, 0xa0,
 0x01, 0x00, 0x01, 0x00, 0x03, 0x00, 0x00, 0x14,
 0x01, 0xa2, 0x01, 0x00, 0x00, 0x00, 0x38, 0xe1,
 0x00, 0x00, 0x00, 0x42, 0xe2, 0x00, 0x00, 0x00,
 0x04, 0xe3, 0x00, 0x00, 0x00, 0x24, 0x01, 0x00,
 0xcd, 0x28, 0xc8, 0x03, 0x01, 0x00,
};


static JSContext *JS_NewCustomContext(JSRuntime *rt)
{
  JSContext *ctx = JS_NewContextRaw(rt);
  if (!ctx)
    return NULL;
  JS_AddIntrinsicBaseObjects(ctx);
  JS_AddIntrinsicDate(ctx);
  JS_AddIntrinsicEval(ctx);
  JS_AddIntrinsicStringNormalize(ctx);
  JS_AddIntrinsicRegExp(ctx);
  JS_AddIntrinsicJSON(ctx);
  JS_AddIntrinsicProxy(ctx);
  JS_AddIntrinsicMapSet(ctx);
  JS_AddIntrinsicTypedArrays(ctx);
  JS_AddIntrinsicPromise(ctx);
  JS_AddIntrinsicBigInt(ctx);
  return ctx;
}


int main(int argc, char **argv)
{
  JSRuntime *rt;
  JSContext *ctx;
  rt = JS_NewRuntime();
  js_std_set_worker_new_context_func(JS_NewCustomContext);
  js_std_init_handlers(rt);
  JS_SetModuleLoaderFunc(rt, NULL, js_module_loader, NULL);
  ctx = JS_NewCustomContext(rt);
  js_std_add_helpers(ctx, argc, argv);
  js_std_eval_binary(ctx, qjsc_hello, qjsc_hello_size, 0);
  js_std_loop(ctx);
  JS_FreeContext(ctx);
  JS_FreeRuntime(rt);
  return 0;
}

3 用gcc 来生成exe程序

gcc hello.c libquickjs.dll -I..\ -o hello.exe

0000f878647d6eeb244945aaf482b444.png

可以看到hello.exe生成成功,并且运行了。

这里利用了 gcc 来生成exe ,那么生成dll 可以吗?

答案是肯定的。

我们再试着用gcc 来生成dll 让VFP调用看看?

1 头文件 dll.h,可以用记事本来生成。

#ifdef BUILD_DLL /* DLL export */
#define EXPORT __declspec(dllexport)
#else /* EXE import */
#define EXPORT __declspec(dllimport)
#endif


EXPORT int hello(void);

2 dll.c文件

#include "dll.h"


EXPORT int hello(void)
{
    return 123;
}

3 开始编译生成

编译dll.c

gcc -c -DBUILD_DLL dll.c

意要使用要使用-DBUILD_DLL来设置宏BUILD_DLL

创建dll

gcc -shared -o dll.dll dll.o -Wl,--out-implib,libmessage.a

这一步要详细说明一下

-shared参数用来创建共享库,在windows中为dll
-Wl 等待下一条信息进行连接
--out-implib是给连接程序ld使用的,用于创建要连接dll需要的import library

这样就会生成dll.dll 

VFP 调用代码如下

DECLARE INTEGER hello IN  dll.dll 
?hello()
CLEAR DLLS

bbe8df6aa22a94c1fb149435354c9010.png

恩,运行完美。

待完成的开发和测试

  1.  实现在 main.c 里面调用js函数

  2.  实现把c程序编译成dll,让VFP调用,JS引擎就能发挥作用了。

    此时就具有JS ES6版本的全套功能了,参考书:ES6 全套教程 ECMAScript6 (原著:阮一峰)

  3.  整合txiki.js到dll中,这样就可完整使用JS运行时的各项功能。

  4. 完整整合JS引擎和JS运行时。

拥抱JS,VFP可以拥有更多的未来。比如Web3,AI,机器学习等等。

这本犀牛书可以入手。不到50块,少抽几包烟你就可以学会一项新的功能,让你可以飞得更高。

猫猫的心里话

加菲猫的VFP|狐友会社群接收投稿啦

加菲猫的VFP,用VFP不局限VFP,用VFP混合一切。无论是VFP,还是JS,还是C,只要能混合起来,都可以发表。

商业模式,销售技巧、需求规划、产品设计的知识通通可以发表。

暂定千字50元红包,,优秀的文章红包更大,一经发表,红包到手。

如何帮助使用VFP的人?

用VFP的人,有专业的,有非专业了,很多人其实是小白,问出的问题是小白,如果问题不对,我们引导他们问正确的问题。无论如何请不要嘲笑他们说帮助都不看,这么简单的问题都不会,嘲笑别人不行,而无法提出建设性答案,是很low的。

我们无论工作需要,还是有自己的软件,都是是需要真正的知识,如何让更多人学习真正的VFP知识呢,只需要点赞,在看,能转发朋友圈就更好了。

加菲猫的vfp倡导用"VFP极简混合开发,少写代码、快速出活,用VFP,但不局限于VFP,各种语言混合开发"

我已经带领一百多名会员成功掌到VFP的黑科技,进入了移动互联网时代,接下来我们要进入物联网领域。

2023年狐友会社群会员继续招募中

社群会员获取的权益有:

祺佑三层开发框架商业版(猫框),终身免费升级,终身技术支持。

开放的录播课程有:

微信小程序,微信公众号开发,H5 APP开发,Extjs BS开发,VFP面向对象进阶,VFP中间层开发。

源码类资源有:

支付组件源码,短信源码,权限组件源码,一些完整系统的源码。这个可以单独出售的,需要的可以联系我。

会员也可以实现群内资源对接,可以接分包,合作等各项商业或技术业务

02cff9072ada9222391cfb8c447ebdf7.gif

dbdc74fac62fd18471e4a28f32d5ba50.jpeg

864af5d3fa04aa28c27d19417bef2319.gif

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

加菲猫的VFP

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值