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", "\001\001\001\100\001",{ "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);
После успешного внедрения * .dll в CANoe, я получаю ошибку компиляции в CANoe:
CAPL node 'ECU 1': Compilation of '..\ecu.can' failed with error(s)
Invalid type in DLL ..\abc.dll, function dllTEST.
Я что-то упускаю из виду? Все используемые в функции типы точно преобразуются в типы соответствия CAPL, в этот pdf на стр. 15 вы можете прочитать об ошибке:
Эта ошибка обнаруживается при компиляции программы CAPL. Функция, определенная в таблице экспорта CAPL, неверна. В большинстве случаев это настройки параметров в Таблице экспорта CAPL.
Согласно «Внедрение и интеграция CAPL DLL» manual, объявление вашей функции и таблица функций должны выглядеть примерно так:
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", "\000\000\000\001\000"},
...
{0, 0}
};
unsigned long CAPLEXPORT __cdecl caplDllGetTable(void)
{
return (unsigned long)table;
}
Так как только 4-й параметр (d
) является массивом (1-мерным), Определение глубины массива является:
"\000\000\000\001\000"
Не использовать int16
, Используйте типы, описанные в таблице 3 (Типы данных параметров функции и возвращаемого значения). поскольку int
а также char
можно использовать только если размер массива! = 0, мы используем long
,
Других решений пока нет …