FreeBASIC в России

   

 Главная   Исходники   Русскоязычный форум   Полезные файлы   Пользователи   Поиск

 

 FB Wiki   Уроки   Скачать FreeBASIC   Проекты   Ссылки   Загрузить   Каталог ссылок

 
 

 Замечания и предложения по работе сайта оставляйте здесь.

Сейчас на сайте:

Вы вошли как: Guest   Регистрация   

Логин:     Пароль:     

Создай бесплатно WebMoney кошелёк на своём мобильном всего за 5 минут

 

Делаем dll своими руками

Хэндл окна

Графические средства языка

Точка пересечения отрезков

Окна без рамки

Физика поведения ядра

Win32 API Введение

►Урок 1 Win32 API

►Урок 2 Win32 API

►Урок 3 Win32 API

►Урок 4 Win32 API

►Урок 5 Win32 API

►Урок 6 Win32 API

►Урок 7 Win32 API

►Урок 8 Win32 API

►Урок 9 Win32 API

►Урок 10 Win32 API

►Урок 11 Win32 API

►Урок 12 Win32 API

►Урок 13 Win32 API

►Урок 14 Win32 API

►Урок 15 Win32 API

►Урок 16 Win32 API

►Урок 17 Win32 API

►Урок 18 Win32 API

►Урок 19 Win32 API

►Урок 20 Win32 API

►Урок 21 Win32 API

►Урок 22 Win32 API

►Урок 23 Win32 API

►Урок 24 Win32 API

Ассоциация файлов

Определить OS

Выводит имя компьютера

 

 

 

Платформа win32. Пишем на FreeBasic не используя runtime библиотеки, уменьшаем размер бинарника, делаем dll своими руками, функция WinMain.

Опытом поделился:   18.06.2011

 

Реклама:

Избирательная система - система обратной проекции. Система обратной проекции удобнее.;делопроизводство в сельском хозяйстве;усыпление животных

Введение.
как-то сравнивал я разные hello world'ы, на ассемблере и FreeBasic, и программы откомпилированные на FreeBasic, всегда получались больше.
я думал, что там они суют в бинарник?, что он такой огромный, даже без использования функций rtl.
все оказалось просто. непосредственно перед нашим кодом, идут всякие инициализации критических секций, командная строка и т.д.
зачастую в простых программах, нам это не нужно, да и хочется сделать маленький бинарник.
хорошо, что разработчики FreeBasic, предусмотрели ключик "-v", он показывает все шаги компиляции, какие программы исполняет и какие параметры им передает.
среди этих параметров, есть ссылки на объектные файлы и библиотеки, которыми мы и займемся.
простая программа с MessageBox'ом, занимает около 7 кб, мы же сделаем такую в 2.5 кб, при линковке убрав ненужные нам библиотеки и объектные файлы.
вам вообще придется забыть про стандартные функции FreeBasic,так как библиотеки от него линковаться не будут.

что нельзя делать.
объявлять строки "string"- только "zString, так как там вызывается много rtl функций.
присваивать строкам значения типа такого:

Скопировать данный код в буфер обмена

придется написать так:

Скопировать данный код в буфер обмена

также не допустимы объединения строк:

Скопировать данный код в буфер обмена

правильно будет так:

Скопировать данный код в буфер обмена

заместо функции end, надо использовать ExitProcess.
примечание: ExitProcess, не закрывает все открытые дескрипторы файлов, устройств и т.д, как функция end. вы сами должны позаботится о закрытии открытых устройств, файлов, функцией CloseHandle или вызвать специальные функции предназначеные для ьтой или иной задачи.
хотя, чесно говоря, я этого не знаю, может она и закрывает открытые дескрипторы, но лучше самим освобождать ресурсы, так надежнее.
короче, придется вам писать на чистом WinApi, или самим разрабатывать удобные для вас функции, но тоже на WinApi.
хотим маленький бинарник, придется попотеть.
ну ладно, испугал я вас, насамом деле не так все страшно. давайте перейдем к первой программе, и конечно же это будет Hello world.

