请教一个PB调用API的问题

mxx123 2007-12-06 11:40:08
我现在用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;
}
...全文
228 7 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
hawkbird 2007-12-26
  • 打赏
  • 举报
回复
你可以用vc写个dll,然后再用pb调嘛,pb好像不支持枚举吧?
lllyyymmm 2007-12-09
  • 打赏
  • 举报
回复
如果是引用的变量类型多一个ref
184270428 2007-12-08
  • 打赏
  • 举报
回复
指針聲明成32位
如 ulong,long ==都可以。
需加工的數據可以加 ref(傳地址方式)
用到回調函數的。可以用VC或其它工具寫回調函數。
mxx123 2007-12-06
  • 打赏
  • 举报
回复
SKYETEK_STATUS
STPV3_SelectTags(
LPSKYETEK_READER lpReader,
SKYETEK_TAGTYPE tagType,
PROTOCOL_TAG_SELECT_CALLBACK callback,
PROTOCOL_FLAGS flags,
void *user,
unsigned int timeout
)
这个函数该如何声明呀
mxx123 2007-12-06
  • 打赏
  • 举报
回复
那该如何修改返回值呀,那个API是第三方厂家提供的;还有,像 *LPSKYETEK_READER这样的函数参数在PB中该用哪种数据类型代替呀
eviler 2007-12-06
  • 打赏
  • 举报
回复
pb 中处理不了枚举

估计你需要修改返回值了

函数的参数式结构体: 你需要在pb中申明一个结构 相应的东西就用你的
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;


然后你的函数就可以像其他的api声明一样了
lllyyymmm 2007-12-06
  • 打赏
  • 举报
回复
有点晕

680

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder API 调用
社区管理员
  • API 调用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