基于DLL通过C调用SWI-Prolog

基于DLL通过C调用SWI-Prolog,c,dll,ffi,swi-prolog,C,Dll,Ffi,Swi Prolog,我再次需要帮助。我尝试在windows上通过基于dll的C调用SWI Prolog 在我的C程序中,我想使用函数consult_cooco。C代码看起来像 #include "consult_cooco.h" #include <SWI-Prolog.h> int consult_cooco( char** strInput ) { char *program = "consult_cooco"; char *plav[2]; int rval;

我再次需要帮助。我尝试在windows上通过基于dll的C调用SWI Prolog

在我的C程序中,我想使用函数consult_cooco。C代码看起来像

#include "consult_cooco.h"
#include <SWI-Prolog.h>

int consult_cooco( char** strInput )
{
    char *program = "consult_cooco";
    char *plav[2];
    int rval;

    char* xmlstring;
    term_t av;
    predicate_t p;

    /* make the argument vector for Prolog */
    plav[0] = program;
    plav[1] = NULL;

    putenv("SWI_HOME_DIR=C:\\Program Files (x86)\\swipl");
    if ( !PL_initialise(1, plav ) )
        PL_halt(1);


    av = PL_new_term_refs(2);
    p = PL_predicate("start_dialog", 2, "user");

    printf("consult_cooco:: input >> %s\n",*strInput);

    // Prolog call: start_dialog('ohne Zitrone, mit Joghurt, Butter',XML).
    av = PL_new_term_refs(2);
    PL_put_atom_chars(av, *strInput);

    if ( PL_call_predicate(NULL, PL_Q_NORMAL, p, av) )
    { 
        rval = PL_get_atom_chars(av+1, &xmlstring);
        printf(" >> xmlstring of %s is \n\n%s (returned %i)\n",*strInput,xmlstring,rval);
    } 
    else
    {
        printf(" >> no answer found\n");
    }


    PL_halt(1);

    return 0;
}
start_dialog( InputString, XMLResult ) :-
    create_individual_filename('dialog_','.debug',Filename),
    tell(Filename),
    process_input( InputString, WordList ),
    do(WordList, XMLResult ),
    told.
我通过

gcc CooCoServer.o -static-libgcc -lws2_32 -L. -lconsult_cooco -I. -o startcoocoserver
Prolog文件dialog.pl的开头如下所示

#include "consult_cooco.h"
#include <SWI-Prolog.h>

int consult_cooco( char** strInput )
{
    char *program = "consult_cooco";
    char *plav[2];
    int rval;

    char* xmlstring;
    term_t av;
    predicate_t p;

    /* make the argument vector for Prolog */
    plav[0] = program;
    plav[1] = NULL;

    putenv("SWI_HOME_DIR=C:\\Program Files (x86)\\swipl");
    if ( !PL_initialise(1, plav ) )
        PL_halt(1);


    av = PL_new_term_refs(2);
    p = PL_predicate("start_dialog", 2, "user");

    printf("consult_cooco:: input >> %s\n",*strInput);

    // Prolog call: start_dialog('ohne Zitrone, mit Joghurt, Butter',XML).
    av = PL_new_term_refs(2);
    PL_put_atom_chars(av, *strInput);

    if ( PL_call_predicate(NULL, PL_Q_NORMAL, p, av) )
    { 
        rval = PL_get_atom_chars(av+1, &xmlstring);
        printf(" >> xmlstring of %s is \n\n%s (returned %i)\n",*strInput,xmlstring,rval);
    } 
    else
    {
        printf(" >> no answer found\n");
    }


    PL_halt(1);

    return 0;
}
start_dialog( InputString, XMLResult ) :-
    create_individual_filename('dialog_','.debug',Filename),
    tell(Filename),
    process_input( InputString, WordList ),
    do(WordList, XMLResult ),
    told.
没有

putenv("SWI_HOME_DIR=C:\\Program Files (x86)\\swipl");
我弄错了

[FATAL ERROR: Could not find system resources]
如SWI Prolog手册所述

但是仍然找不到Prolog谓词,错误描述为

ERROR: '$c_call_prolog'/0: Undefined procedure: start_dialog/2
start_对话框在dialog.pl中定义,请参见上文

我的假设是plav[0]=consult_cooco;错误,找不到指向Prolog文件的链接

当使用从C主文件开始的exe文件时

int consult_cooco( char** strInput )
{
    char *program = "consult_cooco";

它起作用了。它也适用于

int main( int argc, char** argv )
{
    char *program = "call_cooco";
当使用dll时,我会犯什么错误?必须在char*程序中输入什么


非常感谢您的帮助。

很抱歉,答案已经给出:

我得去准备

plav[0] = (char*)"startcoocoserver.exe";
plav[1] = (char*)"-x";
plav[2] = (char*)"dialog.exe";
然后使用

if(!PL_initialise(3, plav))
需要额外的构建步骤

swipl --goal=true --stand_alone=true -o dialog -c dialog.pl
在执行其他步骤之前。然后它就起作用了:

PS:我没有找到如何删除一个问题-管理员,请做