在DLL中嵌入SWI-Prolog的(Embedding SWI-Prolog in a dll)

2019-08-03 17:59发布

我建立一个C ++库(窗口,DLL),我想嵌入SWI-Prolog的一些功能。
我正在做的是:

#include <Windows.h>
#include <SWI-Prolog.h>

BOOL WINAPI DllMain(
    HINSTANCE hinstDLL,  // DLL モジュールのハンドル
    DWORD fdwReason,     // 関数を呼び出す理由
    LPVOID lpvReserved   // 予約済み
)
{
    BOOL result = TRUE;

    switch(fdwReason)
    {
        case DLL_PROCESS_ATTACH:
        {
            char* av[]{"libswipl.dll"};

            _putenv(R"(SWI_HOME_DIR=C:\Program Files (x86)\swipl\)");

            if(!PL_initialise(1, av))
            {
                result = TRUE;
            }
            else
            {
                PL_halt(1);
                result = FALSE;
            }

            break;
        }

        case DLL_PROCESS_DETACH:
        {
            result = PL_cleanup(1);
            break;
        }
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
            break;
    }

    return result;
}

并包括 “libswipl.lib”,从 “swipl \ LIB \ libswipl.dll.a” 改名。

首先,它提供了,因为缺少DLL的错误,所以我复制那些在我的可执行文件夹,直到它是幸福的(具体libswipl.dll; libgmp-10.dll; pthreadGC2.dll)。

我并不需要包括PL文件转换成可执行文件(这是什么原因swipl-LD呢?),因为我想通过代码后dinamically添加的事实和规则,所以它的确定有一个明确的状态初始化。

我想知道的是,我该如何摆脱依赖(SWI_HOME_DIR),并使其独立是什么?

Answer 1:

我从来没有使用SWI-Prolog的,但是看一下安装的文件 ,其中一些文件安装在那里似乎需要运行序言引擎。

如果你的意思是你要嵌入到一切你的DLL,它很可能是不可能的,唯一的办法是修改SWI-Prolog的本身。 但是,这并不容易。

如果你只是不想要求SWI-序言要安装有你的程序运行。 你可以创建自己的安装程序,其中包括所有的文件来运行SWI-序言,并将其包含在您自己的(子)目录。 你仍然需要设置SWI_HOME_DIR,但你会知道的相对目录到你的可执行文件。

如果你不希望使用_putenv设置SWI_HOME_DIR,你还可以在Windows系统设置为正确的值设置SWI_HOME_DIR。



Answer 2:

首先,我不会推荐来初始化的DllMain序言,请在这里看到:

  • 这里
  • 这里
  • 和这里

但是,你仍然可以使用它,并检查是否依赖库在那里,不仅libswipl.dll 从而改变从5.10版本swipl.dll,也:

  • pthreadVC2.dll为64位或pthreadVC.dll为32位
  • plterm.dll(可选,终端仿真)

然后,我想补充和导出函数来初始化序言,以及所需的一组参数(如:保存状态的文件名或boot32.prc / boot64.prc,标志ēTC)。

而且,你不需要SWI_HOME_DIR当你通过所有必要的参数,你PL_initialise功能。

此外,在多线程环境的情况下,要求这些调用:PL_thread_attach_enginePL_thread_destroy_engine。

更多的话题是在这里: SWI-序言

干杯!



文章来源: Embedding SWI-Prolog in a dll