FreeBasic
Вы хотите отреагировать на этот пост ? Создайте аккаунт всего в несколько кликов или войдите на форум.

Проблемы с dll

+3
Gena
dushy
Алекс
Участников: 7

Перейти вниз

Проблемы с dll Empty Проблемы с dll

Сообщение  Алекс Пн Июл 28, 2008 1:21 pm

ФриБейсик 0.18 при попытке запустить некоторые примеры с подключёнными либами выдает сообщение типа "Приложение не смогло загрузится так как файл ___.DLL ненайден." Досадно, не работают самые вкусные - fmod, png, gif, wn-c etc. GL, напротив, запускается нормально да только не нужна пока. Ни с музыкой, ни со шрифтами и рисунками формата png, gif работать немогу. Иногда вискакивает другой месседж "Failed CreateProcess Error 2"...
Что бы это могло быть? Я только примеры пробовал запускать, в коде ничего не менял.

Алекс

Сообщения : 3
Дата регистрации : 2008-07-28

Вернуться к началу Перейти вниз

Проблемы с dll Empty Re: Проблемы с dll

Сообщение  dushy Вт Июл 29, 2008 8:14 am

Необходимо найти эти самые DLL и поместить в папку с откомпилированной программой. Например, ...examples\libraries\GL\glu_quadrics.bas прекрасно откомпилируется, но при запуске потребует библиотеку SDL.dll, идем на сайт "simple directmedia layer": "www.libsdl.org" и качаем эту библиотеку! Если, например, программе, потребуется файл "SDL_image.dll" то идем на "libsdl.org/projects/" и ищем там. Библиотеки fmod, zlib, jpeg находим на сайтах ИХ производителей, или в Google...
В случае с LINUXом схема такая-же.
ps. эти DLLки можно скинуть в windows/system32/ тогда не надо их помещать в папку с программой, все программы автоматически будут находить их, но, не советую "мусорить" в системной папке.
ps/ps некоторые DLLки искать не надо, они в комплекте с системой, OpenGL32.dll например...

dushy

Сообщения : 2
Дата регистрации : 2008-07-29

Вернуться к началу Перейти вниз

Проблемы с dll Empty Re: Проблемы с dll

Сообщение  Алекс Вт Июл 29, 2008 8:42 am

Пробовал и в папку ложить с ехе и в Винды.
Давайте расставим точки над Ы - в папке lib лежат эти ДЛЛки. Все с расширением lib***.dll.а, если нужен файл libfmod.dll.a тогда у меня проблемы видать(поскольку он есть), если нужна fmod.dll тогда я топаю на сайт разработчика. Точнее прямо отсюда туда и отправлюсь. Может действительно чего-то неположили .

Алекс

Сообщения : 3
Дата регистрации : 2008-07-28

Вернуться к началу Перейти вниз

Проблемы с dll Empty Re: Проблемы с dll

Сообщение  dushy Вт Июл 29, 2008 9:50 am

Файлы с разрешением .а или .о - это статические библиотеки, в данном случае, они нужны для того чтобы Ваша программа могла экспортировать функции из динамических - .dll иначе Вам пришлось бы делать все ручками, поищите литературу про динамические библиотеки, подход в freebasuc в данном случае совподает с решением этой проблемы в СИ.
К теме, Вам надо найти сами DLLки без расширения .а или .о (в других языках это может быть .lib в delphi, например .dcu).
К слову, в каталоге examples\libraries\GL\fbgl\ есть пример создания статической библиотеки, правда я не смотрел, что она делает, в каталоге \examples\dll\ - пример работы с динамическими. Там не сложно, посмотрите комментарии.
На сайте "freebasic.net/index.php/link" есть необходимые ссылки.

dushy

Сообщения : 2
Дата регистрации : 2008-07-29

Вернуться к началу Перейти вниз

Проблемы с dll Empty Re: Проблемы с dll

Сообщение  Алекс Ср Июл 30, 2008 8:08 am

А.Л.Л.И.Л.У.Й.Я. Заработало! Спасибо.

Алекс

Сообщения : 3
Дата регистрации : 2008-07-28

Вернуться к началу Перейти вниз

Проблемы с dll Empty Re: Проблемы с dll

Сообщение  Gena Ср Ноя 05, 2008 9:06 pm

Как подключаются Длл к файлу и как узнать содержимое длл(доступные ф-ии)? Где есть мануалы?(желательно на русском)

Gena

Сообщения : 182
Дата регистрации : 2008-11-05
Возраст : 30
Откуда : Москва

Вернуться к началу Перейти вниз

Проблемы с dll Empty Re: Проблемы с dll

Сообщение  tux Ср Ноя 05, 2008 9:13 pm

Можно тут
https://freebasic.forum2x2.ru/forum-f10/tema-t111.htm
а ваще у нас на форуме в разделе документация пишется книга по FB, я думаю там много чего мона узнать о FB на русском, и при желании принять участие))
ЗЫ: некоторые примеры не было возможности проверить, если вдруг будут косяки, прозьба оставить сообщение в коментариях, исправим
tux
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 36
Откуда : Сибирь

http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Проблемы с dll Empty Re: Проблемы с dll

Сообщение  DoReMi Чт Ноя 06, 2008 12:49 pm

Просмотр экспортируемых функций в dll:
http://www.nirsoft.net/utils/dll_export_viewer.html (русские ресурсы там же)
однако, перечень и типы передаваемых и возвращаемых значений придётся вычислять гаданием на кофейной гуще, или искать мануал/исходники библиотеки.
DoReMi
DoReMi

Сообщения : 67
Дата регистрации : 2008-08-28
Возраст : 51
Откуда : Волгодонск

http://doreonline.blogspot.com

Вернуться к началу Перейти вниз

Проблемы с dll Empty как подключить dll

Сообщение  12val12 Ср Сен 23, 2009 9:37 am

помогите пожалуйста.
мне нужно подключить библиотеку IO.DLL в freebasic для 16 разрядного доступа к порту
(In out - 8 разрядные)
но не знаю как
вот так она подключается к VB6

Private Declare Sub PortOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Byte)
Private Declare Sub PortWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Integer)
Private Declare Sub PortDWordOut Lib "IO.DLL" (ByVal Port As Integer, ByVal Data As Long)
Private Declare Function PortIn Lib "IO.DLL" (ByVal Port As Integer) As Byte
Private Declare Function PortWordIn Lib "IO.DLL" (ByVal Port As Integer) As Integer
Private Declare Function PortDWordIn Lib "IO.DLL" (ByVal Port As Integer) As Long
Private Declare Sub SetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
Private Declare Sub ClrPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
Private Declare Sub NotPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte)
Private Declare Function GetPortBit Lib "IO.DLL" (ByVal Port As Integer, ByVal Bit As Byte) As Boolean
Private Declare Function RightPortShift Lib "IO.DLL" (ByVal Port As Integer, ByVal Val As Boolean) As Boolean
Private Declare Function LeftPortShift Lib "IO.DLL" (ByVal Port As Integer, ByVal Val As Boolean) As Boolean
Private Declare Function IsDriverInstalled Lib "IO.DLL" () As Boolean

прошу показать пример.

12val12

Сообщения : 14
Дата регистрации : 2009-09-23

Вернуться к началу Перейти вниз

Проблемы с dll Empty Re: Проблемы с dll

Сообщение  tux Ср Сен 23, 2009 12:30 pm

будет тоже самое, тока надо убрать слово private и желательно добавить alias, выглядеть будет к примеру так
Код:
Declare Sub PortOut Lib "IO.DLL" alias "PortOut" (ByVal Port As Integer, ByVal Data As Byte)
tux
tux

Сообщения : 365
Дата регистрации : 2008-04-06
Возраст : 36
Откуда : Сибирь

http://tux.nsk.ru/

Вернуться к началу Перейти вниз

Проблемы с dll Empty Re: Проблемы с dll

Сообщение  12val12 Ср Сен 23, 2009 12:59 pm

Command executed:
"C:\FreeBASIC\fbc.exe" -arch 686 "C:\FreeBASIC\FBIDETEMP.bas"

Compiler output:
C:\FreeBASIC\bin\win32\ld.exe: cannot find -lIO.DLL

Results:
Compilation failed

io.dll я ложил во многие папки но нигде его компиллятор не видит

и ещё вопрос как включить ring0 (в frreebasic) -я чувствую это будет проще
http://www.geekhideout.com/iodll.shtml
тут примеры..но как эту dll подключить к FreeBASIC ?

12val12

Сообщения : 14
Дата регистрации : 2009-09-23

Вернуться к началу Перейти вниз

Проблемы с dll Empty Re: Проблемы с dll

Сообщение  DiG. GeRR Ср Сен 23, 2009 6:15 pm

и ещё вопрос как включить ring0
Оспадя! Воистину не знаете, чего просите! Вы умеете работать в нулевом кольце? Тогда не "включайте" ring-0, а пишите kernel mode драйвер. Примеры вроде бы есть в стандартных экзамплах.

Кроме того, чтоб просто указывать библиотеку (кстати, в параметре lib не нужно конкретно писать, что это dll - достаточно бы Lib "io" - это некросплаттформенно), нужна опять же статическая библиотека (для статической связки в таблицу импорта). То есть, хотя компилер и пишет, что нужна io.dll, на самом деле нужна io.dll.a - а ее можно получить, поколдовав c gcc-ским implib или dlltool (которые, если мне не изменяет память, тоже включены в стандартный "пакет поставки" фрибацика.

А можно еще на лету импортировать функции из библиотеки с помощью DyLibLoad, DyLibSymbol, DyLibFree. Ни с чем линковать для этого не нужно, просто обеспечить библиотеку в папке с прогой.

DiG. GeRR

Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 32
Откуда : Рудный, Казахстан

Вернуться к началу Перейти вниз

Проблемы с dll Empty Re: Проблемы с dll

Сообщение  12val12 Ср Сен 23, 2009 6:42 pm

для того чтобы получить io.dll.a одного io.dll мало нужно еще какой то "DEF file"
мне всего лишь нужно брать 16 разрядное слово с порта &hcd04 1000раз и забить в массив далее рисовать осциллограмму
те в ring0 мне нужно 3 строчки и всё

12val12

Сообщения : 14
Дата регистрации : 2009-09-23

Вернуться к началу Перейти вниз

Проблемы с dll Empty Re: Проблемы с dll

Сообщение  12val12 Ср Сен 23, 2009 6:52 pm

"А можно еще на лету импортировать функции из библиотеки с помощью DyLibLoad, DyLibSymbol, DyLibFree. Ни с чем линковать для этого не нужно, просто обеспечить библиотеку в папке с прогой."
как это сделать?
вот тут лежат описание функций но на си и VB http://www.geekhideout.com/iodll.shtml

12val12

Сообщения : 14
Дата регистрации : 2009-09-23

Вернуться к началу Перейти вниз

Проблемы с dll Empty Re: Проблемы с dll

Сообщение  12val12 Ср Сен 23, 2009 7:03 pm

а почему это не работает (но и не даёт ошибку)
#inclib "winio"
dim as integer a,b ,c ,d ,k ,x,y
Declare Function InitializeWinIo Alias "InitializeWinIo"() As Integer
Declare Function ShutdownWinIo Alias "ShutdownWinIo"() As Integer

Declare Function MapPhysToLin Alias "MapPhysToLin"( _
Byval pbPhysAddr As Ubyte Ptr, _
Byval dwPhysSize As Uinteger, _
Byval pPhysicalMemoryHandle As Any Ptr ptr) As Ubyte Ptr

Declare Function UnmapPhysicalMemory Alias "UnmapPhysicalMemory"( _
Byval PhysicalMemoryHandle As Any Ptr, _
Byval pbLinAddr As Ubyte Ptr) As Integer

Declare Function GetPhysLong Alias "GetPhysLong"( _
Byval pbPhysAddr As Ubyte Ptr, _
Byval pdwPhysVal As Uinteger Ptr) As Integer

Declare Function SetPhysLong Alias "SetPhysLong"( _
Byval pbPhysAddr As Ubyte Ptr, _
Byval dwPhysVal As Uinteger) As Integer

Declare Function GetPortVal Alias "GetPortVal"( _
Byval wPortAddr As Ushort, _
Byval pdwPortVal As Uinteger Ptr, _
Byval bSize As Byte) As Integer

Declare Function SetPortVal Alias "SetPortVal"( _
Byval wPortAddr As Ushort, _
Byval dwPortVal As Uinteger, _
Byval bSize As Byte) As Integer

'' These wrappers for GetPortVal and SetPortVal provide a more
'' convenient call interface. The function return values are
'' discarded because, barring a misplaced call to ShutdownWinIo,
'' they duplicate the return value for InitializeWinIo (See the
'' Ports32.cpp source).
''
'' Byte and word versions only.

Function inpb( Byval wPortAddr As Ushort ) As Uinteger

Dim As Uinteger portVal

GetPortVal( wPortAddr, @portVal, 1 )

Return portVal

End Function

Function inpw( Byval wPortAddr As Ushort ) As Uinteger

Dim As Uinteger portVal

GetPortVal( wPortAddr, @portVal, 2 )

Return portVal

End Function

Sub outb( Byval wPortAddr As Ushort, Byval portVal As Uinteger )

SetPortVal( wPortAddr, portVal, 1 )

End Sub

Sub outw( Byval wPortAddr As Ushort, Byval portVal As Uinteger )

SetPortVal( wPortAddr, portVal, 2 )

End Sub

print InitializeWinIo()

b=inpb (&hcd00)
print b
sleep

12val12

Сообщения : 14
Дата регистрации : 2009-09-23

Вернуться к началу Перейти вниз

Проблемы с dll Empty Re: Проблемы с dll

Сообщение  DiG. GeRR Ср Сен 23, 2009 8:16 pm

http://www.freebasic.net/wiki/wikka.php?wakka=KeyPgDylibload
http://www.freebasic.net/wiki/wikka.php?wakka=KeyPgDylibsymbol
http://www.freebasic.net/wiki/wikka.php?wakka=KeyPgDylibfree

Код не работает, видимо, из-за неправильного использования именно библиотеки...

Ну а вообще... Конечно, нужна просто библиотека импорта (io.dll.a). Проблема в том, как ее получить. Копать нужно в сторону именно тулз dlltool, implib и прочих, потому что такое делается с их помощью. Точно сказать не могу, потому что никогда этого не делал (вот у борланда все было проще - берешь длл-ку и с помощью implib делаешь библиотеку импорта... а у gcc просто разобраться нужно, кто и что делает.) Хотя по логиче вещей можно просто указывать в объвлении функции библиотеку и все, как ты уже делал. Все, перестаю рассуждать о том, чего, честно говоря, не знаю.

DiG. GeRR

Сообщения : 101
Дата регистрации : 2009-01-30
Возраст : 32
Откуда : Рудный, Казахстан

Вернуться к началу Перейти вниз

Проблемы с dll Empty Re: Проблемы с dll

Сообщение  12val12 Ср Сен 23, 2009 9:26 pm

еще прийдется потревожить
вот работающий код но очень стрёмно (ring 0) Вопрос как сделать это правильно с тем же эфефктом (запрещать прерывания не обязательно -это я так на всяк случай)
(можно на VB,C или паскале -меня инетерсует только осциллограмма -нбеольшие поправки думаю смогу сделать
Код:

#Include "windows.bi"
screen 19
Dim Shared NtSystemDebugControl As Function(As Integer, As Any Ptr, As Dword, As Any Ptr, As Dword, As Dword Ptr) As Long

Type CALL_GATE Field = 1
        addrlo As Word
        Seg As Word
        arg:5 As Byte
        u:3 As Byte
        typ:5 As Byte
        dpl:2 As Byte
        pres:1 As Byte
        addrhi As Word
End Type
Type gdtrStruct Field = 1
        limit As Word
        Base As Dword
End Type

Type VIRTUAL1 Field = 1
        A As Any Ptr
        B As Any Ptr
        C As Dword
End Type
OUT &HCC02,128
'in nmos pci lpt ECR=CC00!!!!
' IF "ECP+EPP" OR "Extended" -> ECR 0x80
' (ECR -  ECP-, ECR=BASE_ADDR+0x402, BASE_ADDR - ).
OUT &HCd02, 32 ' 5 BIT TO LPT BASE+2)
#Define Virtual(_a_, _b_, _c_, _d_) Scope: Var v = Type<VIRTUAL1>((_a_), (_b_), (_c_)): NtSystemDebugControl((_d_), @v, SizeOf(v), 0, 0, 0): End Scope

Function asmlpt(ByVal num As Integer) As Integer
    Asm
        mov dx, &hcd04
        in Eax,dx
        mov [Function], Eax
    End Asm
End Function
 
' This sub will be executed in kernel mode!
Sub Ring0(cs As Dword, text As Zstring Ptr)
    dim as integer k,x,z,wfinp
    asm cli
 dim as uByte h (2000)
 'for z=1  to 1000  '
 for k=0  to 799 step 4
      wfinp=asmlpt(1)  ' 4 SAMPLES FOUR  FOR ONE CYCLE of INPUT-CONCLUSION of CPU
      h(k)=  lobyte(LOWORD (wfinp)) '
      h(k+1)=hibyte(LOWORD (wfinp))'
      h(k+2)=lobyte(HIWORD (wfinp))'
      h(k+3)=hibyte(HIWORD (wfinp))'
     
  next k
  'next z  '
    for k=1  to 799
      pset (k,500-h(k)) 'plot from adc
  next k
        *text = !"Hello World from Ring 0 \n"
        ' Store value of control register 0 in eax (which is normally not allowed) in order to prove we are in Ring 0!
        Asm mov eax, cr0
        ' Return to Ring 3
        Asm
           
            leave
          .byte 0xCA ' retf 4
          .word 4
          sti
        End Asm
       
       
       
        sleep
End Sub

Function Main() As Integer
        NtSystemDebugControl = GetProcAddress(LoadLibrary("ntdll"), "NtSystemDebugControl")
       
        Dim As TOKEN_PRIVILEGES pv, po
        pv.PrivilegeCount = 1
        pv.Privileges(0).Attributes = SE_PRIVILEGE_ENABLED
        Dim As HANDLE t
        Dim As Dword no
       
        ' This will enable NtSystemDebugControl usage
        LookupPrivilegeValue(0, SE_DEBUG_NAME, @pv.Privileges(0).Luid)
        OpenProcessToken(GetCurrentProcess(), TOKEN_ALL_ACCESS, @t)
        AdjustTokenPrivileges(t, 0, @pv, SizeOf(po), @po, @no)
       
        ' This ensures that on multi cpu/core systems we patch the right GDT for right cpu
        SetThreadAffinityMask(GetCurrentThread(), 1)
        SleepEx(100, FALSE)
       
        ' We read GDT table
        Dim As LDT_ENTRY gdt(1000)
        Dim As gdtrStruct gdtr
        Asm sgdt [gdtr]
       
        ' Find free spot
        Virtual(gdtr.base, @gdt(0), gdtr.limit, 8)
        Dim As Integer gate
        For i As Integer = 1 To 99
                If gdt(i).HighWord.Bits.Pres = 0 Then
                        gate = i
                        Exit For
                Endif
        Next
       
        ' Construct Call Gate pointing to Ring0 proc and write it there
        Var addr = CUInt(@Ring0)
        Dim As CALL_GATE g = Type(addr And &hFFFF, 8, 1, 0, 12, 3, 1, addr Shr 16)
        Virtual(gdtr.base + gate * 8, @g, 8, 9)
       
        ' Quite ugly way to do far call
        Dim As Word farcall(3) = {0, 0, gate Shl 3}
        Dim As Zstring Ptr param = CAllocate(100)
        Dim As Long result
       
        ' Switch from Ring 3 to Ring 0 is just normal call ;)
        Asm
                push [param]
                Call fword Ptr [farcall]
                mov [result], eax
        End Asm
       
        ' Cleanup Call Gate from GDT
        Dim As Longint c = 0
        Virtual(gdtr.base + gate * 8, @c, 8, 9)
       
        Print !"\n" & *param & !"\nCR0 = " & Hex(result, 8)
        Sleep
       
        DeAllocate(param)
       
        Return 0
End Function

End(Main())

12val12

Сообщения : 14
Дата регистрации : 2009-09-23

Вернуться к началу Перейти вниз

Вернуться к началу

- Похожие темы

 
Права доступа к этому форуму:
Вы не можете отвечать на сообщения