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);
最后,结束,由于是隐式链接,不需要释放资源了