Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
Форум программистов > Fortran > [General] Вызов DLL из программы. |
Автор: Karabas 12.7.2006, 09:57 | ||||
Я понимаю, избитый вопрос, но тем не менее ответ все еще не ясен. Как вызвать функцию dll из программы на фортране? Я использую Fortran power station 4, но обсуждения о других весиях тоже не дают ответа. Типичный ответ на такой вопрос (либо в хелпе, либо на форумах): Сделатаь ДЛЛ из файла f90vb4.f90 :
you can compile from the command line with: fl32 /LD f90vb4.f90 which creates a DLL named f90vb4.dll. Вызвать функцию из ДЛЛ:
Но где же в этой программе вызова указано ИМЯ(!) нужной dll библиотеки? А если у меня библиотек несколько и вызвать мне надо вполне определенную функцию из определенной ДЛЛ? И действительно, при попытка скомпилить этот пример компилятор отвечает, что не знает external функции ARRAYTEST , и чисто по-человечески я могу его (компилятор) понять. Либо из этого примера выкинули нечто важное, либо существуют некие правила, используемые фортраном по умолчанию, и которые я не знаю.. Помогите, пожалуйста, если кто сталкивался. |
Автор: Cr@$h 13.7.2006, 06:57 |
Надеюсь, с "Вызовом DLL из программы на фортране" автору топика теперь прояснилось. Вопрос коллизии имён процедур при использовании не одной DLL несколько выходит за рамки данной темы. Ведь эта проблема решается как при неявном (статическом), так и при явном (динамическом) подключении. Здесь же я рассказал, что не доставало Karabas при неявном подключении, и, если что-то осталось за кадром, можно продолжить дискуссию. Про то, как же подключать несколько DLL, содержащих процедуры с одинаковыми именами, предлагаю обсуждать в новой http://forum.vingrad.ru/index.php?showtopic=103924, т.к. эта проблема может заинтересовать многих и не отражёна в названии этого топика. |
Автор: Karabas 13.7.2006, 11:52 |
Спасибо, Cr@$h, заработало. ![]() Теперь я понял, каким образом мой компилятор знает, что надо использовать внешнюю библиотеку. Я ОБЯЗАН ему это сообщить, путем включения в мой проект файла lib соответствующей библиотеки. Надо внимательнее читать мануал.. ![]() Как я понимаю, отсюда следует слудующий вывод: Если есть готовая библиотека dll, то вовсе не факт, что я смогу ее использовать в своем проекте. То есть можно рассчитывать только на свои силы.. ![]() Вообще-то с точки зрения копирайта это имеет смысл, но неужели это действительно так? Я попробовал подключить сразу dll библиотеку к моему проекту -- не пошло. Требует lib. Да, и еще вопрос (я рабою только на фортране, кто знает -- просветите), при создании длл в других языках создается такой же файл .lib с синтаксисом идентичным фортраноскому? Другими словами, .lib -- это общий стандарт или все зависит от компилятора? |
Автор: Cr@$h 13.7.2006, 21:54 | ||||||||||||||
Почему. Всегда можно. Для этого нужно знать используемые DLL соглашения о вызовах и имена экспортируемых процедур. Последние можно узнать, используя специальные утилиты. В IFVC 9.1 пишут про DUMPBIN:
Если с DLL идёт библиотека импорта .lib, радуйся -- можешь использовать статическое (неявное подключение). В этом случае потребуется только описать интерфейсы внешних процедур. Если lib'а не идёт -- Win API тебе придётся юзать. В соседней теме можешь, например посмотреть. Тоже ничего сложного на самом деле.
Не совсем уловил мысль ![]()
Посмотри пример в созданной http://forum.vingrad.ru/index.php?showtopic=103924. Кидаешь DLL в папку с exe'шником, в коде используешь Win API процедуры. Если возникнут непонятки, можешь создать тему именно про "Динамическое подключение DLL в Fortran |явное использование Win API процедур|". Эта пока больше про статическое (неявное) подключение.
По идее, он зависит от платформы: под виндамии на IA-32 всё должно быть едино. .obj файлы могут различаться у компиляторов и то не факт. Я занимался системным программированием, раньше стандарта чёткого не существовало, большинство любили формат obj от IBM. Сейчас мы живём в XXI веке и, думаю, здесь давно всё нормально. Специально искал инфу по этому делу, но нашёл в MSDN только это:
По секрету говоря, IVFC (Intel Visual Fortran Compiler) использует link'ер от Microsoft'а. Для FPS, DVF, CVF это аналогично, ведь все сидят в одной IDE Developer Studio. При создании DLL на Fortran использовал их на С++ в VS вместе с созданными .lib -- и ничего, всё нормально. .lib это как .dll и .exe -- на одной оси для IA-32 (Intel 32-совместимых процов) они создаются по одним незыблемым правилам. Думаю, я ответил на вопрос. |