编译并驻留函数YC_cppLoad()、YC_cppFree()
该函数编译c/c++源代码,编译结果驻留内存,对外提供源代码函数接口。
它与语法pObj = <file.cpp> 具有相同的功能。
void *YC_cppLoad(
const char *srcbuf, //源代码文件名或源代码缓冲区
int srclen, //源代码长度
void *pObj, //接收源代码数据地址的指针
int isScript=0 //是否是Javascript代码调用该函数
);
参数:
srcbuf, srclen
当srclen等于0时,srcbuf是c/c++源代码的文件名,srclen大于0时,srcbuf
是源代码缓冲区,srclen是源代码长度。
pObj,isScript
当isScript等于0时,是c/c++程序调用该函数,pObj接收函数接口的地址,
当isScript等于1时,是Javascript程序调用该函数,pObj接收定义JS方法和属性的结构数据地址。
返回值:
如果函数运行成功,返回值为执行代码所在的内存地址,该返回值必须用YC_cppFree()函数释放。
如果函数运行失败,返回值为NULL,*pObj被置为NULL,说明源码有语法错误。
释放函数:
void YC_cppFree(
void *pHandle //YC_cppLoad()函数的返回值
);
1. 用YC_cppLoad()获得源代码函数接口地址
struct XWEB
{
int sockid;
char *server_name;
};
struct hopeCLASS
{
virtual double _stdcall sock_close(XWEB &pWeb);
virtual char *_stdcall sock_read(XWEB &pWeb);
};
源代码接口定义头文件hope.h
#include "hope.h"
double hopeCLASS::sock_close(XWEB &mweb)
{
printf("%d\n",mweb.sockid);
return 3.142592;
}
char *hopeCLASS::sock_read(XWEB &mweb)
{
printf("%s\n",mweb.server_name);
return "一览众山小。";
}
const hopeCLASS HOPE;
void main(void **pObj)
{
*pObj = &HOPE;
}
源代码接口实现文件hope.cpp
#include <stdio.h>
#include "ycapi.h"
#include "hope.h"
void main()
{
hopeCLASS *HOPE; //声明hopeCLASS对象(接口)指针
XWEB mweb = { 2020, "会当凌绝顶" }; //声明XWEB结构变量并对其初始化
void *pHandle = YC_cppLoad("hope.cpp",0,&HOPE); //获得hope.cpp函数接口
if(!pHandle) return;
printf("%s\n",HOPE->sock_read(mweb)); //执行hope.cpp的sock_read()函数
printf("%f\n",HOPE->sock_close(mweb)); //执行hope.cpp的sock_close()函数
YC_cppFree(pHandle); //释放hope.cpp所占资源
}
调用源代码接口函数的程序: tiger.cpp
编译:用YC命令:ycc tiger.cpp 或 VC++命令:cl tiger.cpp 生成 tiger.exe
运行:在cmd界面执行tiger.exe后,输出下列文字:
会当凌绝顶
一览众山小。
2020
3.142592
2. 使用YC_cppLoad()函数的文件
ychtml.cpp
pObj->Handle = YC_cppLoad(href_name,0,&pObj->addy);
ycweb.cpp
yc86Handle = YC_cppLoad(“yc86.cpp”,0,&YC86);
void *ycpop_Handle = YC_cppLoad(“ycpop.cpp”,0,&yc_PopupMenu);
ycdraw.cpp
ycsaveimg_Handle = YC_cppLoad(“ycsaveimg.cpp”,0,&ycx_ImageSave);
ycjs.cpp
pHandle = YC_cppLoad(exe_ptr,exe_len,&cppData,1);
pHandle = YC_cppLoad(fileName,0,&cppData,1);