Purebasic как написать программу

Время на прочтение
2 мин

Количество просмотров 4.8K

Привет, хабровчане!

Хочу поведать вам о языке программирования PureBasic. PureBasic — это мощный, компилируемый язык, основанный на синтаксисе стандартного Бейсика. Предназначен для создания автономных консольных и GUI приложений, игр и многого др. для различных платформ. Язык разрабатывается более 10 лет и постоянно совершенствуется.

Главная особенность PureBasic — кроссплатформенность. На данный момент поддеживаются операционные системы: Windows, Linux, MacOS и AmigaOS. Это значит, что тот же самый код может быть спокойно скомпилирован на разных платформах, с небольшими изменениями или без них вовсе.

С помощью языка PureBasic вы напишете любую программу любой сложности. Этот язык обладает очень простым синтаксисом, в то же время поражает своей функциональностью. Поэтому он легко усваивается и подходит для начинающих программистов. Впрочем, и для опытных кодеров имеется хороший арсенал инструментов.

Имеется визуальный проектировщик окон. Установленная среда разработки занимает около 25 МБ, не требует серьезных настроек и быстро загружается. В программе имеется лишь один маленький минус — она платная. Но это действительно не сильно смущает, не так ли? ;)

Главные особенности PureBasic

  • Огромный набор встроенных команд (более 800) позволяет быстро и легко создать любое приложение или игру
  • Поддержаны все ключевые слова стандартного Бейсика
  • Очень быстрый компилятор, создает чрезвычайно оптимизированный исполняемый код
  • Созданные исполняемые файлы не требуют сторонних DLL или интерпретаторов
  • Полный доступ к OS API для продвинутых программистов
  • Простой и очень быстрый 2D движок для игр (DirectX, SDL, HGE…)
  • Простая и высококачественная реализация 3D на движке OGRE
  • Оптимальное использование доступных аппаратных средств
  • Исходный текст совместим между Windows, Linux, MacOS и AmigaOS для игр и приложений
  • Удобная и компактная среда разработки, встроенный визуальный GUI редактор
  • Встроенный отладчик упрощает выявление и отлов программных ошибок

Также в этом Бейсике очень легко реализовывать ассемблерный код, для обработки кода используется компилятор FAsm.

Пример

Продемонстрирую вам пример «Hello, Habr». К сожалению, код после нативного хабраредактора выглядит не очень красиво, поэтому я приложу скриншот.

image

Эта программа открывает окно с текстом и кнопкой закрытия. Если не считать комментарии, на все ушло 9 строчек кода. Исполняемый файл занимает 13 КБ.

image

С официального сайта можете скачать демо-версию программы. В поставке идет большое количество примеров.

* Бесплатная демоверсия ограничивает рамер кода 800 строками и невозможностью вызывать API функции OS.

UPD: Статью дополнил.

Обычно драйверы для Windows пишут на языке C++, возможно потому что DDK фирма Майкрософт предоставила именно для этого языка. Но энтузиасты портировали DKK для других языков. Сейчас мы поговорим о создании драйверов на языке бейсик, который на первый взгляд не подходит для этого (хотя бы потому что бейсик считается простым языком, не предназначенным для системного программирования), но это только на первый взгляд. Теперь давайте определится с диалектом бейсика и компилятором, который будем использовать при разработке драйверов. Наверное стоит выбрать бейсик от фирмы Майкрософт, ведь по логике, он должен лучше всего подходить для разработки под Windows. Претендентами были выбраны Small Basic, VB и VB.NET.
Small Basic и VB.NET были исключены почти сразу. Первый из-за ограниченных возможностей и наличия внешнего рантайма, а второй из-за компиляции только в управляемый код, что нам не подходит, ведь на уровне ядра нет .NET Framework.
VB для создания драйверов в принципе подходит и в соседнем блоге это доказали, но методы создания драйвера, а так же внешний рантайм, ограничивают возможности и снижают удобство разработки.
Поэтому был продолжен поиск требуемого компилятора бейсика, но уже от сторонних фирм, не имеющих прямого отношения к Майкрософт. Подходящим компилятором оказался PureBasic, фирмы Fantaisie Software. Правда он не бесплатный. На данный момент, стоимость индивидуальной лицензии на все версии и платформы составляет 79€.
PureBasic подошел в первую очередь потому, что в его дистрибутиве есть почти все что нужно для компиляции драйвера и необходимо лишь немного изменить ключи ликовки чтобы получить не приложение, а драйвер. Но обо всем по порядку. Прежде рассмотрим процесс компиляции в PureBasic. Он проходит в несколько этапов. Сначала бейсик-код транслируется в ассемблер, а затем при помощи компилятора ассемблера FASM создается объектный файл, который линкуется программой Polink, с функциями PureBasic, находящимися в статических библиотеках и в результате создается исполняемый файл. Чтобы получился драйвер, а не приложение, достаточно изменить ключ линковки с на

Код:

/SUBSYSTEM:native /driver

При этом будет создан драйвер, но он окажется не рабочим, т. к. не решена еще одна проблема — несмотря на то что получился драйвер, он использует WinAPI функции вместо функций ядра. Точнее, это вшитый в него рантайм вызывает некоторые WinAPI функции при инициализации и завершении работы. Есть как минимум два варианта решения этой проблемы.

  1. Исключить рантайм из кода.
  2. Заставить рантайм использовать функции ядра вместо WinAPI.

Первый вариант реализовать не сложно. В процессе компиляции получаем ассемблерный код и несложный препроцессор, находящийся между транслятором бейсик кода (pbcompiler.exe) и ассемблером FASM справится с этой задачей. Но у такого решения есть большой минус — многие возможности станут недоступными. Например, станут недоступными строковые переменные, динамические и ассоциативные массивы, связные списки, перестанут работать многие функции и т. д. Это не лучшее решение, ведь теряется вся простота бейсика.

