? 相关文章
-
?CANoe DLL编程(一)—— Visual Studio 创建DLL以及动态调用
-
?CANoe DLL编程(二)—— 创建CANoe适用的DLL以及调用
-
?CANoe DLL编程(四)——SendKey DLL的CANoe应用
-
?CANoe DLL编程(五)——通过VS 生成 SendKey.dll
-
?CANoe DLL编程(六)—— DLL 的二次封装
-
?本章节内容演示源码下载,点击跳转?
?前言
- 这一节是在上一节的基础上,继续讲解DLL,之所以把回调函数单作为一章节,是因为作为一个对C++不太熟的认来说,回调函数还是有些吃力的,对于理解不到的地方,还望大家见谅。
- 软件环境:
win10 x64
visual studio 2019
CANoe 11 x64
文章目录
- ? 相关文章
- ?前言
- ? CANoe官方代码中的回调函数解读
- ? 新建自己的回调函数
- ?总结
? CANoe官方代码中的回调函数解读
1?? 首先,回调函数也是函数,就像白马也是马一样。它具有函数的所有特征,它可以有参数和返回值。其实,单独给出一个函数是看不出来它是不是回调函数的。回调函数区别于普通函数在于它的调用方式。只有当某个函数(更确切的说是函数的指针)被作为参数,被另一个函数调用时,它才是回调函数。
- 我认为对回调函数解释的比较好的一篇文章回调函数大神的解释
- 看源码 CAPL脚本中我们知道有几个回调函数,但是运行demo,按键全部按完也没有执行,怎么才能被执行呢?怎么才能执行这些回调函数呢
2?? 再看下C++源码,看到这两个函数会调用回调函数,那我们就这两个函数顺藤摸瓜
3?? 在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
4?? 再回到C++代码,根据appSetValue()
函数我找到了相关代码
5?? 再看下appReadData
函数,会调用ShowDates()
这个回调函数
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);
}
? 新建自己的回调函数
6?? 学习就是为了使用的,我们尝试新建一个自己回调函数
- 我以
ShowValue
函数位基准,新建了一个回调函数Print_8888_Num
,目的就是打印一个常量8888.然后在appSetValue
函数中调用 - 为了添加这一个回调函数,我在源码中动了11处的地方,都是在原有的基础上拷贝重命名,这就不贴出来了,代码太多了,有兴趣可以自己尝试下。源码在网盘。
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;
}
7?? ,在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
End |
?总结
? 有需要演示中所用demo工程的,可以关注下方公众号网盘自取啦,感谢阅读。
- ?要有最朴素的生活,最遥远的梦想,即使明天天寒地冻,路遥马亡!
- ? 有手机的小伙伴可以加下交流群,在车载诊断领域的一个小小圈子,群里有
网盘资料
,源码
,可能有你需要的呢,平时可以交流技术,聊聊工作机会啥的。
- ?如果这篇博客对你有帮助,请 “点赞” “评论”“收藏”一键三连 哦!码字不易,大家的支持就是我坚持下去的动力。