блок "Extern...End Extern", импорт и экспорт функций, процедур.
Страница 1 из 1
блок "Extern...End Extern", импорт и экспорт функций, процедур.
блок "Extern...End Extern", импорт и экспорт функций, процедур.
Extern...End Extern
Блок для обьявления(декларирования) функций, процедур, из внешних библиотек. функции, процедуры, бывают нескольких типов соглашений.
синтаксис:
Extern { "C" | "C++" | "Windows" | "Windows-MS" } { lib "libName" }
'далее декларируем функции, процедуры типа:
declare function retValue alias "retValue"() as integer
declare sub sndGenerate alias "sndGenerate"(byval freq as integer, duration as integer)
end extern 'завершаем блок
Что такое "C", "C++", "Windows", "Windows-MS"?
Данные ключевые слова, указывают компилятору, с каким типом (соглашением) функций мы работаем. Остановимся на этом подробней:
Extern "C"- в данном блоке, декларируются функции с соглашением cdecl. Соглашение "cdecl", означает "c declaration". данное соглашение является родным языку "c". Как уже все поняли, ключевое слово "c", говорит компилятору, что мы будем объявлять функции совместимые с языком "c".
Extern "C++"- тоже самое что и "c", но совместимое с g++-4.x
Extern "Windows"- в этом блоке декларируются функции с соглашением "stdcall". Соглашение "stdcall", означает "standart call". К именам функций и процедур автоматически добавляются суффиксы типа:
msg@20
test@0
myFunc@8
данные суффиксы означают, сколько байт надо отводить под параметры функций, процедур. Это соглашение во FreeBasic, установлено по умолчанию.
Extern "Windows-MS"- тоже что и "Windows", но только к функциям и процедурам, не добавляются суффиксы "@n". выше приведенные функции будут выглядеть так:
msg
test
myFunc.
{ lib "libName" }- "libName" имя внешней библиотеки из которой будут импортироваться функции. требуется только если не указана препроцессор команда "#inclib".
примеры:
Динамические библиотеки. Импорт и экспорт функций в блоке "Extern...End Extern".
Для тех, кто не знает, что такое динамические, и статические библиотеки, рекомендую прочитать
https://freebasic.forum2x2.ru/forum-f10/tema-t111.htm
В блоке "Extern...End Extern" можно импортировать, и экспортировать функции, процедуры. Как это делать?
Предположим, вы хотите сделать динамическую библиотеку, соглашения которой отличаются от стандартного "stdcall" с префиксами "@n". В нашем случае, пусть будет соглашение "stdcall", но без префиксов "@n". Тогда, сделаем следующее:
напишем нашу функцию в блоке "Extern...End Extern".
код нашей динамической библиотеки "beeps.bas":
компилировать:
После компиляции появятся два файла, "beeps.dll" и "libbeeps.dll.a". файл "libbeeps.dll.a" является как бы связующим звеном с нашей dll. в принципе, можно обойтись и без него, но так будет правильней. всеже, бывают такие dll, к которым нет или не возможно найти такие заголовочные библиотеки. мы рассмотрим несколько способов потключения dll в блоке "Extern...End Extern".
Напишем для нашей dll, код тестовой программы "beepst.bas":
В данном случае, мы используем стандартный метод потключения библиотеки.
#inclib "beeps"- данная строка означает, что мы используем связующую библиотеку, но что делать, она у меня потерялась, винт бэдами покрылся, а dll поюзать охото!
перепишем программу вот так:
Ну как, она заработала? Но тут встанет вопрос: а если мне надо пятьдесят процедур и функций описать, а каждый раз в декларациях писать строку типа "lib "beeps"" ух как лень!
А вот так легко:
Уф, вроде как работает, значит можно жить. Таким же образом, можно создавать библиотеки совместимые с "c", "c++", с соглашением cdecl.
Примечание: код программ тестировался под windows, поэтому линуксойдам придется самим помудрить.
Extern...End Extern
Блок для обьявления(декларирования) функций, процедур, из внешних библиотек. функции, процедуры, бывают нескольких типов соглашений.
синтаксис:
Extern { "C" | "C++" | "Windows" | "Windows-MS" } { lib "libName" }
'далее декларируем функции, процедуры типа:
declare function retValue alias "retValue"() as integer
declare sub sndGenerate alias "sndGenerate"(byval freq as integer, duration as integer)
end extern 'завершаем блок
Что такое "C", "C++", "Windows", "Windows-MS"?
Данные ключевые слова, указывают компилятору, с каким типом (соглашением) функций мы работаем. Остановимся на этом подробней:
Extern "C"- в данном блоке, декларируются функции с соглашением cdecl. Соглашение "cdecl", означает "c declaration". данное соглашение является родным языку "c". Как уже все поняли, ключевое слово "c", говорит компилятору, что мы будем объявлять функции совместимые с языком "c".
Extern "C++"- тоже самое что и "c", но совместимое с g++-4.x
Extern "Windows"- в этом блоке декларируются функции с соглашением "stdcall". Соглашение "stdcall", означает "standart call". К именам функций и процедур автоматически добавляются суффиксы типа:
msg@20
test@0
myFunc@8
данные суффиксы означают, сколько байт надо отводить под параметры функций, процедур. Это соглашение во FreeBasic, установлено по умолчанию.
Extern "Windows-MS"- тоже что и "Windows", но только к функциям и процедурам, не добавляются суффиксы "@n". выше приведенные функции будут выглядеть так:
msg
test
myFunc.
{ lib "libName" }- "libName" имя внешней библиотеки из которой будут импортироваться функции. требуется только если не указана препроцессор команда "#inclib".
примеры:
- Код:
Extern "C" 'блок для объявления функций совместимых с "c", с соглашением "cdecl"
Declare Sub SomeProcedure ( ByVal As Integer )
End Extern ' конец блока
- Код:
Extern "C++" 'блок для объявления функций совместимых с "c++", с соглашением "cdecl"
Declare Function AnotherProcedure ( ByVal As Integer ) As Integer
End Extern 'конец блока
- Код:
Extern "Windows" 'блок для объявления функций с соглашением "stdcal".
'к именам функций автоматически добавляются суффиксы "@n"
Declare Function YetAnotherProcedure ( ByVal As Integer ) As Integer
End Extern 'конец блока
- Код:
Extern "Windows-MS" 'блок для объявления функций с соглашением "stdcal".
'к именам функций не добавляются суффиксы "@n"
Declare Function myFunc( ByVal As Integer ) As Integer
End Extern 'конец блока
Динамические библиотеки. Импорт и экспорт функций в блоке "Extern...End Extern".
Для тех, кто не знает, что такое динамические, и статические библиотеки, рекомендую прочитать
https://freebasic.forum2x2.ru/forum-f10/tema-t111.htm
В блоке "Extern...End Extern" можно импортировать, и экспортировать функции, процедуры. Как это делать?
Предположим, вы хотите сделать динамическую библиотеку, соглашения которой отличаются от стандартного "stdcall" с префиксами "@n". В нашем случае, пусть будет соглашение "stdcall", но без префиксов "@n". Тогда, сделаем следующее:
напишем нашу функцию в блоке "Extern...End Extern".
код нашей динамической библиотеки "beeps.bas":
- Код:
Extern "Windows-MS"
sub beeps alias "beeps"_
(byval numBeeps as integer, byval pauseMs as integer) export
dim beepCount as integer
for beepCount = 1 to numBeeps
beep
sleep pauseMs,1
next
end sub
end extern
компилировать:
- Код:
fbc -dll beeps.bas
После компиляции появятся два файла, "beeps.dll" и "libbeeps.dll.a". файл "libbeeps.dll.a" является как бы связующим звеном с нашей dll. в принципе, можно обойтись и без него, но так будет правильней. всеже, бывают такие dll, к которым нет или не возможно найти такие заголовочные библиотеки. мы рассмотрим несколько способов потключения dll в блоке "Extern...End Extern".
Напишем для нашей dll, код тестовой программы "beepst.bas":
- Код:
#inclib "beeps"
extern "Windows-MS"
declare sub beeps alias "beeps"_
(byval numBeeps as integer, byval pauseMs as integer)
end extern
print"three beeps"
beeps(3,300)
В данном случае, мы используем стандартный метод потключения библиотеки.
#inclib "beeps"- данная строка означает, что мы используем связующую библиотеку, но что делать, она у меня потерялась, винт бэдами покрылся, а dll поюзать охото!
перепишем программу вот так:
- Код:
extern "Windows-MS"
declare sub beeps lib "beeps" alias "beeps"_
(byval numBeeps as integer, byval pauseMs as integer)
end extern
print"three beeps"
beeps(3,300)
Ну как, она заработала? Но тут встанет вопрос: а если мне надо пятьдесят процедур и функций описать, а каждый раз в декларациях писать строку типа "lib "beeps"" ух как лень!
А вот так легко:
- Код:
extern "Windows-MS" lib "beeps"
declare sub beeps alias "beeps"_
(byval numBeeps as integer, byval pauseMs as integer)
end extern
print"three beeps"
beeps(3,300)
Уф, вроде как работает, значит можно жить. Таким же образом, можно создавать библиотеки совместимые с "c", "c++", с соглашением cdecl.
Примечание: код программ тестировался под windows, поэтому линуксойдам придется самим помудрить.
Последний раз редактировалось: electrik (Ср Май 24, 2017 1:17 pm), всего редактировалось 2 раз(а)
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Re: блок "Extern...End Extern", импорт и экспорт функций, процедур.
ну вот, перезалил сюда. только из корня документации копию этой темы надо удалить.
electrik- Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 43
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург
Страница 1 из 1
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|