Второй вариант выглядит трудноосуществимым, ведь функции PureBasic скомпилированы и хранятся в статических библиотеках. Их декомпиляция, модификация и сборка, займут много времени и велика вероятность допустить ошибку, что сделать довольно просто учитывая что придется модифицировать ассемблерный код многих функций.
Так как же быть, ведь без рантайма отсутствуют многие возможности языка, но и использовать его в драйвере не представляется возможным из-за использования WinAPI функции вместо функций ядра?
На самом деле есть довольно простой способ без модификации кода рантайма и функций PureBasic, «отучить» их от WinAPI, причем не просто «отучить», но заставить использовать функции ядра. Звучит невероятно, правда? Но это возможно. Напомню, что рантайм и все функции PureBasic скомпилированы и находятся в статических библиотеках. Причем импорт WinAPI функций осуществляется посредством импорта символов из других статических библиотек и явно не указано из каких. Ничего не мешает подменить статические библиотеку из которой импортируются символы WinAPI функций (это например user32.lib, kernel32.lib и др.), на нашу из которой экспортируются символы с именами как в WinAPI функций. Таким образом чтобы отвязать рантайм и функции от WinAPI, требуется написать n-ое количество функций-переходников, которые являются в той или иной мере, аналогами WinAPI, но из них будут вызываться функции ядра. Конечно не для всех WinAPI функций есть аналоги в ядре, но во многих случаях это решаемо.
Приведу пример аналога WinAPI функции Sleep(), которая вызывает функцию ядра KeDelayExecutionThread().

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
ProcedureDLL RndLib_Sleep(TimeMS)
  Protected Time.q
 
  Time=TimeMS*10000  ; Перевод времени из миллисекунд и сотни наносекунд.
  Time=Time-(Time*2) ; Для задержки относительно текущего времени, число должно быть отрицательным.
 
  ProcedureReturn KeDelayExecutionThread(#KernelMode, #False, @Time)
  !public _Procedure0 as '_Sleep@4'
  !public __imp__Sleep
  !__imp__Sleep:
  !dd _Procedure0
EndProcedure

Как наверное поняли, код написан на PureBasic, но есть проблема, PureBasic не поддерживает создание статических библиотек, что странно, учитывая что в его дистрибутиве есть все необходимое для этого. Поэтому сборка статической библиотеки производилась в два этапа. Сначала утилитой coffIT из этого кода создавался в объектный файл (утилита при этом использовала pbcompiler и fasm), а затем, собиралась статическая библиотека при помощи утилиты polib, находящейся в папке Compilers дистрибутива PureBasic.
В этом коде, все что находится после символа «!» не обрабатывается компилятором PureBasic, а передается fasm в неизменном виде. Оператор public создает общедоступные метки, которые не будут удалены при компиляции и останутся в статической библиотеке. Именно это нам и нужно. Линкер вместо WinAPI функции Sleep() использует нашу, а поскольку есть вызов функции KeDelayExecutionThread, то линкер попытается ее найти в статических библиотеках и обнаружив в «ntoskrnl.lib», добавит функцию в импорт драйвера. WinAPI функция Sleep() туда не попадет, поскольку она заменена на нашу. Аналогичным образом подменяются и другие функции. Это позволило не только успешно инициализировать рантайм, но и заставить работать многие функции PureBasic, среди которых оказались и те, которые в драйвере вряд ли понадобятся. Например функции получения хеша (CRC32, MD5, SHA1 и т. д.) данных в памяти, а так же функции работы с регулярными выражениями.

В результате всего этого, был создан пакет файлов, который находится во вложении.
Установка.

  1. Установить PureBasic 5.11 x86 в любую папку.
  2. Открыть папку с установленным PureBasic и в папке «Compilers» переименовать файлы Fasm.exe и Polink.exe в Fasm_.exe и Polink_.exe.
  3. Открыть папку «PureLibrariesWindowsLibraries» и удалить все файлы.
  4. Извлечь архив в папку с установленным PureBasic 5.11 x86.
  5. Запустить программу «IDE PB5.11 x86 Patch.exe», которая изменит расширение сохраняемых исполняемых файлов с .exe на .sys.

Подчеркну что нужна версия PureBasic именно 5.11 x86. С другими версиями этот пакет может быть не совместим.

Отдельно нужно сказать про память ядра. Она существует двух типов — подкачиваемая и неподкачиваемая.
Цитата с wasm.ru

Цитата:

Системные кучи (к пользовательским кучам не имеют никакого отношения) представлены двумя так называемыми пулами памяти, которые, естественно, располагаются в системном адресном пространстве:
Пул неподкачиваемой памяти (Nonpaged Pool). Назван так потому, что его страницы никогда не сбрасываются в файл подкачки, а значит, никогда и не подкачиваются назад. Т. е. этот пул всегда присутствует в физической памяти и доступен при любом IRQL. Одна из причин его существования в том, что обращение к такой памяти не может вызвать ошибку страницы (Page Fault). Такие ошибки приводят к краху системы, если происходят при IRQL >= DISPATCH_LEVEL.
Пул подкачиваемой памяти (Paged Pool). Назван так потому, что его страницы могут быть сброшены в файл подкачки, а значит должны быть подкачаны назад при последующем к ним обращении. Эту память можно использовать только при IRQL строго меньше DISPATCH_LEVEL.
Оба пула находятся в системном адресном пространстве, а значит, доступны из контекста любого процесса. Для выделения памяти в системных пулах существует набор функций ExAllocatePoolXxx, а для возвращения выделенной памяти всего одна — ExFreePool.

По умолчанию используется только неподкачиваемая память что необходимо для инициализации рантайма, которая хоть и происходит на уровне PASSIVE_LEVEL, но ведь в дальнейшем может произойти обращение к рантайму при более высоком IRQL и если он окажется равен или выше DISPATCH_LEVEL и «очень повезет» что требуемая область памяти окажется в файле подкачки — получим BSoD «на ровном месте». Но использовать для всего только неподкачиваемую память, тоже нерационально. Для возможности выбора типа памяти (подкачиваемая или нет), был добавлен макрос.

PureBasic
1
SetPoolMode(Mode)

Возможные значения.

PureBasic
1
2
3
4
5
Enumeration
  #Pool_NonPaged ; Использовать только неподкачиваемую память. Это по умолчанию.
  #Pool_Paged    ; Использовать только подкачиваемую память.
  #Pool_Auto     ; Автоматический выбор типа памяти в зависимости от IRQL.
EndEnumeration

Узнать текущий тип памяти можно с помощью макроса.Смена типа памяти действует только на последующие выделения памяти, а тип уже выделенной памяти не меняется. И кроме того, это действует только на функции PureBasic. На вызов функции ядра ExAllocatePool() и ей подобных, не распространяется. Так же нужно следить за освобождением памяти. Даже если драйвер был выгружен из памяти, это не освободит ресурсы и память будет занята до перезагрузки системы. Если память неподкачиваемая, это равносильно уменьшению размера физической памяти!
В конце процедуры DriverUnload() нужно добавить строку, которая освободит память используемую рантаймом PureBasic.Теперь рассмотрим простой пример драйвера, который только информирует о своей загрузке и выгрузке.

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
Declare DriverEntry(*DriverObject, *RegistryPath)
*Point=@DriverEntry()
!jmp [p_Point]
 
IncludePath #PB_Compiler_Home+"DDK"
XIncludeFile "ntddk.pbi"
XIncludeFile "ntstatus.pbi"
XIncludeFile "ntfunct.pbi"
 
 
Procedure DriverUnload(*DriverObject.DRIVER_OBJECT)
  
  DbgPrint("Unload Driver")
  
  !CALL _PB_EOP ; Освобождение ресурсов.
EndProcedure
 
Procedure DriverEntry(*DriverObject.DRIVER_OBJECT, *RegistryPath.UNICODE_STRING)
  
  DbgPrint("Load Driver")
  
  *DriverObjectDriverUnload = @DriverUnload()
  ProcedureReturn #STATUS_SUCCESS
EndProcedure

Рассмотрим код подробнее. Оператор Declare объявляет процедуру с именем DriverEntry(). Это необходимо потому что компилятор однопроходный, а процедура расположена ниже по коду относительно обращения к ней. Затем в переменную *Point помещается указатель на процедуру DriverEntry() и происходит переход по адресу в переменной *Point, т. е. в процедуру DriverEntry(). Возможно возникнет вопрос, почему не указать в качестве точки входа процедуру DriverEntry() и избавится от подобного прыжка по адресу? Сделать такое конечно можно, но при этом рантайм останется не инициализированным.
Оператор IncludeFile определяет путь к подключаемым файлам, а оператор XIncludeFile подключает их, причем делает это только один раз, т. е. если в исходнике окажется несколько подключений одного и того же файла, то будет подключен только один экземпляр, а остальные проигнорированы.
При выполнении кода процедуры DriverEntry() выводится отладочное сообщение «Load Driver», записывается в структуру *DriverObject адрес процедуры выгрузки драйвера и возвращается значение успешного выполнения.
Когда драйвер выгружается, будет выполнена процедура адрес которой сохранен в поле DriverUnload структуры *DriverObject. В данном коде это процедура DriverUnload(). В ней отсылается отладочное сообщение «Unload Driver», а затем, вызывается подпрограмма «_PB_EOP». Это необходимо чтобы рантайм «убрал за собой», т. е. освободил все те ресурсы что были использованы им при инициализации.
В этой же процедуре нужно освободить все ресурсы, используемые драйвером (например, память, различные хендлы и т. д.). Потому что даже если драйвер был выгружен, это не освободит ресурсы и они будут заняты до перезагрузки системы. В случае памяти, если она неподкачиваемая, это равносильно уменьшению размера физической памяти!
Все глобальные объекты (строки, массивы, связанные списки) так же нужно уничтожать при выгрузке драйвера. Наиболее просто это сделать если их поместить в общую структуру. Тогда все сведется к одной строке — очистке структуры функцией ClearStructure().

Компиляция драйвера не сложнее создания обычного приложения. В меню «Компилятор», нужно кликнуть по пункту «Создать драйвер» и получим скомпилированный драйвер в указанной папке.

Нажмите на изображение для увеличения
Название: Compile.PNG
Просмотров: 650
Размер:	23.0 Кб
ID:	2934

После компиляции в результате которой, получили sys-файл, его можно проверить в действии, но сначала взглянем на импорт. Как видим, от WinAPI не осталось и следа.

Нажмите на изображение для увеличения
Название: PE_Explorer_Import_1.PNG
Просмотров: 540
Размер:	3.8 Кб
ID:	2937 Нажмите на изображение для увеличения
Название: PE_Explorer_Import_2.PNG
Просмотров: 510
Размер:	4.5 Кб
ID:	2938

Драйвером импортируется функция KeGetCurrentIrql() из hal.dll, используемая для определения текущего IRQL при автоматическом выборе типа памяти (подкачиваемая или нет). Из ntoskrnl.exe импортируются функции DbgPrint(), memset(), ExAllocatePool() и ExFreePool(). Первую можно видеть в коде драйвера и она используется для вывода отладочных сообщений. Вторая функция предназначена для заполнения памяти заданными данными. В нашем случае, она используется для обнуления (очистки) памяти. Третья и четвертая функция, выделяют и освобождают память. Этих функций достаточно для инициализации рантайма, причем действительно нужны только две ExAllocatePool() и ExFreePool(), а остальные можно или исключить при определенных условиях (функция KeGetCurrentIrql()) или заменить на небольшой участок кода (функция memset()). Довольно неплохо если учитывать что рантайм PureBasic изначально рассчитан на WinAPI, а не на функции ядра.
Размер файла драйвера получился равным 2 КБ. Возможно покажется что это много для такого простого драйвера, но в этот объем входит статически прилинкованный рантайм и пара функций-переходников эмулирующих WinAPI и вызывающих функции ядра. Если отказаться это всего этого и вырезать рантайм, то размер драйвера получится около 570 байт. Но нужно ли это? Отсутствие рантайма не позволит использовать многие возможности языка.

Теперь давайте запустим драйвер и посмотрим как он работает. Лучше это делать на виртуальной машине. Для этого понадобятся утилиты KmdManager и Dbgview. Первая запускает драйвер, а вторая отображает то, что было отправлено функцией DbgPrint(). После установки на PureBasic предлагаемого архива, эти утилиты будут доступны через меню «Инструменты». Их следует запускать с правами администратора. Для Windows 7 нужно выполнить эту рекомендацию.

Цитата:

Сообщение от Убежденный

Посмотреть сообщение

Далее по поводу DbgPrint(Ex). Как известно, на Windows Vista и выше весь
отладочный вывод фильтруется, поэтому чтобы увидеть свои отладочные сообщения,
нужно включить соответствующий флаг в реестре на гостевой машине.
Ключ HKLMSYSTEMCurrentControlSetControlSession ManagerDebug Print Filter.
Я использую параметр DEFAULT (тип REG_DWORD) со значением 0xf (15), это включает полный отладочный вывод. Хотя возможны и другие варианты.

Также нужно убедится что в меню «Capture» программы Dbgview есть галочка в пункте «Capture Kernel». Если ее там нет, ставим и перезапускаем программу.
В программе KmdManager указываем путь к драйверу и последовательно нажимаем на кнопки «Register», «Run», «Stop» и «Unregister». Если все сделано правильно, увидим примерно такую картину.

Нажмите на изображение для увеличения
Название: TestDriver.PNG
Просмотров: 663
Размер:	19.9 Кб
ID:	2939

Это довольно простой драйвер, но его код можно еще сильнее упростить до такого.

PureBasic
1
2
3
4
5
ImportC "ntoskrnl.lib" ; Импорт cdecl-функций.
  DbgPrint(String.s)
EndImport
 
DbgPrint("Load Driver")

Код максимально прост. Импортируется функция DbgPrint() из «ntoskrnl.lib», а затем она вызывается отправляя отладочное сообщение «Load Driver».

Нажмите на изображение для увеличения
Название: TestDriver_2.PNG
Просмотров: 485
Размер:	19.4 Кб
ID:	2940

Возможно те «кто в теме» подумают что этот код нормально работать не будет и вызовет BSoD и они будут по своему правы. Дело вот в чем. При выходе из функции DriverEntry() производится освобождение 8 байт из стека (2 локальных переменных — параметра процедуры, по 4 байта каждый), а затем возврат по текущему адресу в стеке. В этом коде ничего подобного нет. Как же он тогда работает? На самом деле все это есть. Препроцессор, находящийся между pbcompiler и fasm добавляет такой ассемблерный код.

Assembler
1
2
3
 CALL _PB_EOP
 MOV eax,-1073741438
 RET 8

Чтобы было понятней, привожу весь ассемблерный код драйвера, передаваемый FASMу.

Assembler
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
format MS COFF
extrn _DbgPrint
extrn _ExitProcess@4
extrn _GetModuleHandleA@4
extrn _HeapCreate@12
extrn _HeapDestroy@4
extrn _memset
extrn PB_StringBase
extrn _SYS_InitString@0
extrn _SYS_FreeStrings@0
extrn _PB_StringBasePosition
public _PB_Instance
public _PB_ExecutableType
public _PB_OpenGLSubsystem
public _PB_MemoryBase
public PB_Instance
public PB_MemoryBase
public _PB_EndFunctions
 
macro pb_public symbol
{
 public  _#symbol
 public symbol
_#symbol:
symbol:
}
 
macro    pb_align value { rb (value-1) - ($-_PB_DataSection + value-1) mod value }
macro pb_bssalign value { rb (value-1) - ($-_PB_BSSSection  + value-1) mod value }
 
public PureBasicStart
section '.code' code readable executable           
PureBasicStart:
 PUSH dword I_BSSEnd-I_BSSStart
 PUSH dword 0
 PUSH dword I_BSSStart
 CALL _memset
 ADD esp,12
 PUSH dword 0
 CALL _GetModuleHandleA@4
 MOV [_PB_Instance],eax
 PUSH dword 0
 PUSH dword 4096
 PUSH dword 0
 CALL _HeapCreate@12
 MOV [PB_MemoryBase],eax
 CALL _SYS_InitString@0
; 
 PUSH dword _S1
 CALL _DbgPrint
 ADD esp,4
 CALL _PB_EOP
 MOV eax,-1073741438
 RET 8
_PB_EOP_NoValue:
; PUSH dword 0
_PB_EOP:
 CALL _PB_EndFunctions
 CALL _SYS_FreeStrings@0
 PUSH dword [PB_MemoryBase]
 CALL _HeapDestroy@4
 RET
; CALL _ExitProcess@4
_PB_EndFunctions:
 RET
section '.data' data readable writeable
_PB_DataSection:
_PB_OpenGLSubsystem: db 0
pb_public PB_DEBUGGER_LineNumber
 dd -1
pb_public PB_DEBUGGER_IncludedFiles
 dd 0
pb_public PB_DEBUGGER_FileName
 db 0
pb_public PB_Compiler_Unicode
 dd 0
pb_public PB_Compiler_Thread
 dd 0
pb_public PB_Compiler_Purifier
 dd 0
_PB_ExecutableType: dd 0
public _SYS_StaticStringStart
_SYS_StaticStringStart:
_S1: db "Load Driver",0
pb_public PB_NullString
 db 0
public _SYS_StaticStringEnd
_SYS_StaticStringEnd:
align 4
align 4
s_s:
 dd 0
 dd -1
align 4
section '.bss' readable writeable
_PB_BSSSection:
align 4
I_BSSStart:
_PB_MemoryBase:
PB_MemoryBase: rd 1
_PB_Instance:
PB_Instance: rd 1
align 4
PB_DataPointer rd 1
align 4
align 4
align 4
align 4
I_BSSEnd:
section '.data' data readable writeable
SYS_EndDataSection:

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

PureBasic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
Declare DriverEntry(*DriverObject, *RegistryPath)
*Point=@DriverEntry()
!jmp [p_Point]
 
IncludePath #PB_Compiler_Home+"DDK"
XIncludeFile "ntddk.pbi"
XIncludeFile "ntstatus.pbi"
XIncludeFile "ntfunct.pbi"
 
Procedure DriverUnload(*DriverObject.DRIVER_OBJECT)
  !CALL _PB_EOP ; Освобождение ресурсов.
EndProcedure
 
Procedure DriverEntry(*DriverObject.DRIVER_OBJECT, *RegistryPath.UNICODE_STRING)
  
  SetPoolMode(#Pool_Auto)    ; Автоматический выбор типа памяти в зависимости от IRQL.
  
  NewList x()
  For i=1 To 10
    If AddElement(x())
      x()=i*10
    EndIf
  Next i
  
  DbgPrint("Size list "+ListSize(x())+" items")
  ForEach x()
    DbgPrint(Str(x()))
  Next
  
  *DriverObjectDriverUnload = @DriverUnload()
  ProcedureReturn #STATUS_SUCCESS
EndProcedure

В процедуре DriverEntry() в первую очередь включатся автоматический выбор типа памяти (по умолчанию используется только неподкачиваемая память). Затем создается связный список с именем x, после чего в цикле в него добавляется 10 элементов. Далее формируется строка сообщающая о количестве элементов в списке и в цикле ForEach выводится текущее содержимое элементов списка.

В этом примере связный список является локальным и он автоматически уничтожается при завершении работы процедуры в которой он создан. Если бы он был бы глобальным, то необходимо было самим его очищать, т. е. вызывать функцию FreeList() когда список становился не нужным. Но в любом случае, чтобы избежать утечки памяти, это потребовалось бы сделать в процедуре DriverUnload() вызываемой при выгрузке драйвера.

Если запустить драйвер, увидим такую картину.

Нажмите на изображение для увеличения
Название: LinkedList.PNG
Просмотров: 512
Размер:	20.7 Кб
ID:	2942

В папке Examples архива, есть много примеров различных драйверов, как простых, только показывающих работу функций PureBasic, переведенных с WinAPI на функции ядра, так и примеров по сложнее, среди которых можно найти коды драйверов, предоставляющих доступ к портам компьютера, защищающих процесс от завершения, скрывающих указанные процессы в диспетчере задач, а так же драйвер обрабатывающий прерывания от LPT порта.

  1. Главная
  2. Песочница
  3. Архив
  4. Полезности от Joker-2013



[Цитировать]

  • 1039
  • Стаж: 7 лет 8 месяцев
  • Сообщений: 2053
  • Репутация:118[+] [-]
  • Откуда: из прошлого


Иногда требуется собрать какое то количество программ в оболочку, для удобного запуска.
Программ AutoPlay, имеется множество, но если по каким то критериям, они не устраивают, можно написать свою.
В данной теме, покажу (напишу и выложу исходник) как создать оболочку в PureBasic (если у пользователей появится интерес к данной теме)
Как то давно, пытался понять, принципы написания программ на PureBasic
Но язык не в какую не поддавался осмыслению.
Хотелось написать лаунчер, нарисовал окно в редакторе форм и… завис…
Долго думал, как навесить события на нажатие клавиш, как подправить дизайн созданного окна,
так как в редакторе форм, нет возможности изменять все свойства элементов…
Но так и не справился…
Теперь чуть накопил знаний, могу научить и вас.
В чем же преимущество данного Лаунчера:
Малый размер файла
Можно создать как х86 так и х64
Можно добавить любой функционал, ограниченный лишь вашими знаниями языка.
Познакомитесь с PureBasic и возможно возьмете его на вооружение.
Минусы:
Сам язык платный, но не дорогой… (в интернете можно найти, полные, свежие версии)
Рисовать интерфейс лучше вручную, указывая позицию и размер элементов
Ну или в редакторе форм, набросать интерфейс, а потом перенести код, в основной…
Набросал тестовый проект, прошу протестировать правильное отображение кнопок (сверить с картинкой)

(в PureBasic изначально нет функции показа картинки с текстом на кнопке, поэтому сделана отдельная процедура на API)

Последний раз редактировалось: Joker-2013 (2019-03-03 16:32), всего редактировалось 2 раз(а)


[Цитировать]

Отправлено: 02-Мар-2019 21:53
(спустя 10 месяцев 11 дней)

    Joker-2013

  • 1039
  • Стаж: 7 лет 8 месяцев
  • Сообщений: 2053
  • Репутация:118[+] [-]
  • Откуда: из прошлого


AZJIO, смена иконки у запущенногозапускаемого файла:

SendMessage_(WindowID(0),#WM_SETICON,0,ExtractIcon_(0,»Shell32.dll»,23))

If PathFileExists_(GetExePath()+»icon.ico»)
    LoadImage(0, GetExePath()+»icon.ico»)
    If IsImage(0)
      SendMessage_ (WindowID(0, #WM_SETICON, 0, ImageID(0))
    EndIf
  EndIf

Извлечение иконок из файла:

OpenWindow(0,0,0,320,240,»Window»,#PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
ListIconGadget(1,10,10,300,220,»Icon #»,280)
  count.l = ExtractIconEx_(«C:WINDOWSexplorer.exe»,-1,0,0,0)
  For i = 0 To count — 1
   hIcon.l = 0
   ExtractIconEx_(«C:WINDOWSexplorer.exe»,i,0,@hIcon,1)
   AddGadgetItem(1,-1,»Icon #» + Str(i),hIcon)
  Next
Repeat : Until WaitWindowEvent()=#PB_Event_CloseWindow

Последний раз редактировалось: Joker-2013 (2019-03-02 22:10), всего редактировалось 1 раз


[Цитировать]

Отправлено: 02-Мар-2019 22:00
(спустя 6 минут)

    Joker-2013

  • 1039
  • Стаж: 7 лет 8 месяцев
  • Сообщений: 2053
  • Репутация:118[+] [-]
  • Откуда: из прошлого


В вообще, по поводу Лаунчера с ini…
Если есть время, то можно сделать приложение, без ручной конфигурации файла ini
Видел код, когда объекты можно двигать по окну.
В итоге, делаем небольшой конструктор, в котором можно создавать объекты, например кнопки,
размещать их в окне приложения, растягивать окно итд итп…
Или как делфи7 отдельное окно с объектами и рабочее окно…
Но нужно много сил и времени.


[Цитировать]

Отправлено: 02-Мар-2019 22:12
(спустя 12 минут)

    AZJIO

  • 17953
  • Стаж: 5 лет
  • Сообщений: 1171
  • Репутация:127[+] [-]


Joker-2013

Но нужно много сил и времени.

вот это наверно определяющее, и ещё желание. Я уже делал прогу для создания гуи где можно перемещать элементы и делать доводку до пикселей стрелками, но это в лаунчере лишнее. Я наоборот делал чтобы кнопки сами размещались автоматически. Вариант на AutoIt3 протестирован, можно указать область размещения кнопок, указать число колонок, отступы между кнопками и они сами подстроятся под размеры.
Но я пробовал лаунчеры с пропиской координат кнопок, не знаю насколько это удобно, каждому своё, но там проблема допустим втиснуть кнопку, надо все переписывать.
LauncherPB — добавил Выход, сворачивание и область в ini


[Цитировать]

Отправлено: 02-Мар-2019 22:36
(спустя 23 минуты)

    Joker-2013

  • 1039
  • Стаж: 7 лет 8 месяцев
  • Сообщений: 2053
  • Репутация:118[+] [-]
  • Откуда: из прошлого


AZJIO, Вот ещё волшебная команда для управления только клавиатурой (Tab Enter)

;Навешиваем на окно:
AddKeyboardShortcut(0, #PB_Shortcut_Return, #Menu_Enter)
;А в действиях: (#Menu_Enter)
PostEvent(#PB_Event_Gadget, GetActiveWindow(), GetGadgetEnter, #PB_EventType_LeftClick)

По Enter выполняется действие как по ЛКМ и не надо дописывать дополнительные события…
Могу рабочий вариант накропать, если надо…


[Цитировать]

Отправлено: 04-Мар-2019 16:47
(спустя 1 день 18 часов)

    AZJIO

  • 17953
  • Стаж: 5 лет
  • Сообщений: 1171
  • Репутация:127[+] [-]


Добавил поддержку иконок. Но в варианте AutoIt3 была функция _WinAPI_PathFindOnPath, то есть найти dll для иконок, я сделал проще, так как скорее всего для иконок и картинок лучше использовать соседнюю папку, то если относительный путь не содержит «», то ищем в System32. Также остался баг с вычислением колонок, при нечётном, когда не помещаются идеально квадратом, то есть в одной колонке 3 кнопки в другой 2, то не как ожидалось. Скорее всего это связано с тем что в PureBasic интегрер всегда округляется то целого, в AutoIt3 вычисляется в с плавающей точкой, при этом в PureBasic это решается добавлением десятичного к числу, например d*1.0, тогде вычисления будут в типе с плавающей точкой, а округлятся итоговый, но пока не разгадал где нестыковка, надо осмысливать, а я просто конвертировал код.


[Цитировать]

Отправлено: 05-Мар-2019 19:01
(спустя 1 день 2 часа)

    MBTY

  • 1499
  • Стаж: 7 лет 5 месяцев
  • Сообщений: 77
  • Репутация:6[+] [-]


Насчет запускатора с INI — написан давно.
Называется «Menu 4.2.2.56» функционал гибкий, осваивается быстро, работает уже у меня лет 15.
Автораны для пиратских игровых CD только на нем и писались. Всё время в сети распространяется с примером и хелпами от автора.
P.S. Блин, я такой старый, что вижу снова и снова на форумах одно и то же. Прогеры пишут то, шо давно написано, потом про их труды забывают и новые прогеры пишут то же самое по новой…


[Цитировать]

Отправлено: 05-Мар-2019 19:17
(спустя 16 минут)

    dialmak

  • 2607
  • Стаж: 7 лет 1 месяц
  • Сообщений: 842
  • Репутация:40[+] [-]


да есть уже ланчер давно универсальный, скрин, называется TBLauncher, есть x86 и x64
можно запускать что угодно, настраивается в INI
единственная загвоздка — не работает на XP, только на 7 и выше, ну и repe соответствующем
может и на виста, не проверял..
как пример используется в TBPortable


[Цитировать]

Отправлено: 19-Апр-2019 13:58
(спустя 1 месяц 13 дней)

    AZJIO

  • 17953
  • Стаж: 5 лет
  • Сообщений: 1171
  • Репутация:127[+] [-]


khiluck, ButtonBar попробуй. Там вообще кидаешь файл/ярлык и он добавляется, можно перетаскивать кнопки.



[Цитировать]

Отправлено: 10-Июл-2019 19:59
(спустя 2 месяца 21 день)

    AZJIO

  • 17953
  • Стаж: 5 лет
  • Сообщений: 1171
  • Репутация:127[+] [-]


Интересный вариант — (zip-архив)


[Цитировать]

Отправлено: 19-Янв-2020 16:31
(спустя 6 месяцев 8 дней)

    AZJIO

  • 17953
  • Стаж: 5 лет
  • Сообщений: 1171
  • Репутация:127[+] [-]


xnik

А как ссылку назначить на кнопку?

в ini

[6]
name=Ссылка
exe=https://usbtor.ru/viewtopic.php?t=1467

или имеется ввиду это (?):

Result = HyperLinkGadget(#Gadget , x , y , Width , Height , Text$ , Color [, Flags])


[Цитировать]

Отправлено: 20-Янв-2020 21:29
(спустя 1 день 4 часа)

    AZJIO

  • 17953
  • Стаж: 5 лет
  • Сообщений: 1171
  • Репутация:127[+] [-]


xnik

вот

EnableExplicit
Define EventID
CreateImage(1, 50, 50, 24, RGB(100, 200, 255))
If OpenWindow(0, 0, 0, 500, 400, «Пример», #PB_Window_SystemMenu | #PB_Window_ScreenCentered)
  ButtonImageGadget(1, 50, 50, 60, 60, ImageID(1), #BS_OWNERDRAW)
  Repeat
    EventID = WaitWindowEvent()
    If EventID = #PB_Event_Gadget
      Select EventGadget()
        Case 1
          Debug «Клик»
      EndSelect
    EndIf
    If EventID = #PB_Event_CloseWindow
      End
    EndIf
  ForEver
EndIf

Так же кучка готовых примеров здесь, также русская справка здесь, на вкладке «Указатель» вводишь «Гаджет» и выбираешь что читать.

И в этом лаунчере нет ini, а есть исходники

ранее там не было исходников, поэтому я не понял.


[Цитировать]

Отправлено: 23-Дек-2021 00:23
(спустя 1 год 11 месяцев)

    AZJIO

  • 17953
  • Стаж: 5 лет
  • Сообщений: 1171
  • Репутация:127[+] [-]


mat.86, продолжение тут, а то я там дописываю обновы, а ветка не поднимается в топ. Вроде всё сделал.

Текущее время: 06-Мар 11:51

Часовой пояс: UTC + 3

Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете голосовать в опросах
Вы не можете прикреплять файлы к сообщениям
Вы можете скачивать файлы

Новые возможности языка программирования БЕЙСИК
© 2000 Fantaisie Software

Введение
Условия применения
Системные требования
Установка продукта
Как приобрести полную версию
Связь с авторами
Благодарность помощникам

История развития проекта

Перевод руководства на русский языка выполнил MacBuster^tPA


Введение

PureBasic — это новый язык программирования «высокого уровня»,
основанный на уже давно устоявшихся и ставшими стандартными правилах языка
«БЕЙСИК». PureBasic совместим с другими компиляторами БЕЙСИКА,
существующими на Амиге или на любых других платформах. Он очень прост в
освоении как для новичков, делающих свои первые шаги в программировании,
так и для тех, кто давным-давно стал экспертом в этом деле. Особенную
привлекательность ему придает тот факт, что время компиляции ваших
программ сведено к минимуму!

В процессе создания PureBasic мы старались прежде всего ориентироваться
на особенности Амиги и использовать все ее уникальные возможности. Как
можно более полное взаимодействие с операционной системой для получения
наиболее эффективного результата — именно это было предметом особого
внимания. Нам пришлось проделать огромную работу для того, чтобы в
конечном итоге вы получили надежный, быстрый, но вместе с тем простой и
удобный язык программирования, пригодный для решения широкого круга задач.
Вы просто не сможете написать плохие программы, воспользовавшись основным
набором команд! Конечно же, вам ничто не помешает добавить ваши
собственные функции, если вы будете ощущать острую необходимость в
максимальном использовании всех возможностей Амиги.

Нам удалось добиться сочетания очень простого синтаксиса с огромными
возможностями, что особенно заметно при использовании дополнительных
функций, которые были введены нами, таких как: указатели, структуры,
связные списки, динамически изменяемые связнные списки и прочее. А для
опытных программистов введена возможность непосредственного взаимодействия
со всеми стандартными структурами и объектами, использующимися в
операционной системе Амиги.

На данный момент PureBasic поддерживает только процессоры серии 680×0, но
очень скоро появится поддержка процессоров PowerPC. Несмотря на то, что в
компиляторе уже есть генератор кода для PowerPC, он ещё не полностью
реализован. Но мы надеемся на то, что после надлежащей отладки и добавления
функций мы сможем предложить вам такой компилятор, который будет полностью
использовать все возможности этого процессора. Сейчас компилятор может
генерировать почти идеально оптимизированный код для 68000, но мы уверены в
том, что и здесь есть возможность ещё что-нибудь улучшить. И мы обещаем вам
попытаться добиться лучшего!

    Основные возможности PureBasic:

  • Поддержка 68000 и 68020+ (скоро появится и PowerPC).
  • Внутренняя поддержка массивов, динамически-изменяемых связных
    списков, сложных структур, указателей и определения переменных.
  • Встроенная поддержка следующих типов данных: Байт (8 бит), Слово (16
    бит), Длинное слово (32 бита), а также определяемых пользователем
    типов (структур).
  • Стандартные типы данных могут быть знаковыми и беззнаковыми.
  • Встроенная поддержка строковых типов.
  • Поддержка констант, двоичной и шестнадцатеричной систем счисления.
  • Оптимизатор вычислений на основе группировки констант и однотипных
    числовых данных.
  • Все вычисления производятся с учетом приоритета, поддерживаются
    следующие действия: +, -, /, *, and, or, lsl, asl, lsr, asr.
  • Компилируется до 30,000 строк в минуту при наличии 68030/50 (если
    используется PoolMem).
  • Поддержка процедур в стиле структурного программирования, также
    локальных и глобальных переменных (находится в стадии доработки).
  • Все стандартные операторы языка БЕЙСИК: If-Else-EndIf, Repeat-Until,
    и прочие.
  • Взаимодействие с многопользовательскими библиотеками функций для
    упрощения работы с такими объектами как: IFF изображения, экраны,
    окна, гаджеты, и другие.
  • Работа со стандартными библиотеками функций операционной системы так
    же проста, как и работа со стандарными операторами языка.
  • Встроенный ассемблер.
  • В целях сокращения необходимого для компиляции времени используются
    предварительно скомпилированные файлы структур и констант.
  • Отладчик для прерывания исполнения программы и пошаговой отладки
    частей программы, вызывающих сомнения в правильности реализации.
  • Компилятор может принимать входные параметры через командную строку.
  • Стабилен, прост в установке и освоении, постоянно развивается.

Условия применения:

Программный продукт PureBasic (далее — программный продукт) поставляется
в соответствии с общепринятым в международной компьютерной практике
принципом «КАК ЕСТЬ«. Это означает, что за проблемы, возникшие в процессе
эксплуатации программного продукта (в том числе: частичная или полная
потеря данных; частичное или полное повреждение данных; упущение выгоды;
проблемы совместимости с программными продуктами третьих фирм, а также за
проблемы, способные возникнуть из-за неоднозначного толкования данной
документации пользователем), компания Fantasie Software и лица,
осуществлявшие перевод руководства пользователя, а также локализацию
программного продукта, ответственности не несут. Приступив к использованию
программного продукта, пользователь полностью осознает тот факт, что он
использует данный программный продукт на свой собственный страх и риск, а
также подтверждает то, что он предварительно ознакомился с условиями о
пользовании программным продуктом и безоговорочно принял их.

Демонстрационная версия этого программного продукта может быть свободно
распространена при соблюдении условия сохранения неизменности содержимого
оригинального архивного файла. Удалять, добавлять, изменять файлы, а также
производить прочие изменения содержимого оригинального архивного файла
можно только с предварительного письменного разрешения Fantasie Software.

На распространение демонстрационной версии программного продукта с
применением любых средств хранения данных, распространяемых совместно c
компьютерными журналами, требуется предварительное письменное разрешение
Fantasie Software.

Fantasie software сохраняет за собой все права на изменение программного
продукта и распространяемого архива.


Системные требования

  • AmigaOS версии 3.0 и выше
  • 1 Мб свободной памяти

PureBasic будет работать на любой Амиге, если ее параметры совпадают с
указанными требованиями. По всем вопросам, связанным с работоспособностью
данного программного продукта, связывайтесь с нами.


Инсталяция продукта

Для установки PureBasic на ваш жесткий диск лучше всего воспользоваться
прилагаемым скриптом «Install». В том случае, если по каким-либо причинам
вы не смогли или не пожелали воспользоваться скриптом «Install», вы можете
самостоятельно скопировать подкаталог «PureBasic», находящийся в каталоге
«PureBasic_1.60_Demo», в тот каталог, куда вы хотите произвести установку
компилятора. После этого следует добавить в файл «S:User-startup»
следующую строку:

Assign PureBasic: «Work:PureBasic»

изменив путь «Work:PureBasic» на путь к тому каталогу, в который вы
установили PureBasic (если он отличается от указанного в примере). После
этого следует перезагрузить Амигу. Только произведя все эти действия, вы
сможете корректно запустить PureBasic.


Как заказать полную версию PureBasic

На данный момент PureBasic представляет собой условно бесплатный
программный продукт, регистрация которого производится за небольшую плату.
Но в самом ближайшем будущем ситуация изменится и PureBasic перейдет в
разряд коммерческого программного обеспечения. Причем произойдет это уже
при выпуске версии 2.0, в первой четверти нового тысячелетия. Конечно же,
скорость развития проекта зависит от количества зарегистрировавшихся
пользователей. Если появится пиратская версия этого продукта и вы рискнете
ей воспользоваться, то, пожалуйста, имейте ввиду, что лично вы и станете
причиной замедления, а может быть, и полного прекращения работ по его
развитию. Пожалуйста, не используте пиратские версии програмных продуктов.

Зарегистрировавшиеся пользователи получат все последующие обновленные и
исправленные версии PureBasic совершенно бесплатно!

    Демонстрационная версия PureBasic имеет следующие ограничения:

  • только 4 библиотеки дополнительных функций (misc, linked list, window,
    screen) могут быть задействованы в ваших программах;
  • вы не можете задействовать многопользовательские библиотеки AmigaOS;
  • нет средств разработки библиотек дополнительных функций;
  • максимальное количество строк в вашей программе: 200;
    Стоимость регистрации:

    США : 70 долларов
    Англия : 40 фунтов
    Германия : 120 марок
    Франция : 400 франков

Оплата может быть произведена почтовым чеком, Евро-чеком или наличными,
вложенными в конверт (прячьте как можно лучше!), которые следует выслать
на следующий адрес:


Frederic Laboureur
10, rue de Lausanne
67640 Fegersheim
France

Полноценная версия PureBasic высылается в день получения регистрационного
взноса. Не забудьте указать, каким именно образом вы желаете получить
вашу копию — по электронной или по обычной почте!


Регистрационный бланк

Заполненный латинскими буквами регистрационный бланк следует послать по
следующему адресу:
Frederic Laboureur
10, rue de Lausanne
67640 Fegersheim
France

—-8<——8<——8<——8<—Линия отрыва—8<——8<——8<——8<—

Я желаю приобрести полную версию PureBasic.

В качестве регистрационного взноса высылаю (отметьте нужный пункт):

( ) FF400.00 ( ) DM120.00 ( ) 40.00UKP ( ) US$70.00

Имя: _________________________________________________________

Адрес: _________________________________________________________

_________________________________________________________

_________________________________________________________

Страна: _________________________________________________________

Телефон: _________________________________________________________

EMail: _________________________________________________________

Вся указанная здесь информация конфиденциальна и будет сохранена
в полной тайне.
Компания Fantasie Software не будет распространять
ее ни при каких обстоятельствах.

Я высылаю свой регистрационный взнос в качестве (отметьте нужное):-


    ( ) Наличных, в указанной выше валюте.
    ( ) Евро-чека. Самый дешевый и безопасный метод для европейцев.
    ( ) Другое? Необходимо ПРЕДВАРИТЕЛЬНО согласовать с авторами по
    E-Mail.



Регистрационный взнос может быть принят только в одной из указанных
выше валюте.
Никакая другая валюта не может быть использована.

Пожалуйста, вышлите мне полную версию (отметьте желаемый способ):-

    ( ) По EMail (UU — MIME присоединенным файлом)
    ( ) Международной почтой (на дискете)


Я прочитал все требования и условия и безоговорочно с ними согласен.

__________________ ________________________________________
Дата Подпись

Пожелания и предложения, касающиеся PureBasic (на английском языке):

___________________________________________________________________
___________________________________________________________________


Связь с авторами

Посылайте свои замечания, предложения, советы по улучшению, информацию о
найденных ошибках и недочетах по следующим адресам:

  • Frederic «AlphaSND» Laboureur

    Фред «AlphaSND» — это основатель компании «Fantasie Software» и тот
    самый человек, который написал основную часть проекта PureBasic. Все
    советы, предложения, замечания и информация о найденных недочетах и
    ошибках должны быть посланы ему по одному из приведенных ниже адресов:

    s-mail: Frederic Laboureur
    10, rue de Lausanne
    67640 Fegersheim
    France

    e-mail: alphasnd#free.fr

  • Richard Andersson

    Ричард — весьма талантливый программист, который очень помог Фреду при
    создании стабильных и мощных ассемблерных библиотек функций,
    использующихся в PureBasic. Если вам потребовалась новая библиотека
    каких-нибудь функций, то не стоит медлить — cвяжитесь с ним:

    e-mail: rzs735w#tninet.se


    Благодарность помощникам


    Я хочу от всего сердца поблагодарить всех тех людей, которые помогали
    мне в работе над PureBasic. Вполне вероятно, что если бы не было их помощи
    и поддержки, то проект не был бы завершен!

  • Frank WILLE:

    За то, что позволил мне использовать его превосходные ассемблеры: «pasm»
    и «PhxAss!». За все подсказки и ценные предложения по их использованию. А
    также за помощь в отладке генератора кода для PowerPC.

  • Steffen HAEUSER:

    За то, что он потратил свое весьма ценное время на объяснение аспектов
    программирования PowerPC, и другие, не менее ценные, советы.

  • Thomas RICHTER:

    За создание превосходной утилиты «PoolMem». Это небольшая резидентная
    программа, применение которой позволяет сократить время компиляции в 2-3
    раза! Также спасибо за разрешение включить ее в распространяемый архивный
    файл PureBasic.

  • Roger BEAUSOLEIL:

    Первый человек, который полностью поверил в осуществимость этого проекта
    и стал помогать в его реализации. Он оказал неоценимую помощь в разработке
    дизайна PureBasic.

  • LES

    За исправление ошибок на английском варианте сайта Fantasie Software и
    за исправление руководства. Теперь все это выглядит значительно лучше!

  • Andre BEER:

    За полный перевод руководства на немецкий язык. Большое спасибо!

  • Francis G.LOCH:

    Помог исправить все ошибки в английском варианте руководства. Спасибо!

  • Зарегистрировавшиеся пользователи:

    За поддержку Амиги и компаний, производящих для нее программные продукты.

  • BlitzBasic mailing list

    Присылайте ваши впечатления от работы и предложения непосредственно
    компании Fantasie Software по адресам, указанным в описании регистрации.


    История развития проекта

      V1.60 (09.09.2000):

    • Теперь можно использовать «tab» вместо пробела
    • Исправлено несколько незначительных ошибок в компиляторе
    • Добавлено четыре новых библиотеки функций:
      — Audio (для вывода звука)
      — Protracker (для проигрывания модулей ProTracker’а)
      — Network (основана на TCP/IP протоколе, предоставляет очень быстрый
      доступ к сети для программ, использующих Интернет и для сетевых игр)
      — Memory Bank (для работы с памятью)
    • Добавлены три новые функции в библиотеку Misc: MouseButtons(),
      GetCliArg() и NumberOfCliArgs()
    • Обновлена функция: OptionGadget()
    • Исправлена функция: FileRequester(), AddElement()
    • Исправлена библиотека «Menu» (не работала с выпуска версии 1.50)

      V1.50 (11.07.2000):

      В компиляторе:

    • Исправлено множество незначительных ошибок
    • Добавлен оптимизатор кода для 68020+
    • Применены новые методы оптимизации для уменьшения/ускорения программ
    • Работает чуть быстрее и редактор больше не виснет
    • Поддержка локализации. Теперь сообщения об ошибках будут на вашем
      языке!

      В библиотеках:
    • Совершенно новая библиотека: «PopupMenu» создающая всплывающие меню
    • Изменения в существующих функциях (читайте документацию):
      ChunkyToPlanar(), StartTimer(), StopTimer(), InitToolType()
      ButtonGadget(), StringGadget(), CycleGadget(), ListViewGadget()
      PaletteGadget(), OptionGadget()
    • Библиотека «Menu» была полностью переписана
    • Исправлены функции:
      AddSprite(), ReadLong(), LoadPicture(), UseGadgetList(), Left()
      GetToolTypeString(), WindowMouseX(), WindowMouseY()

      В редакторе:
    • Новая Система Вывода Структур, помогающая вам разобраться в структурах
    • Редактор теперь можно открывать на своем собственном экране
    • Можно сменить шрифт
    • Добавлена пункт «Run»
    • Исправлено много ошибок
    • Обновлена документация

      V1.40 (14.03.2000):

      В компиляторе:

    • Теперь можно использовать команды ассемблера с операторами БЕЙСИКА
    • Добавлена поддержка «Объединений» в «Структурах»
    • Обновлен и исправлен резидентный файл (Small_AmigaOS)
    • Устранено несколько ошибок

      В библиотеках функций:
    • Добавлено четыре совершенно новые библиотеки функций:
      — AmigaSprite
      — Joypad
      — Sprite
      — Timer
    • Добавлено пять новых функции:
      — Requester: EasyRequester()
      — BitMap : ShowBackBitMap()
      — Screen : CreateDualPlayfield(), RemoveDualPlayField()
      — Palette : LoadPalette()
    • Прочие изменения:
      — ShowBitmap() теперь быстрее и больше не выполняет VWait().
      — «Stop» переименован в «CallDebugger»
      — Битмэпы теперь открываются в «Interleaved» режиме. Все функции были
      переписаны для ускорения.
    • Некоторые ошибки были замечены и удалены из библиотеки «Sound».

      В редакторе:
    • Добавлены функции «вырезать/скопировать/вставить».
    • Автоматический отступ.
    • Теперь спрашивает о необходимости перезаписи уже существующего файла
      с таким же названием.
    • Вся документация была обновлена, теперь на трех языках!
    • Исправлены некоторые ошибки работы с памятью.

      V1.30 (24.01.2000):

      В компиляторе:

    • Теперь ваши программы будут занимать меньший объем!
    • Операнды сравнения обращаемыми (<= или =< и >= или =>).
    • Нераспознаные операторы выделяются.
    • Заработали программы, компилируемые для PowerPC (Смотрите примеры в
      каталоге PPC_Example).
    • Убрано множество бесполезных библиотек для PowerPC.
    • Теперь можно использовать ASCII символы для определения констант:
      «value = ‘A'» тоже самое что и «value = 65».
    • Завершена система поддержки процедур. Они могу принимать строки как
      входные параметры и возвращать их в качестве выходных результатов.
    • Можно опускать «=» в выражениях: «a+1» это совершенно тоже самое что
      «a=a+1». Может быть использовано при любых вычислениях с любыми
      типами данных.
    • Завершена работа по внедрению поддержки операционной системы.
    • Компилятор почти полностью переписан, благодаря чему теперь процесс
      компиляции значительно ускорился.
    • Ускорена процедура обработки оператора «include».
    • Сокращено количество памяти, требующееся для работы, «PoolMem» более не
      нужен.
    • Исправлено множество ранее замеченных ошибок.

      В библиотеках:
    • Добавлена новая библиотека для работы с чанками и очень быстрая
      процедура «chunky2planar».
    • Оптимизация в библиотеке поддержки связных списков.
    • Новые команды: FindString(), ChangeCurrentElement().
    • Исправления в следующих командах: Mid(), StripLead(), InitScreen(),
      InitTagList(), BusyPointer() и ActivateGadget().
    • Переименованы команда: DPrint() -> PrintText().
    • Обновлено руководство.

      В редакторе:
    • Добавлены Boopsi-слайдеры.
    • Добавлен пункт «NoCli Output».
    • Теперь можно сохранять настройки каждого файла.
    • Исправлено несколько ошибок.

      V1.20 (30.11.1999):

    • Появился встроенный редактор!
    • Вы можете использовать любые библиотеки AmigaOS непосредственно из
      ваших программ на PureBasic! Никаких ограничений нет. Можно добавить
      нужные библиотеки с помощью прилагающегося преобразователя.
    • Добавлено три новые библиотеки: Amiga, Sound и Sort.
    • Добавлено много новых функций:
      — LinkedList: ClearList(), PreviousElement(), InsertElement()
      — File : MakeDirectory(), RenameFile(), DeleteFile(), WriteStringN()
      — Window : ChangeIDCMP(), BevelBox()
      — String : Mid(), Val(), FindString(),StripTrail(), StripHead()
      — Misc : PrintNumberN(), Peek(), Poke()
    • Внимание! Следующие функции были переименованы:
      NPrint() -> PrintN()
      PrintNum() -> PrintNumber()
      WriteString -> Более не выдает терминатор в конце строки.
      Используйте WriteStringN(), если он нужен.
    • Изменение: для получения адреса метки теперь следует использовать
      символ ‘?’, вместо ранее использовавшегося символа ‘@’.
    • Отладчик обновлен и исправлен. Теперь он намного лучше.
    • Дополнено руководство о создании собственных библиотек функций. Стало
      еще проще :)
    • Некоторые функции подверглись изменениям с целью их оптимизации.
    • Исправлено множество ранее замеченных ошибок.

      V1.10 (27.10.1999):

    • Добавлены три новые библиотеки: Commodity, ToolsType и String.
    • Теперь файл загружается значительно быстрее.
    • Поддержка немецкого и французского языков.
    • Исправлено множество ранее замеченных ошибок (как всегда).
    • Улучшена поддержка PowerPC, но она еще далека от завершения.
    • Добавлен плагин для редактора GoldED, которые теперь выделяет цветом
      операторы PureBasic. Автор — Julian Kinraid.
    • Собственный редактор написан на 50 процентов.
    • Исправлена структура архивного файла, добавлен скрипт-инсталлятор.
    • И другое.

      V1.02 (12.09.1999):

    • Забыл добавить два файла для компилятора PowerPC. Теперь все должно
      работать :)
    • Исправлены замеченные ошибки.
    • Добавлено руководство «Reference.guide» исправленное LES’ом. Большое
      спасибо ему за помощь.

      V1.01 (05.09.1999):

    • Создан первый вариант компилятора PowerPC для WarpOS. Однако он все
      еще находится в стадии разработки.
    • Добавлено основное руководство (вот этот файл), ошибки исправил LES.
      Большое ему за это спасибо!

      V1.00 (01.09.1999):

    • Самая первая версия.

    Сайт создан в системе uCoz

  • Понравилась статья? Поделить с друзьями:
  • Aleksandrovich на английском как пишется
  • 8200 как написать прописью
  • 800 сантиметрам как пишется
  • 650 на английском как пишется
  • 6400 прописью как пишется