请教一个PB调用API的问题
我现在用PB调用外部函数出现了问题,请大家帮忙解决一下,
我要调用的外部函数是用VC写的,函数的返回类型是枚举类型的,函数参数是结构体,请问该如何声明呀?代码如下
typedef struct SKYETEK_READER
{
LPSKYETEK_ID id;
TCHAR model[128];
TCHAR serialNumber[128];
TCHAR firmware[128];
TCHAR manufacturer[128];
TCHAR rid[128];
TCHAR readerName[128];
TCHAR friendly[256];
unsigned char isBootload;
unsigned char sendRID;
LPSKYETEK_PROTOCOL lpProtocol;
LPSKYETEK_DEVICE lpDevice;
void *user;
void *internal;
} SKYETEK_READER, *LPSKYETEK_READER;
typedef enum SKYETEK_STATUS
{
SKYETEK_FAILURE = 0,
SKYETEK_SUCCESS = 1,
SKYETEK_INVALID_READER,
SKYETEK_READER_PROTOCOL_ERROR,
}SKYETEK_STATUS;
以下是要调用的函数
SKYETEK_STATUS
STPV3_SelectTags(
LPSKYETEK_READER lpReader,
SKYETEK_TAGTYPE tagType,
PROTOCOL_TAG_SELECT_CALLBACK callback,
PROTOCOL_FLAGS flags,
void *user,
unsigned int timeout
)
{
STPV3_REQUEST req;
STPV3_RESPONSE resp;
SKYETEK_STATUS status;
LPSKYETEK_DATA lpd;
LPREADER_IMPL lpri;
int ix = 0, iy = 0;
if((lpReader == NULL) || (callback == 0))
return SKYETEK_INVALID_PARAMETER;
if( lpReader->lpDevice == NULL || lpReader->internal == NULL)
return SKYETEK_INVALID_PARAMETER;
/* Build request */
memset(&req,0,sizeof(STPV3_REQUEST));
req.cmd = STPV3_CMD_SELECT_TAG;
req.flags = STPV3_CRC | ((flags.isInventory == 1) ? STPV3_INV : 0);
req.flags = req.flags | ((flags.isLoop == 1) ? STPV3_LOOP : 0);
req.tagType = tagType;
lpri = (LPREADER_IMPL)lpReader->internal;
if( lpReader->sendRID || !lpri->DoesRIDMatch(lpReader,genericID) )
{
lpri->CopyRIDToBuffer(lpReader,req.rid);
req.flags |= STPV3_RID;
}
/* Send request */
status = STPV3_WriteRequest(lpReader->lpDevice, &req, timeout);
if( status != SKYETEK_SUCCESS )
return status;
readResponse:
memset(&resp,0,sizeof(STPV3_RESPONSE));
status = STPV3_ReadResponse(lpReader->lpDevice, &req, &resp, timeout);
if( status == SKYETEK_TIMEOUT )
{
if(!callback(tagType, NULL, user))
{
STPV3_StopSelectLoop(lpReader, timeout);
return SKYETEK_SUCCESS;
}
goto readResponse;
}
if( status != SKYETEK_SUCCESS )
return status;
if( resp.code == STPV3_RESP_SELECT_TAG_LOOP_ON )
goto readResponse;
if( resp.code == STPV3_RESP_SELECT_TAG_FAIL || resp.code == STPV3_RESP_SELECT_TAG_LOOP_OFF )
return SKYETEK_SUCCESS;
if( resp.code == STPV3_RESP_SELECT_TAG_PASS )
{
/* Copy over tag information */
if( resp.tagType != 0 )
tagType = (SKYETEK_TAGTYPE)resp.tagType;
else
tagType = (SKYETEK_TAGTYPE)req.tagType;
lpd = SkyeTek_AllocateData(resp.dataLength);
SkyeTek_CopyBuffer(lpd,resp.data,resp.dataLength);
/* Call the callback */
if(!callback(tagType, lpd, user))
{
SkyeTek_FreeData(lpd);
STPV3_StopSelectLoop(lpReader,timeout);
return SKYETEK_SUCCESS;
}
SkyeTek_FreeData(lpd);
/* Check for bail */
if(!flags.isInventory && !flags.isLoop)
return SKYETEK_SUCCESS;
/* Keep reading */
goto readResponse;
}
return status;
}