如何生成和使用CLIPS动态链接库

使用VS2010建立DLL工程,如下图:

建立过程中注意选择DLL选项,和,空项目选项,如下图:

将CLIPS-core源码拷贝到VS工程下,并导入工程,新建三个文件,命名分别为:“CLIPSWin32defStr.h”、“DllCLIPS.c”、“DllCLIPS.h”,如下图:

“DllCLIPS.h”用来声明要预留接口的函数,其中#include "CLIPS/clips.h"是为了引入函数执行过程中需要的头文件,内容和截图如下:

#include "CLIPS/clips.h"

#ifndef _DLLCLIPS_H_
#define _DLLCLIPS_H_

__declspec (dllexport) void* myCreateEnvironment();
__declspec (dllexport) int myWatch(char *itemName);
__declspec (dllexport) int myLoad(char *fileName);
__declspec (dllexport) void* myAssertString(char *theString);
__declspec (dllexport) long long myRun(long long runLimit);
__declspec (dllexport) void* myFindDeftemplate(char *deftemplateName);
__declspec (dllexport) void* myGetNextFactInTemplate(void *theTemplate,void *factPtr);
__declspec (dllexport) void myFactSlotValue(void *theEnv,void *vTheFact,char *theSlotName,DATA_OBJECT *returnValue);

#endif

扫描二维码关注公众号,回复: 4722569 查看本文章

“DllCLIPS.c”用来书写声明函数的函数体,内容和截图如下:

#include "DllCLIPS.h"

void* myCreateEnvironment()
{
    return CreateEnvironment();
}

int myWatch(char *itemName)
{
    return Watch(itemName);
}

int myLoad(char *fileName)
{
    return Load(fileName);
}

void* myAssertString(char *theString)
{
    return AssertString(theString);
}

long long myRun(long long runLimit)
{
    return Run(runLimit);
}

void* myFindDeftemplate(char *deftemplateName)
{
    return FindDeftemplate(deftemplateName);
}

void* myGetNextFactInTemplate(void *theTemplate,void *factPtr)
{
    return GetNextFactInTemplate(theTemplate,factPtr);
}

void myFactSlotValue(void *theEnv,void *vTheFact,char *theSlotName,DATA_OBJECT *returnValue)
{
    FactSlotValue(theEnv,vTheFact,theSlotName,returnValue);
}

“CLIPSWin32defStr.h”用来书写函数执行过程中需要用到的宏定义和结构体,内容和截图如下:

#define SYMBOL                          2
#define AssertString(a) EnvAssertString(GetCurrentEnvironment(),a)
#define FindDeftemplate(a) EnvFindDeftemplate(GetCurrentEnvironment(),a)
#define GetNextFactInTemplate(a,b) EnvGetNextFactInTemplate(GetCurrentEnvironment(),a,b)
#define myValueToString(target) (((struct symbolHashNode *) (target))->contents)


struct dataObject
  {
   void *supplementalInfo;
   unsigned short type;
   void *value;
   long begin;
   long end;
   struct dataObject *next;
  };
typedef struct dataObject DATA_OBJECT;

struct symbolHashNode
  {
   struct symbolHashNode *next;
   long count;
   int depth;
   unsigned int permanent : 1;
   unsigned int markedEphemeral : 1;
   unsigned int neededSymbol : 1;
   unsigned int bucket : 29;
   char *contents;
  };

然后生成解决方案,如下图:

“dllCLIPS.dll”、“dllCLIPS.lib”文件就会生成在工程目录下第一级Debug目录下,然后将“DllCLIPS.h”头文件中的dllexport修改为dllimport,内容和截图如下:

#include "CLIPSWin32defStr.h"

#ifndef _DLLCLIPS_H_
#define _DLLCLIPS_H_


__declspec (dllimport) void* myCreateEnvironment();
__declspec (dllimport) int myWatch(char *itemName);
__declspec (dllimport) int myLoad(char *fileName);
__declspec (dllimport) void* myAssertString(char *theString);
__declspec (dllimport) long long myRun(long long runLimit);
__declspec (dllimport) void* myFindDeftemplate(char *deftemplateName);
__declspec (dllimport) void* myGetNextFactInTemplate(void *theTemplate,void *factPtr);
__declspec (dllimport) void myFactSlotValue(void *theEnv,void *vTheFact,char *theSlotName,DATA_OBJECT *returnValue);

#endif 

将“CLIPSWin32defStr.h”和上面三个文件一并保存,就可以使用了。

猜你喜欢

转载自blog.csdn.net/lizehao1973/article/details/85231383
今日推荐