Здравствуйте, Пытаюсь подцепить DLL'ку вида T13.dll, вроде, все как написано (стр. 532) делаю, ничего не работает. Ни в случае канала "I" - канал не принимает данные, ни в случае "O" - dll не создает файл. DLL создаю в С++ Builder 6.0, пробовал разные модификаторы (extern, extern "C", __cdecl и т.п.) 1) какими средствами можно подсмотреть, пытается TM вызвать функцию из DLL или нет? 2) МОжет есть пример вызова DLL-ки, написанной на Builder'е?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
У нас в документации сказано, что мы рекомендуем именно VS C++ от Microsoft, потому как разные компиляторы по-разному могут собирать dll-файлы. В частности в справке в этом же разделе сказано, что:
quote: Компилятор Borland C++ Builder 6.0 неправильно обрабатывает DEF-файлы. Добиться присвоения нужных ordinals удается, только расположив определения функций в алфавитном порядке в исходном файле.
Posted by AndreyV (Участник № / Member № 1542) on :
И в алфавитном порядке расположил, и кучу модификаторов перепробовал: extern "C" __declspec(dllexport) int t13_fread(char *name,IA &ia, float &v); extern __declspec(dllexport) int t13_fread(char *name,IA &ia, float &v);
У меня генерятся имена экспортируемых функций вида: GLOBAL _t13_fread:PROC GLOBAL @t13_fread$qpcr2IArf:PROC
А надо, как я понял вот так: GLOBAL ?OpenMedia@@YAHAAJ@Z:PROC
Правильно? Если'б быть уверенным, что дело только в этом, наверное можно "добить" Билдеровское декорирование имен.
Поэтому есть большое желание где-то увидеть отражение попытки TM вызвать функцию из DLL'ки. Может в логе, может канал какой-то тестовый завести надо... Вы можете посоветовать, как убедиться в том, что TM действительно пытается вызвать функцию из DLL'ки?
Posted by AndreyV (Участник № / Member № 1542) on :
Подготовил DLL в MS Visual C++, получил Microsoft'овские имена экспортируемых функций:
GLOBAL ?t13_close@@YAXXZ:PROC GLOBAL ?t13_fread@@YAHPADAATIA@@AAM@Z:PROC GLOBAL ?t13_fwrite@@YAHPADAATIA@@M@Z:PROC GLOBAL ?t13_open@@YAXXZ:PROC GLOBAL ?t13_read@@YAHPADAATIA@@AAM@Z:PROC GLOBAL ?t13_start@@YAXXZ:PROC GLOBAL ?t13_stop@@YAXXZ:PROC GLOBAL ?t13_write@@YAHPADAATIA@@M@Z:PROC
Работу DLL - не вижу. Канал ПУСТОЙ, fast_R/W IO=1, значение канала=1, пробую для типа I (input), затем меняю на O (output) и снова запускаю редактор базы каналов в режиме эмуляции.
Где я могу увидеть попытку TM вызвать DLL'ку?
Posted by AdAstra Technical Support (Участник № / Member № 4) on :
А в РБК это работать и не будет! Он только для эмуляции работы математики и каналов, в нем не работают внешние обращения. Проверку необходимо делать либо в РПД, либо в Профайлере.
Posted by AndreyV (Участник № / Member № 1542) on :
Спасибо, DLL успешно "подцепилась" TM работает. С'шный код пришлось компилировать в Microsoft VC, в Builder'е решить проблему с декорированием имен функций так и не удалось.