CLIPS专家系统与C++的交互

CLIPS专家系统与C++的交互

更多文章参见个人网站

最近研究了一下在windows下使用C++嵌入CLIPS专家系统,这里只是用了引用DLL的方式实现的,分别使用了显示链接和隐式链接两种方式。当然还有其他的方式可以实现(直接调用CLIPS的C源码,不过这种方式略显麻烦,其中涉及了许多C/C++编译的兼容性,过一段时间在研究一下),不过这里的使用方式基本满足了编写MFC、QT等人机交互界面程序的要求,是大学论文的一把利器(不明白显式链接、隐式链接的同学请自行Google!)

下面开始介绍嵌入的过程!!!

首先就是准备三个文件:

CLIPSWin32.dll

CLIPSWin32.lib

CLIPSWin32.h

———————————分割———————————

先把CLIPS知识库贴上

(defrule hello

=>

(printout t "Hello World." crlf)

(printout t "Hit return to end." crlf)

(readline)

)

1. 显式链接的方案

显示链接只需要第一个文件即可,也就是CLIPSWin32.dll

首先,使用DLL输出函数查看器,找到我们需要使用的函数名称(对于没有.h文件的DLL),我们这里有.h文件,所以就偷个懒,直接看一下里面的函数和参数类型就可以了。

我们要使用到的函数分别是:

__CreateEnvironment()

__EnvLoad()

__EnvReset()

__EnvRun()

__DestroyEnvironment()

注意:__这里是两个_

其次,开始手动加载DLL

HMODULE dll_handle;

dll_handle = LoadLibrary("CLIPSWin32.dll");

获得每个函数的入口地址

__CreateEnvironment = (CreateEnvironmentPtr)

GetProcAddress(dll_handle,"__CreateEnvironment");

__EnvLoad = (EnvLoadPtr)

GetProcAddress(dll_handle,"__EnvLoad");

__EnvReset = (EnvResetPtr)

GetProcAddress(dll_handle,"__EnvReset");

__EnvRun = (EnvRunPtr)

GetProcAddress(dll_handle,"__EnvRun");

__DestroyEnvironment = (DestroyEnvironmentPtr)

GetProcAddress(dll_handle,"__DestroyEnvironment");

最后,就是调用函数,运行CLIPS环境了

theEnv = __CreateEnvironment();

__EnvLoad(theEnv,"hello.clp");

__EnvReset(theEnv);

__EnvRun(theEnv,-1);

__DestroyEnvironment(theEnv);

当然,结束的时候不要忘了释放内存

FreeLibrary(dll_handle);

2. 隐式链接的方案

需要的文件为

CLIPSWin32.dll

CLIPSWin32.lib

CLIPSWin32.h

三个文件最好都拷贝到程序根目录下

首先,在程序里包含CLIPSWin32.h,并且在项目里添加CLIPSWin32.lib。

注意,CLIPSWin32.h为C语言编码,所以包含时添加“extern “C””。

其次,调用函数

theEnv = __CreateEnvironment();

__EnvLoad(theEnv,"hello.clp");

__EnvReset(theEnv);

__EnvRun(theEnv,-1);

__DestroyEnvironment(theEnv);

最后,结束,由于是隐式链接,不需要释放资源了

你可能感兴趣的:(CLIPS专家系统与C++的交互)