CANoe DLL编程——DLL和回调函数

Posted 蚂蚁小兵

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了CANoe DLL编程——DLL和回调函数相关的知识,希望对你有一定的参考价值。

相关文章

CANoe DLL编程(一)—— Visual Studio 创建DLL以及动态调用

CANoe DLL编程(二)—— 创建CANoe适用的DLL以及调用


前言

  • 这一节是在上一节的基础上,继续讲解DLL,之所以把回调函数单作为一章节,是因为作为一个对C++不太熟的认来说,回调函数还是有些吃力的,对于理解不到的地方,大家见谅。

  • 有幸如有C++大神看到,还请指点迷津,不胜感激

  • 软件环境:
    win10 x64
    visual studio 2019
    CANoe 11 x64



源码解读

①,回调函数的理解

回调函数大神的解释

首先,回调函数也是函数,就像白马也是马一样。它具有函数的所有特征,它可以有参数和返回值。其实,单独给出一个函数是看不出来它是不是回调函数的。回调函数区别于普通函数在于它的调用方式。只有当某个函数(更确切的说是函数的指针)被作为参数,被另一个函数调用时,它才是回调函数。


②,CAPL脚本中我们知道有几个回调函数,但是运行demo,按键全部按完也没有执行,行,怎么才能被执行呢?


③,再看下C++源码,看到这两个函数会调用回调函数


④,在Capl中添加如下代码,给根据打印结果确实执行了回调函数CALLBACK_ShowValue

on key '2'
  
{
   writeLineEx(1,1,"<2> dllSetValue");
   dllSetValue(gHandle,10);
   //dllReadData(gHandle,10);
}
打印结果
CAPL / .NET	--------------------------------------------------------------
CAPL / .NET	<2> dllSetValue
CAPL / .NET	CAPL CallBack Function shows value = 0xa


⑤,再回到C++代码,看下回调的机制


⑥,再看下appReadData 函数,会调用如下的回调函数

long CAPLEXPORT far CAPLPASCAL appReadData (uint32 handle, long a)
{
  CaplInstanceData* inst = GetCaplInstanceData(handle);
  if (inst==NULL)
  {
    return -1; 
  }

  int16  x = (a>=0) ? +1 : -1;
  uint32 y = abs(a);
  int16  z = (int16)(a & 0x0f000000) >> 24;

  inst->DllVersion("Version 1.1");
  
  inst->DllInfo("DLL: processing");

  uint8 databytes[8] = { 0x11, 0x22, 0x33, 0x44, 0x55, 0x66, 0x77, 0x88};

  inst->ArrayValues( 0xaabbccdd, sizeof(databytes), databytes, 0x01);

  return inst->ShowDates( x, y, z);
}   


新加一个自己的回调函数

① 学习就是为了使用的,我们尝试新建一个自己回调函数

  • 我以ShowValue函数位基准,新建了一个回调函数 Print_8888_Num,目的就是打印一个常量8888.然后在appSetValue 函数中调用
  • 为了添加这一个回调函数,我在源码中动了11处的地方,都是在原有的基础上拷贝重命名,这就不贴出来了,代码太多了,有兴趣可以自己尝试下。如果自己没调通的话,我放在git上的源码可以看下这个系列演示用到的源码
long CAPLEXPORT far CAPLPASCAL appSetValue (uint32 handle, long x)
{
  CaplInstanceData* inst = GetCaplInstanceData(handle);
  if (inst==NULL)
  {
    return -1; 
  }

  inst->Print_8888_Num(8888);
  return 1;
}   

②,在CAPL中添加代码,观察打印结果

on key '2'
  
{
   writeLineEx(1,1,"<2> appReadData");
   dllSetValue(gHandle,10);
}
void CALLBACK_Print_8888_Num(dword x)
{
  /* Callback function */
  /* This function will demonstrated an Callback with one parameters. */
  writeLineEx(1,1,"CAPL CallBack Function ShowFunNames = %d",x);
  
}

CAPL /
.NET --------------------------------------------------------------
CAPL / .NET <2> appReadData CAPL / .NET CAPL CallBack Function
ShowFunNames = 8888


总结

这个系列演示用到的源码

  • 要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
  • 如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。

以上是关于CANoe DLL编程——DLL和回调函数的主要内容,如果未能解决你的问题,请参考以下文章

CANoe DLL编程——SendKey DLL的CANoe应用

CANoe DLL编程——通过VS 生成 SendKey.dll

CANoe DLL编程—— 创建CANoe适用的DLL以及调用

CANoe DLL编程—— Visual Studio 创建DLL以及动态调用

使用 C++ dll 进行特殊回调处理

回调函数在构建和 DLL 时如何有用