FreeBasic
Главная
Вход
Регистрация
Четверг, 05.12.2024, 20:33Приветствую Вас Гость | RSS
[ Новые сообщения · Участники · Правила форума · Поиск · RSS ]
  • Страница 1 из 1
  • 1
Пользовательские библиотеки
RoloverДата: Воскресенье, 14.07.2013, 13:34 | Сообщение # 1
Лейтенант
Группа: Пользователи
Сообщений: 45
Репутация: 0
Статус: Offline

Здравствуйте и у меня очередной вопрос
Читаю Ваш учебник, где описывается создание библиотек,  динамических и статических... Просто замечательно ))))!!!!
Но, возникли некоторые вопросы

И так
Компиляция динамической библиотекиl
команда
fbc -s console -dll  -export d.bas

Получилось 2 файла

d.dll и libd.dll.a

Вопрос
: какой из этих файлов  лишний??

Компиляция статической библиотеки
Команда fbc - lib d.bas

Получаем файл как Вы и предупреждали
libd.a

Функция библиотеки или файл d.bas который мы компилируем как библиотеку он содержит всего одну функцию (это было описание для тех кто не знает) smile
Код
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
Репутация: 50
Статус: 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
Репутация: 0
Статус: Offline
Цитата (haav)
В модуле библиотеки указывается Alias "Dfgh". А при вызове это упущено. Может в этом дело?
Да Вы правы  именно это бы послужило ошибкой, но добавив в декларацию Alias ничего не изменилось

и в голове промелькнуло
Цитата
Статическая библиотека представляет собой хранилище функции(ий), которые необходимы вашему проекту только на стадии компилирования

Компилирование ))))!!!!!!!! конечно !!!!!
Нужно скомпилировать файл....  и Все заработало )))!!!

А отсутствие Alias в  декларации..вызвало ошибку именно на стадии компилирования в командной строке "undefined reference"


Объяснив другому, поймешь, что понял сам.
 
vizitДата: Среда, 20.02.2019, 13:48 | Сообщение # 4
Рядовой
Группа: Пользователи
Сообщений: 11
Репутация: 0
Статус: 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
Репутация: 50
Статус: Offline
Цитата
а строковая Proba2 возвращает пустую строку (перевод строки).


Может стоит попробовать из функции Proba2 возвращать тип zstring ptr ?


Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
 
vizitДата: Среда, 20.02.2019, 22:25 | Сообщение # 6
Рядовой
Группа: Пользователи
Сообщений: 11
Репутация: 0
Статус: 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
Репутация: 50
Статус: 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
Репутация: -1
Статус: Offline
Цитата haav ()
Как там в VBA , я без понятия.


Там вроде используется тип BSTR. Нам это The trick поведал когда мы пытались разгрести COM.
И вроде что-то писал, функции создания, чтения и записи этого BSTR, но чё-то найти не могу, блин
вообще какой-то рассеянной куропаткой уже стал. Кошмар.
 
vizitДата: Суббота, 23.02.2019, 00:12 | Сообщение # 9
Рядовой
Группа: Пользователи
Сообщений: 11
Репутация: 0
Статус: 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
Репутация: 50
Статус: 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
Репутация: 0
Статус: 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
 
  • Страница 1 из 1
  • 1
Поиск: