使用C语言设置微焦点COBOL中的开关

使用C语言设置微焦点COBOL中的开关,cobol,microfocus,Cobol,Microfocus,我有一个调用COBOL的C程序。我想在调用COBOL程序之前设置开关。这通常是使用COBSW环境变量完成的 当我在C程序中设置COBSW时,它被忽略了。 当我在调用程序之前设置COBSW时,检测结果良好 如何在C中设置COBSW并让COBOL识别它 以下是我尝试过的一些事情: 我删除了cobinit(),程序仍在运行。这向我表明,当C程序启动时,cobinit在某种程度上是自动的,它将只拾取在sh中设置的COBSW 我将cobrescanenv()添加到程序中 将cobinit()移到cobpu

我有一个调用COBOL的C程序。我想在调用COBOL程序之前设置开关。这通常是使用COBSW环境变量完成的

当我在C程序中设置COBSW时,它被忽略了。 当我在调用程序之前设置COBSW时,检测结果良好

如何在C中设置COBSW并让COBOL识别它

以下是我尝试过的一些事情:

  • 我删除了cobinit(),程序仍在运行。这向我表明,当C程序启动时,cobinit在某种程度上是自动的,它将只拾取在sh中设置的COBSW

  • 我将cobrescanenv()添加到程序中

  • 将cobinit()移到cobputenv()之前

  • 以下是运行测试的sh脚本:

    export C_INCLUDE_PATH=$COBDIR/include
    
    PATH=$COBDIR/bin:$PATH
    
    gcc -o callcobol.o -c -g -Wall -Wno-unused-variable -fPIC -Ibuild -Isrc callcobol.c
    
    /opt/microfocus/VisualCOBOL/bin/cob -o callcobol -g callcobol.o -L/usr/local/lib -ldl -lrt -lpthread
    
    cob -z cobsw.cbl -o TESTSW.so
    
    unset COBSW
    echo "Test ONE, COBSW not set:"
    echo "We want the output to be:"
    echo "SW0=ON  sw1=ON  sw2=ON  sw3=ON  sw4=ON  sw5=ON  sw6=OFF sw7=ON "
    echo "Getting:"
    ./callcobol
    
    #                Output:
    #                        value of COBSW is: +0+1+2+3+4+5-6+7
    echo ""
    echo ""
    
    export COBSW=+1+2   # This should be ignore because we are setting COBSW in the c program.
    echo "Test TWO, COBSW set to ${COBSW}, but should be overlaid by putenv() in C:"
    echo "We want the output to be:"
    echo "SW0=ON  sw1=ON  sw2=ON  sw3=ON  sw4=ON  sw5=ON  sw6=OFF sw7=ON "
    echo "Getting:"
    ./callcobol
    
    下面是
    callcobol.c

    #include <stdlib.h>
    #include <stdio.h>
    #include "cobcall.h"
    #include "cobmain.h"
    #include "cobenv.h"
    PFR cobgetfuncaddr(int type, const cobchar_t *name);
    int cobinit (void);
    
    int main(int argc, char *argv[])
    {
        cobchar_t *prog = (cobchar_t *) "TESTSW";
        //char *cobswval;
        const char *cobswname = "COBSW";
    
        cobputenv( (cobchar_t *) "COBSW=+0+1+2+3+4+5-6+7");    // out dummy computed SWITCH values for the program
        //cobswval = getenv( cobswname);
        //fprintf(stdout,"value of COBSW is: %s\n", cobswval);
        cobinit();             /* Initialize COBOL environment */
        cobrescanenv();
    
        PFR cobprog;
    
        if ((cobprog = cobgetfuncaddr(0, prog)) == NULL)
        {
            fprintf(stderr,"ERROR: could not find cobol module %s\n", (char *) prog);
        }
        else
        {
            /* Loaded */
            (*cobprog)();    /* Call it! */
        }
    
        cobtidy();             /* Close down COBOL environment */
    
        return(0);   // return a return code of zero
    }
    
    以下是脚本输出:

    Test ONE, COBSW not set:
    We want the output to be:
    SW0=ON  sw1=ON  sw2=ON  sw3=ON  sw4=ON  sw5=ON  sw6=OFF sw7=ON
    Getting:
    SW0=OFF sw1=OFF sw2=OFF sw3=OFF sw4=OFF sw5=OFF sw6=OFF sw7=OFF
    
    
    Test TWO, COBSW set to +1+2, but should be overlaid by putenv() in C:
    We want the output to be:
    SW0=ON  sw1=ON  sw2=ON  sw3=ON  sw4=ON  sw5=ON  sw6=OFF sw7=ON
    Getting:
    SW0=OFF sw1=ON  sw2=ON  sw3=OFF sw4=OFF sw5=OFF sw6=OFF sw7=OFF
    

    在进程初始化期间,从环境变量COBSW或命令行读取一次COBOL运行时开关

    因此,不幸的是,设置COBSW将不起作用,因为运行时已经 阅读COBSW


    因为您可以使用from COBOL设置开关,所以不会丢失所有开关。

    一般来说,您只是在加载以运行第一个程序的环境中设置开关。您需要找到一种方法将它们从C导出到主环境,以便COBOL程序能够访问。COBOL程序正在进程中运行,并且与C程序在相同的环境中运行。在这种情况下,COBOL程序就像一个函数,而不是一个独立的程序。有了这些新信息,你能详细说明一下你的陈述吗。也许告诉我们什么是“主环境”。从我阅读脚本的方式来看,C实际上并没有调用COBOL,而shell是。在典型的操作系统中,shell保存环境。生成一个新的shell(使用复制的环境)来运行C应用程序。C应用程序更新该环境。当它结束时,该环境被丢弃,因此启动COBOL的shell具有原始(未修改)环境。C必须直接使用其环境副本生成COBOL,或者您需要将外壳的C版本导出回父外壳。Brian,请查看C代码而不是外壳脚本,您将看到COBOL作为C代码的函数被调用的位置。请显示callcobol,好吗?还有您正在使用的Micro Focus COBOL的确切版本和名称。那么Micro Focus提供
    cobrescanenv()
    的意义是什么呢?cobrescanenv可以获取DD_uu环境变量、用户设置环境变量和入口点映射环境的更改,但不幸的是,COBSW不能。我可以想象,但事实并非如此。该程序是用“cob”编译的,这确保了Micro Focus COBOL运行时环境的设置,因此在本例中,cobinit()的作用很小,因为环境已经设置好了。cobputenv()正在运行,但运行时没有注意到COBSW已更改为重新解析它以设置COBOL开关。因此我提到x“91”fn 11 API。cobinit()在静态链接环境中很有用。Micro Focus提供了一个“自包含”的共享对象,在加载共享对象本身时初始化运行时,这不需要cobinit()。谢谢。我很满意。你能用这些东西更新你的答案吗?因此,它是各种微焦点文档中的“东西”的应用,我猜它们之间不会相互合作:-)
    Test ONE, COBSW not set:
    We want the output to be:
    SW0=ON  sw1=ON  sw2=ON  sw3=ON  sw4=ON  sw5=ON  sw6=OFF sw7=ON
    Getting:
    SW0=OFF sw1=OFF sw2=OFF sw3=OFF sw4=OFF sw5=OFF sw6=OFF sw7=OFF
    
    
    Test TWO, COBSW set to +1+2, but should be overlaid by putenv() in C:
    We want the output to be:
    SW0=ON  sw1=ON  sw2=ON  sw3=ON  sw4=ON  sw5=ON  sw6=OFF sw7=ON
    Getting:
    SW0=OFF sw1=ON  sw2=ON  sw3=OFF sw4=OFF sw5=OFF sw6=OFF sw7=OFF