在消息事件上使用消息名称

时间:2019-02-11 10:17:50

标签: capl


我试图声明一条消息,然后在 on message 事件中使用消息名称,但是我得到了 <tbody> <tr> <td class="S_line1"> <a bpfilter="page_frame" class="t_link S_txt1" href="//xx.com/p/1003061291477752/follow?from=page_100306&amp;wvr=6&amp;mod=headfollow#place"> <strong class="W_f12">170</strong> <span class="S_txt2">fans</span> </a> </td> </tr> </tbody> 错误

我的代码:

Expecting message name or identifier

我知道我可以在variables { message CAN1.foo bar; } on message bar //got the error here { //do stuff } 事件中将bar替换为CAN1.foo,但是该消息的位置可以根据运行capl代码的项目而改变。所以我想使其尽可能“通用”,所以我只能在切换项目时更改on message中的部分

2 个答案:

答案 0 :(得分:1)

不可能有一个“动态” on message处理程序。

可以通过使用通用的on message *处理程序并比较消息名称来解决您的用例。

类似这样的东西:

variables
{
  char messageName[256] = "foo";
}

on message *
{
  dword context = 0x00010000;
  char buffer[256];
  getMessageName(this.ID, context | this.CAN, buffer, elcount(buffer));

  if(strncmp(buffer, messageName, strlen(buffer) == 0)
  {
    // do stuff
  }
}

您必须参考文档getMessageName的第二个参数的含义,而且我不确定getMessageName返回foo还是CAN1.foo

答案 1 :(得分:0)

鉴于动态消息名称不是一种选择,请考虑采用另一种设计。

如果//do stuff是一个函数,您可以重复使用,请在您的主CAPL脚本中声明它,或者将其包含在doStuff.cin中。

然后,根据您的项目,包括一个由prjMessageEventHandler.cin组成的on message yourProjectDependendMessages(您也可以声明消息列表):

on message 1,2,3,4
{
    // call to doStuff.cin suitable function
}

由于您的prjMessageEventHandler.cin很简单,因此可以通过xml以编程方式构建它。

像这样,您在CAPL测试脚本中唯一需要更改的就是您要包含的prjMessageEventHandler.cin