2. 传递字符串参数并返回长度

任务目标

在DLL中实现一个函数,接收CAPL传递的字符串参数,返回该字符串的字符长度,并在CAPL中调用该DLL函数进行验证。

环境与依赖

  • 开发工具:Visual Studio(C++环境,用于生成DLL)
  • 运行环境:CANoe(支持CAPL脚本)
  • DLL位数:必须与CANoe运行位数一致(32位或64位)

DLL端实现(C++)

创建一个Win32 DLL项目,导出函数GetStringLength。CAPL与DLL之间传递字符串采用char*指针方式,CAPL侧字符串以char[]数组形式传入。

// dllmain.cpp
#include <windows.h>
#include <string.h>

extern "C" __declspec(dllexport) int GetStringLength(char* str)
{
    if (str == NULL) return 0;
    return (int)strlen(str);
}

// 标准DLL入口,无需额外逻辑
BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    return TRUE;
}

编译生成StringLenDll.dll,注意选择与CANoe一致的平台(x86或x64)。

CAPL端调用

将生成的DLL文件放置到CANoe工程目录或系统路径中。在CAPL中通过extern声明DLL函数,并在on start中调用验证。

// CAPL脚本
extern int GetStringLength(char str[]);  // 声明DLL函数

on start
{
    char testStr[50] = "Hello CAPL";
    int len;

    len = GetStringLength(testStr);
    write("字符串: \"%s\"", testStr);
    write("返回长度: %d", len);

    // 验证:期望长度为10(不含结尾空字符)
    if (len == 10)
    {
        write("测试通过: 长度正确");
    }
    else
    {
        write("测试失败: 长度错误");
    }
}

运行与验证

  1. 在Visual Studio中编译生成DLL,确认输出文件为StringLenDll.dll。
  2. 将DLL复制到CANoe工程所在目录(或Windows系统搜索路径)。
  3. 在CANoe中新建或打开一个工程,添加上述CAPL脚本到仿真节点。
  4. 启动CANoe仿真(按F5或点击Start按钮)。
  5. 观察Write窗口输出:
字符串: "Hello CAPL"
返回长度: 10
测试通过: 长度正确

若输出返回长度: 10且显示测试通过,则说明DLL函数正确接收了CAPL传递的字符串并返回了正确的字符长度。

常见问题

  • DLL加载失败:确认DLL位数与CANoe一致(32位CANoe对应x86编译,64位对应x64编译)。
  • 函数名修饰问题:使用extern "C"防止C++名称修饰,确保导出函数名与CAPL声明一致。
  • 字符串编码:CAPL中char[]为ANSI编码,DLL端使用strlen按字节计数;若含中文字符,返回的是字节数而非字符数,本案例仅针对ASCII字符串验证。