Неверный тип в dll & lt; dllname.dll & gt; & lt; имя_функции & gt; но я не вижу ошибки

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.

2

Решение

Согласно «Внедрение и интеграция 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;
}

объяснение

  1. Так как только 4-й параметр (d) является массивом (1-мерным), Определение глубины массива является:

    "\000\000\000\001\000"
  2. Не использовать int16, Используйте типы, описанные в таблице 3 (Типы данных параметров функции и возвращаемого значения). поскольку int а также char можно использовать только если размер массива! = 0, мы используем long,

1

Другие решения

Других решений пока нет …

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector