Maple, обращение к dll
Сам такие вещи не пробовал делать, но вот что написано в книжке:
А.Матросов "Maple 6. Решение задач высшей математики и механики" .:- СПб. БХВ-Петербург, 2001
Замечание на стр 344.
"Автору, к сожалению, не удалось самостоятельно выполнить вызов внешней процедуры из-за непонятных проблем, связанных с компилятором Microsoft Visual C++ 6.0. Команда define_external вызывала компилятор С, транслировала сгенерированную Maple интерфейсную С-функцию, создавала библиотеку DLL и помещала в нее оттранслированную функцию и внешнюю процедуру Maple, но на этапе подключения ее к ядру Maple возникала непонятная ошибка, которую автору не удалось исправить."
А.Матросов "Maple 6. Решение задач высшей математики и механики" .:- СПб. БХВ-Петербург, 2001
Замечание на стр 344.
"Автору, к сожалению, не удалось самостоятельно выполнить вызов внешней процедуры из-за непонятных проблем, связанных с компилятором Microsoft Visual C++ 6.0. Команда define_external вызывала компилятор С, транслировала сгенерированную Maple интерфейсную С-функцию, создавала библиотеку DLL и помещала в нее оттранслированную функцию и внешнюю процедуру Maple, но на этапе подключения ее к ядру Maple возникала непонятная ошибка, которую автору не удалось исправить."
Спасибо...
>>из-за непонятных проблем, связанных с компилятором Microsoft Visual C++ 6.0.
у многих прикладных математиков руки из жопы растут - это, между прочим, известный факт :
но компилятор MSVC++ тут не при чем
у многих прикладных математиков руки из жопы растут - это, между прочим, известный факт :
но компилятор MSVC++ тут не при чем

Можно предположить, что виновато декорирование имён. То, что у вас с коде функция называется f не значит, что из DLL она экспортируется под именем f. Там может быть нечто вроде ?@Z. Вероятно поэтому Maple, который мыслей программиста не читает, и честно ищет имя f, говорит "The specified procedure could not be found". Чтобы посмотреть, под каким именем функция экспортируется, можно натравить на Вашу DLL dumpbin. Эта утилита идёт в комплекте с MSVC, лежит в папке VC98\Bin. Делаем так: dumpbin my_cool.dll /exports и видим все экспорты. Если я не ошибся, то решением проблем станет следующее:
extern "C"{
__declspec(dllexport) int __cdecl f(int a, int b);
}
Если сделать так, то имя f в таблице экспортов так и останется f. И тогда, возможно, будет Вам счастье.
extern "C"{
__declspec(dllexport) int __cdecl f(int a, int b);
}
Если сделать так, то имя f в таблице экспортов так и останется f. И тогда, возможно, будет Вам счастье.
Спасибо!
Воспользовался указанием - и смог передавать Maple'у функции без аргументов, а для передачи оных пришлось всё-таки исправлять вручную внутренний глюк Maple7.
Теперь я могу складывать целые числа внешними средствами.
Обещаю дополнить распухающий диплом благодарностью анониму-...
Воспользовался указанием - и смог передавать Maple'у функции без аргументов, а для передачи оных пришлось всё-таки исправлять вручную внутренний глюк Maple7.
Теперь я могу складывать целые числа внешними средствами.
Обещаю дополнить распухающий диплом благодарностью анониму-...
Оставить комментарий
dus1970
Существует dll, успешно собранный средствами VC++; f - функция, объявленная в нем так:Пытаюсь, пребывая внутри Maple'а, выполнить команду
Вот сообщение об ошибке:
Подскажите, если кто сталкивался, как с этим бороться.