PureBasic

Создание DLL

PureBasic позволяет создавать стандартные Microsoft Windows DLL (динамически связываемые библиотеки, Dynamic Linked Library), разделяемые объекты (.so) в Linux, и динамические библиотеки (.dylib) в MacOS X. Код DLL похож на код PureBasic, за исключением того, что код не может находиться вне процедуры.

При написании DLL весь код размещается в процедурах. Когда пишется общедоступная процедура (например доступная из DLL для других программ), необходимо использовать команду ProcedureDLL (или ProcedureCDLL, если процедура должна быть в формате 'CDecl', который не является обычным случаем для Windows DLL), она используется вместо Procedure. А так же, вместо Declare необходимо использовать DeclareDLL или DeclareCDLL, если Declare необходима. Это единственные необходимые изменения в программе.

При компиляции выберите пункт 'Shared DLL' в качестве выходного формата ('Настройки компилятора' в редакторе PureBasic или /DLL в командной строке) и DLL с указанным именем будет создана в выбранном каталоге.

Пример

ProcedureDLL MyFunction()
    MessageRequester("Привет", "Это PureBasic DLL !", 0)
EndProcedure

; Теперь программа-клиент, которая использует созданную DLL
;
If OpenLibrary(0, "PureBasic.dll")
    CallFunction(0, "MyFunction")
    CloseLibrary(0)
EndIf

Для опытных программистов: есть 4 особые процедуры, которые автоматически вызываются самой Windows в случае одного из следующих событий:

- DLL присоединяется к новому процессу
- DLL отсоединяется от процесса
- DLL присоединяется к новому потоку
- DLL отсоединяется от потока

Чтобы обрабатывать их, можно объявить 4 особых процедуры с именами: AttachProcess (Instance), DetachProcess (Instance), AttachThread (Instance) и DetachThread (Instance). Это значит, что эти 4 имени процедур зарезервированы и не могут использоваться программистом для других целей.

Примечания о создании DLL:

- Объявление массивов, связных списков или хеш-карты командами Dim, NewList или NewMap должно всегда делаться в процедуре AttachProcess.
- Не пишите код программы вне процедур. Единственное исключение - объявление переменных или структур.
- Код инициализации DirectX не следует писать в процедуре AttachProcess.

Примечание о возвращении строк от DLL:

Если вы хотите возвратить строку из DLL, строка перед использованием должна быть объявлена как Global.

Пример

Global ReturnString$

ProcedureDLL.s MyFunction(var.s)
    ReturnString$ = var + " test"
    ProcedureReturn ReturnString$
EndProcedure

Если строка не объявлена как Global, она будет локальной в процедуре и будет удалена при выходе из процедуры, следовательно не сможет использоваться в вызвавшей эту процедуру программе.

При вызове функции DLL с помощью команды CallFunction() (или другой подобной, начинающейся с CallXXX), вы получите указатель на возвращаемую строку, которую можете прочитать с помощью функции PeekS().

Пример

String.s = PeekS(CallFunction(0, "FunctionName", Parameter1, Parameter2))


Полный пример кода смотрите здесь: DLLSample.pb