IBM Window Services(DWS)CSRIDAC,DSNAME长度无效

时间:2018-06-11 07:49:46

标签: c zos mvs

我正在研究z / OS并尝试使用IBM提供的Window Services。 除了由DSNAME创建对象外,一切都很完美。

当我使用DSNAME调用CSRIDAC时出现错误: “系统无法分配或取消分配 数据集指定为object_name。值rrrr是返回码 来自动态分配。值nnnn是双字节的原因 来自动态分配的代码。请参阅z / OS MVS编程: 动态分配回报的授权汇编服务指南 和原因码。“

所以我搜索了原因代码的含义,该代码是037c并找到:“在文本单元中指定了无效的LEN。附带的消息IKJ56231I表示错误的文本单元的编号。” < / p>

因此,似乎Window Services正在调用动态分配服务来通过其DSNAME创建对象,并且在计算我提供的DSNAME中的字符数时会出错。

我的DSNAME是一个有效的VSAM文件名,我通过另一种方式使用相同的DSNAME成功读取了此数据集。

嗯,这是调用CSRIDAC函数的函数代码:

ozwinsrvObject *ozwinsrvObjectCreate(uint32_t uiFlags, int32_t iObjectSize, uint8_t *pcObjectName, int32_t *piHighOffset, int32_t *piRc)
{
ozwinsrvObject *pobject = __malloc31(sizeof(ozwinsrvObject));

    *piRc = OZWINSRV_NO_ERROR;
    pobject->pheap = __malloc31(18*4);
    pobject->pparmList = __malloc31(11 * sizeof(int32_t));
    memcpy(&pobject->parmObject.acOpType[0] , "BEGIN", 5);
    pobject->parmObject.iObjectSize = iObjectSize;
    pobject->parmObject.iHighOffset = *piHighOffset;
    if(uiFlags & OZWINSRV_OBJECT_F_TYPE_DDNAME)
    {
        memcpy(&pobject->parmObject.acObjectType[0], "DDNAME   ", 9);
    }
    else {
        if(uiFlags & OZWINSRV_OBJECT_F_TYPE_DSNAME)
        {
            memcpy(&pobject->parmObject.acObjectType[0], "DSNAME   ", 9);
        }
        else
        {
            memcpy(&pobject->parmObject.acObjectType[0], "TEMPSPACE", 9);
        }
    }
    if(uiFlags & OZWINSRV_OBJECT_F_SCROLL_AREA_YES)
    {
        memcpy(&pobject->parmObject.acScrollArea[0], "YES", 3);
    }
    else
    {
        memcpy(&pobject->parmObject.acScrollArea[0], "NO ", 3);
    }
    if(uiFlags & OZWINSRV_OBJECT_F_STATE_NEW)
    {
        memcpy(&pobject->parmObject.acObjectState[0], "NEW", 3);
    }
    else
    {
        memcpy(&pobject->parmObject.acObjectState[0], "OLD", 3);
    }
    if(uiFlags & OZWINSRV_OBJECT_F_ACCESS_MODE_UPDATE)
    {
        memcpy(&pobject->parmObject.acAccessMode[0], "UPDATE", 6);
    }
    else
    {
        memcpy(&pobject->parmObject.acAccessMode[0], "READ  ", 6);
    }
    memcpy(&pobject->acObjectName[0], pcObjectName, strlen(pcObjectName));
    if(strlen(pcObjectName) < 45)
    {
        pobject->acObjectName[strlen(pcObjectName)] = ' ';
    }
    memset(pobject->pparmList, 0, 11 * sizeof(int32_t));
    pobject->pparmList[0] = (int32_t) &pobject->parmObject.acOpType[0];
    pobject->pparmList[1] = (int32_t) &pobject->parmObject.acObjectType[0];
    pobject->pparmList[2] = (int32_t) &pobject->parmObject.acObjectName[0];
    pobject->pparmList[3] = (int32_t) &pobject->parmObject.acScrollArea[0];
    pobject->pparmList[4] = (int32_t) &pobject->parmObject.acObjectState[0];
    pobject->pparmList[5] = (int32_t) &pobject->parmObject.acAccessMode[0];
    pobject->pparmList[6] = (int32_t) &pobject->parmObject.iObjectSize;
    pobject->pparmList[7] = (int32_t) &pobject->acObjectId[0];
    pobject->pparmList[8] = (int32_t) &pobject->parmObject.iHighOffset;
    pobject->pparmList[9] = (int32_t) &pobject->parmObject.iRc;
    pobject->pparmList[10] = (int32_t) &pobject->parmObject.iReasonC;
    x6csridac(pobject->pparmList, pobject->pheap);
    if(pobject->parmObject.iRc != 0)
    {
        printf("Error creating object (csridac) Rc=0x%x, ReasonC=0x%x\n", pobject->parmObject.iRc, pobject->parmObject.iReasonC);
        *piRc = OZWINSRV_ERROR_WINDOW_OBJECT_CREATE;
    }
    *piHighOffset = pobject->parmObject.iHighOffset;
    pobject->iObjectSize = iObjectSize;
    pobject->uiFlags = uiFlags;
    pobject->uiNbViews = 0;
    return pobject;
}

然后,这是调用此函数的代码:

int32_t iRc = 0;
int32_t iPageSize = 32*1024;
int32_t iPageOffset = iPageSize/4/1024;
int32_t iSize = 1;
int32_t iRealSize = 1;
ozwinsrvObject *pObject;
ozwinsrvWindow *pWindow;
uint8_t acFileName[] = "DSNB10.DSNDBC.DBTLS00.TS1449.I0001.A001";

pObject = ozwinsrvObjectCreate(OZWINSRV_OBJECT_F_ACCESS_MODE_READ | OZWINSRV_OBJECT_F_SCROLL_AREA_NO | OZWINSRV_OBJECT_F_STATE_OLD | OZWINSRV_OBJECT_F_TYPE_DSNAME,
                               iSize, &acFileName[0], &iRealSize, &iRc);

我希望我对问题的解释清楚。如果不是,请随意提出一些问题。 谢谢!

1 个答案:

答案 0 :(得分:0)

我发现了自己的错误并发布了答案。 我使用以下行将名称复制到数组中:

memcpy(&pobject->acObjectName[0], pcObjectName, strlen(pcObjectName));

但是!当我将此数组放入参数列表时,我使用以下代码行:

pobject->pparmList[2] = (int32_t) &pobject->parmObject.acObjectName[0];

这意味着名称在 pobject-> acObjectName 中,并将 pobject-> parmObject.acObjectName 放在参数列表中。这两个数组不是相同的变量...

对于我的错误,我感到抱歉,并确认DWS运作良好。