блок "Extern...End Extern", импорт и экспорт функций, процедур.

Предыдущая тема Следующая тема Перейти вниз

блок "Extern...End Extern", импорт и экспорт функций, процедур.

Сообщение  electrik в Чт Дек 18, 2008 8:49 pm

блок "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 "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".
Для тех, кто не знает, что такое динамические, и статические библиотеки, рекомендую прочитать
http://freebasic.justforum.net/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
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Re: блок "Extern...End Extern", импорт и экспорт функций, процедур.

Сообщение  electrik в Чт Дек 18, 2008 8:52 pm

ну вот, перезалил сюда. только из корня документации копию этой темы надо удалить.

electrik

Сообщения : 391
Дата регистрации : 2008-09-02
Возраст : 37
Откуда : галактика Млечный путь, система Солнечная, планета Земля, страна россия, город Санкт Петербург

Посмотреть профиль

Вернуться к началу Перейти вниз

Предыдущая тема Следующая тема Вернуться к началу

- Похожие темы

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения