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("测试失败: 长度错误");
}
}
运行与验证
- 在Visual Studio中编译生成DLL,确认输出文件为
StringLenDll.dll。 - 将DLL复制到CANoe工程所在目录(或Windows系统搜索路径)。
- 在CANoe中新建或打开一个工程,添加上述CAPL脚本到仿真节点。
- 启动CANoe仿真(按F5或点击Start按钮)。
- 观察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字符串验证。