hello world.

Скопировать данный код в буфер обмена

в процедуре main, мы используем alias имя для того, чтоб линкеру указывать имя точки входа теми символами, которые объявили в исходнике.
если неиспользовать alias имя, нам придется указать линкеру точку входа большими буквами.
примечание: указывать точку входа, обязательно, начиная символом "_".
ну а теперь батник для компиляции
все пути прописаны под мою конфигурацию, сами подправите.

Скопировать данный код в буфер обмена

ну как, думаю размер файла вам понравился.

краткое описание некоторых параметров.
ключ -e, после него можно указать точку входа в программу.
строки заканчивающиеся расширением ".o", объектные файлы, в нашем случае это "hello.o"- наша программа ассемблированная в объектный файл.
параметры такого типа:
-lkernel32 -luser32- это подключаемые библиотеки.
все просто, если нам нужна библиотека "advapi32, просто к этим параметрам добавим еще -ladvapi32 и получим следующее:
-lkernel32 -luser32 -ladvapi32
подробнее ключи можно посмотреть набрав:
ld --help

функция WinMain.
есть такая всеми излюбленная функция, да и удобно, когда есть командная строка, хэндл программы, да и параметр поведения окна можно передать.
как такое сделать? вот сама программа.

Скопировать данный код в буфер обмена

батник для компиляции:

Скопировать данный код в буфер обмена

компиляция с ресурсами.
тут все просто. для компиляции .rc файлов, будем использовать утилиту gorc.exe.

файл dialog.rc

Скопировать данный код в буфер обмена

файл dialog.bi

Скопировать данный код в буфер обмена

файл dialog.bas

Скопировать данный код в буфер обмена

батник для компиляции

Скопировать данный код в буфер обмена

все просто, а самое главное, размер бинарника маленький.

создаем dll своими руками.
во FreeBasic, есть возможность создавать динамические файлы dll, но нет возможности обрабатывать внутренние события, которые операционная система посылает главной функции dll "DllMain.
точнее говоря, когда происходит то или иное событие, загрузка, выгрузка и т.д, операционная система вызывает функцию DllMain.
вот программа, в которой реализована функция DllMain, и она же является точкой входа в dll.
так же реализована процедура, которая выводит MessageBox с текстовой строкой на экран.
полное описание функции DllMain, можно посмотреть:
http://vsokovikov.narod.ru/New_MSDN_API/DLL/fn_dllmain.htm

файл mydll.bas

Скопировать данный код в буфер обмена

батник для компиляции

Скопировать данный код в буфер обмена

программа, для вызова процедуры из mydll.dll.

файл testmydll.bas

Скопировать данный код в буфер обмена

батник для компиляции

Скопировать данный код в буфер обмена

при линковке, мы указываем точку входа в dll таким образом
-e [email protected]
функция с соглашением stdcall, помимо названия, имеет префикс, число байт отводимых под параметры.
если такую функцию написать в блоке extern ... end extern с префиксом "windows-ms", функция будет тоже stdcall, но без префиксов. соответственно, при линковке в точке входа префиксы писать ненадо.

после запуска программы testmydll.exe, при загрузке dll, появится соответствующее сообщение.
потом выполница наша процедура, которая выдаст нам сообщение.
после завершения программы и выгрузки dll, будет еще одно сообщение.
надеюсь, что данная писанина вам пригодиться.

 

 

Прокомментировать

Ваше имя:  

Ваш e-mail:  

Сообщение:



Введите код: 

 

 

   Спасибо можно сказать, посетив любую ссылку:

 

 

© 2010-2012

DEPOzit (Попов Денис Владимирович)

WebMoney кошелёк: WMID#302963000004

ICQ:279786014 или R549103331586   Z116647355686