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
生成的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
可以看到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
恩,运行完美。
待完成的开发和测试
实现在 main.c 里面调用js函数
实现把c程序编译成dll,让VFP调用,JS引擎就能发挥作用了。
此时就具有JS ES6版本的全套功能了,参考书:ES6 全套教程 ECMAScript6 (原著:阮一峰)
整合txiki.js到dll中,这样就可完整使用JS运行时的各项功能。
完整整合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中间层开发。
源码类资源有:
支付组件源码,短信源码,权限组件源码,一些完整系统的源码。这个可以单独出售的,需要的可以联系我。
会员也可以实现群内资源对接,可以接分包,合作等各项商业或技术业务