dll 中的输入无效<dllname.dll>但我<functionname>没有看到错误

Invalid type in dll <dllname.dll><functionname> but I don't see the error

本文关键字:gt dll lt 错误 functionname dllname 输入 无效 但我      更新时间:2023-10-16
CAPL_DLL_INFO4 table[] = {
{CDLL_VERSION_NAME, (CAPL_FARCALL)CDLL_VERSION, "", "", CAPL_DLL_CDECL, 0xabcd, CDLL_EXPORT },
  ... 
  {"dllTEST",(CAPL_FARCALL)GetAttribute,"CAPL_DLL","...",'I', 5, "IIICI", "01010110001",{ "x","x","x","x","x" } },
  ...
{0, 0}
};
CAPLEXPORT CAPL_DLL_INFO4 far * caplDllTable4 = table;

这是我在源文件中的 CAPL 导出表,它是用 c++ 编写的,编译时没有错误或警告 *.dll。函数接口在我的定义和原型中如下所示:

int CAPLEXPORT far CAPLPASCAL GetAttribute(int16 a, int16 b, int16 c, char d[], int16 e);

在 CANoe 中成功实现 *.dll 后,我在 CANoe 中出现编译错误:

CAPL node 'ECU 1': Compilation of '..ecu.can' failed with error(s)
Invalid type in DLL ..abc.dll, function dllTEST.

我错过了一些明显的东西吗?函数中使用的类型都精细地转换为 CAPL 符合类型,在第 15 页的 pdf 中,您可以阅读有关错误的信息:

编译 CAPL 程序时会捕获此错误。CAPL 导出表中定义的函数不正确。大多数情况下,它是 CAPL 导出表中的参数设置。

根据"实现和集成 CAPL DLL"手册,函数声明和函数表应如下所示:

long CAPLEXPORT far CAPLPASCAL GetAttribute(long a, long b, long c, char d[], long e);
CAPL_DLL_INFO table[] = {
    {CDLL_VERSION_NAME, (CAPL_FARCALL)CDLL_VERSION, CAPL_DLL_CDECL, 0xabcd, CDLL_EXPORT},
    ... 
    {"dllTEST", (CAPL_FARCALL)GetAttribute, 'L', 5, "LLLCL", "0000000100"},
    ...
    {0, 0}
};
unsigned long CAPLEXPORT __cdecl caplDllGetTable(void)
{
    return (unsigned long)table;
}

解释

  1. 由于只有第 4 个参数 ( d ) 是数组(1 维),因此数组深度定义为:

    "0000000100"
    
  2. 请勿使用 int16 。使用表 3(函数参数和返回值数据类型)中所述的类型。由于 intchar 只能在数组大小 !=0 时使用,因此我们使用 long