Пользовательские библиотеки
|
|
Rolover | Дата: Воскресенье, 14.07.2013, 13:34 | Сообщение # 1 |
Лейтенант
Группа: Пользователи
Сообщений: 45
Статус: Offline
| Здравствуйте и у меня очередной вопрос Читаю Ваш учебник, где описывается создание библиотек, динамических и статических... Просто замечательно ))))!!!! Но, возникли некоторые вопросы
И так Компиляция динамической библиотекиl команда fbc -s console -dll -export d.bas
Получилось 2 файла
d.dll и libd.dll.a
Вопрос: какой из этих файлов лишний??
Компиляция статической библиотеки Команда fbc - lib d.bas
Получаем файл как Вы и предупреждали libd.a
Функция библиотеки или файл d.bas который мы компилируем как библиотеку он содержит всего одну функцию (это было описание для тех кто не знает) Код Function Dfgh Alias "Dfgh" () As Integer Export Return 25 End Function Библиотека как динамическая работает через подключение
Код 'определяем идентификатор библиотеки в памяти Dim MemDll as Any Pointer
'определяем указатель на функцию Dim func As Function() as Integer
'Загружаем библиотеку в память и получаем идентификатор MemDll = DyLibLoad("d.dll")
'если не загрузилась останавливаем If MemDLL = 0 Then 'тут можно что-нибудь вывести End End If
'получаем указатель на функцию в памяти 'указываем Идентификатор библиотеки в памяти и имя функции в библиотеке func = DylibSymbol (MemDll, "Dfgh")
'если не получили останавливаем If func = 0 Then 'тут можно что-нибудь вывести End End IF
'и дальше запускаем функцию как указатель 'и через него же передаём параметры если требуется ? func()
'выгружаем библиотеку указывая идентификатор Dylibfree MemDll
' замираем на 2,5 секунды Sleep (2500) а вот как статическая не хочет
я не могу запустить вот этот кусок кода Код #inclib "d" Declare Function Dfgh() as Integer Print Dfgh() sleep (2500)
выдаёт такую ошибку cannot find -ld работаю в BFIde
Объяснив другому, поймешь, что понял сам.
Сообщение отредактировал Rolover - Воскресенье, 14.07.2013, 13:36 |
|
| |
haav | Дата: Воскресенье, 14.07.2013, 14:31 | Сообщение # 2 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Цитата (Rolover) Получилось 2 файла
d.dll и libd.dll.a
d.dll - это и есть сама библиотека. libd.dll.a - типа связующего звена. В нее записывается служебная информация о библиотеке d.dll Для вас лично на текущем компе данная либа уже не нужна. Возможно она понадобится для более удобного подключения dll на другом языке программирования. Больше об этом сказать ничего не могу. Может кто другой просветит более подробно.
Цитата я не могу запустить вот этот кусок кода
В модуле библиотеки указывается Alias "Dfgh". А при вызове это упущено. Может в этом дело?
Да, если в одной папке вместе находятся libd.dll.a и libd.a, то приоритет компоновки имеет первая.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
Rolover | Дата: Воскресенье, 14.07.2013, 16:02 | Сообщение # 3 |
Лейтенант
Группа: Пользователи
Сообщений: 45
Статус: Offline
| Цитата (haav) В модуле библиотеки указывается Alias "Dfgh". А при вызове это упущено. Может в этом дело? Да Вы правы именно это бы послужило ошибкой, но добавив в декларацию Alias ничего не изменилось
и в голове промелькнуло Цитата Статическая библиотека представляет собой хранилище функции(ий), которые необходимы вашему проекту только на стадии компилирования Компилирование ))))!!!!!!!! конечно !!!!! Нужно скомпилировать файл.... и Все заработало )))!!!
А отсутствие Alias в декларации..вызвало ошибку именно на стадии компилирования в командной строке "undefined reference"
Объяснив другому, поймешь, что понял сам.
|
|
| |
vizit | Дата: Среда, 20.02.2019, 13:48 | Сообщение # 4 |
Рядовой
Группа: Пользователи
Сообщений: 11
Статус: Offline
| Добрый день.
Как создавать функцию, которая вовращает строковое значение, или компилировать dll, или декларировать в VBA, чтобы правильно использовать в VBA?
На FB написал следующие функции для пробы:
Код Function Proba1 Alias "Proba1" (ByVal x As Integer, ByVal y As Integer) As Integer Export Proba1=x+y End function
Function Proba2 Alias "Proba2" () As String Export Proba2="Hello World" End function
скомпилировал файл Proba.dll
В редакторе VBA MS Access написал: Код Option Compare Database Option Explicit
Declare Function Proba1 Lib "d:\FreeBasic\Project\DLL\Proba.dll" Alias "Proba1@8" (ByVal x As Integer, ByVal y As Integer) As Integer Declare Function Proba2 Lib "d:\FreeBasic\Project\DLL\Proba.dll" Alias "Proba2@0" () As String
Sub Proba() Debug.Print Proba2() Debug.Print Proba1(2, 3) End Sub
Запускаю процедуру Proba, функция Proba1 возвращает значение 5, а строковая Proba2 возвращает пустую строку (перевод строки).
|
|
| |
haav | Дата: Среда, 20.02.2019, 19:22 | Сообщение # 5 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Цитата а строковая Proba2 возвращает пустую строку (перевод строки).
Может стоит попробовать из функции Proba2 возвращать тип zstring ptr ?
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
vizit | Дата: Среда, 20.02.2019, 22:25 | Сообщение # 6 |
Рядовой
Группа: Пользователи
Сообщений: 11
Статус: Offline
| Код Function Proba2 Alias "Proba2" () As String ptr Export *Proba2="Hello World" End function
warning 13(0): Function result was not explicitly set
Добавлено (20.02.2019, 23:04) --------------------------------------------- Код [size=9]Function Proba2 Alias "Proba2" () As ZString ptr Export dim sz As ZString Ptr sz=Allocate(12) *sz="Hello World" Return sz End function[/size]
Так нашёл в help-е FB, но MS Access вылетает с ошибкой. Как в этом случае в VBA правильно декларировать функцию,и что ещё кроме неё и как вызывать?
Сообщение отредактировал vizit - Среда, 20.02.2019, 23:05 |
|
| |
haav | Дата: Четверг, 21.02.2019, 05:46 | Сообщение # 7 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Цитата vizit ( ) Так нашёл в help-е FB, но MS Access вылетает с ошибкой. Как в этом случае в VBA правильно декларировать функцию,и что ещё кроме неё и как вызывать?
Как там в VBA , я без понятия. У меня не стоит MS OFFICE и проверить или тем более найти решение я не смогу. Могу лишь сказать , что тип STRING у freebasic - это тип для внутреннего использования в языке и вероятность почти нулевая , что его внутренняя структура и устройство совпадет с другими языками. Если в vba есть возможность работать с указателями , то типы ZSTRING PTR или WSTRING PTR могут помочь . То есть ищи в VBA что-то типа "разыменовывание указателя".
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
DarkDemon | Дата: Пятница, 22.02.2019, 23:07 | Сообщение # 8 |
Полковник
Группа: Друзья
Сообщений: 200
Статус: Offline
| Цитата haav ( ) Как там в VBA , я без понятия.
Там вроде используется тип BSTR. Нам это The trick поведал когда мы пытались разгрести COM. И вроде что-то писал, функции создания, чтения и записи этого BSTR, но чё-то найти не могу, блин вообще какой-то рассеянной куропаткой уже стал. Кошмар.
|
|
| |
vizit | Дата: Суббота, 23.02.2019, 00:12 | Сообщение # 9 |
Рядовой
Группа: Пользователи
Сообщений: 11
Статус: Offline
| Взял отсюда
FB Код #include once "windows.bi" #include once "win/ole2.bi"
'// Params: '// VB -> FB '// byte -> ubyte '// integer -> short '// long -> integer/long '// string -> string (but for return use BSTR)
'// Use StringToBSTR function to perform the conversion
#define crlf chr(13) + chr(10)
declare function StringToBSTR( cnv_string as string ) as BSTR
function ToString pascal alias "ToString" ( byval a as short, byval b as short ) as BSTR export dim result as short result = a + b return StringToBSTR( str( result ) ) end function
function CatStrings pascal alias "CatStrings" ( byval a as BSTR, byval b as BSTR ) as BSTR export dim as zstring ptr _a, _b _a = cast( zstring ptr, a ) _b = cast( zstring ptr, b ) return StringToBSTR( *_a + *_b ) end function
sub CatStrings2 pascal alias "Pepe2" ( byval a as BSTR, byval b as BSTR, c as BSTR ) export dim result as string
result = *cast( zstring ptr, a ) + " " + *cast( zstring ptr, b ) c = StringToBSTR( result ) end sub
function StringToBSTR( cnv_string as string ) as BSTR dim sb as BSTR sb = SysAllocStringByteLen( strptr( cnv_string ), len( cnv_string ) ) *cast( zstring ptr, sb ) = cnv_string return sb end function
VBA Код Declare Function ReturnString Lib "d:\FreeBasic\Project\DLL\Proba0.dll" (a As String, ByVal b As Long) As Boolean Declare Function CatStrings Lib "d:\FreeBasic\Project\DLL\Proba0.dll" (a As String, b As String) As String Declare Sub CatStrings2 Lib "d:\FreeBasic\Project\DLL\Proba0.dll" Alias "Pepe2" (ByVal a As String, ByVal b As String, c As String)
Sub Proba() Dim y As String y = "" Call CatStrings2("Hello", "World!", y) Debug.Print "CatStrings2, y:", y Debug.Print CatStrings("Hello ", "World") End Sub
но в итоге ерунда:
CatStrings2, y: dm,)
|
|
| |
haav | Дата: Суббота, 23.02.2019, 05:23 | Сообщение # 10 |
Генералиссимус
Группа: Администраторы
Сообщений: 1373
Статус: Offline
| Цитата но в итоге ерунда:
Похоже с кодировкой косяк. Я тут вспомнил, что у aloberoger(а) были примеры COM и там тип BSTR фигурировал. Вот часть его кода:
Код Function StrToBSTR(ByVal cnv_string As String) As BSTR Dim sb As BSTR Dim As Integer n n = (MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, cnv_string, -1, NULL, 0))-1 sb=SysAllocStringLen(sb,n) MultiByteToWideChar(CP_ACP, MB_PRECOMPOSED, cnv_string, -1, sb, n) Return sb End Function
Может покатит?
Вообще вот его темы:
https://www.freebasic.net/forum....p166772
https://www.freebasic.net/forum/viewtopic.php?f=6&t=21893
Далеко не все его примеры запустишь, из-за того, что он использовал свои собственные заголовки, но какая-то часть кода может оказаться полезной. Кстати будешь пробовать , может в каких то случаях нужно будет сохранять исходник FB в юникоде. Мне почему то кажется ,что у VBA строковой тип юникодный.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
|
| |
vizit | Дата: Суббота, 02.03.2019, 14:22 | Сообщение # 11 |
Рядовой
Группа: Пользователи
Сообщений: 11
Статус: Offline
| Решено. Передача строковой переменной из VBA в FB dll и получение строковой переменной в VBA из FB dll:
FB Код #include once "windows.bi" #include once "win/ole2.bi"
'// Params: '// VB -> FB '// byte -> ubyte '// integer -> short '// long -> integer/long '// string -> string (but for return use BSTR)
'// Use StringToBSTR function to perform the conversion
#define crlf chr(13) + chr(10)
declare function StringToBSTR( cnv_string as string ) as BSTR
Function StringToBSTR( cnv_string as string ) as BSTR dim sb as BSTR sb = SysAllocStringByteLen( strptr( cnv_string ), len( cnv_string ) ) *cast( zstring ptr, sb ) = cnv_string return sb End Function
Function Proba1 Alias "Proba1" (ByVal x As Integer, ByVal y As Integer) As Integer Export Proba1=x+y End function
Function Proba2 Alias "Proba2" (s as Zstring ptr) As BSTR Export return StringToBSTR(*s) End function
VB Код Option Compare Database Option Explicit
Declare Function Proba1 Lib "d:\FreeBasic\Project\DLL\Proba2.dll" Alias "Proba1@8" (ByVal x As Integer, ByVal y As Integer) As Integer Declare Function Proba2 Lib "d:\FreeBasic\Project\DLL\Proba2.dll" Alias "Proba2@4" (ByVal s As String) As String
Sub Proba() Debug.Print Proba2("Hello World") Debug.Print Proba1(2, 3) End Sub
После запуска в редакторе VBA процедуры Proba в Immediate Window получаем:
Hello World 5
|
|
| |
|