1. 创建第一个DLL并调用加法函数

任务目标

创建一个C++动态链接库(DLL),导出加法函数 Add,并在CAPL脚本中通过外部函数声明调用该DLL,实现两个整数的相加并输出结果。

环境准备

  • Windows系统,安装Visual Studio(本文以VS2019为例,其他版本操作类似)
  • CANoe(本文以CANoe 11.0为例)

实现步骤

1. 创建C++ DLL工程并导出加法函数

在Visual Studio中新建“动态链接库(DLL)”项目,将以下代码保存为 dll_add.cpp:

// dll_add.cpp
#include <windows.h>

extern "C" __declspec(dllexport) int Add(int a, int b)
{
    return a + b;
}

// 可选:DLL入口点(非必需)
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    return TRUE;
}

编译生成 dll_add.dll(注意选择与CANoe位数一致的平台,通常为x64)。

2. 将DLL放置到CANoe可访问目录

将生成的 dll_add.dll 复制到CANoe工程目录下,或直接放到系统PATH包含的目录(如 C:\Windows\System32)。推荐放在CANoe工程目录,便于管理。

3. 编写CAPL脚本调用DLL

在CANoe中新建CAPL程序,输入以下代码:

// CAPL脚本:调用DLL中的Add函数
char dllPath[256] = "dll_add.dll";  // DLL文件名或完整路径

// 声明外部函数原型
extern int Add(int a, int b);

on start
{
    int result;
    int x = 15;
    int y = 27;

    // 调用DLL中的加法函数
    result = Add(x, y);

    write("调用DLL加法函数: %d + %d = %d", x, y, result);
}

4. 运行与验证

  1. 在CANoe中加载包含上述CAPL脚本的节点。
  2. 点击“运行”按钮启动仿真。
  3. 观察Write窗口输出。

预期输出:

调用DLL加法函数: 15 + 27 = 42

通过条件:Write窗口显示上述输出,且无错误信息,说明DLL加载成功、函数调用正确。

常见问题

  • DLL加载失败(错误码193/126):检查DLL位数是否与CANoe一致(x86/x64),确认DLL路径正确。
  • 函数未找到:确认导出函数使用了 extern "C" 且未加 __stdcall(除非CAPL声明中显式指定调用约定)。
  • CAPL编译报错:检查函数声明是否与DLL导出名称完全一致(大小写敏感)。

关键点说明

  • 使用 extern "C" 防止C++名称修饰,确保导出函数名在DLL中保持为 Add。
  • CAPL中通过 extern 关键字声明外部函数,运行时CANoe自动从已加载的DLL中查找符号。
  • DLL需在CAPL执行前位于系统可搜索路径中,否则需在 dllPath 中指定完整路径。