Экспорт/импорт из длл операторов???

Страница 1 из 2 1, 2  Следующий

Предыдущая тема Следующая тема Перейти вниз

Экспорт/импорт из длл операторов???

Сообщение  Саня в Ср Июл 14, 2010 8:30 pm

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

И вдогонку...компилятор при попытках скомпилировать функции выдает непонятное:
'..............................................................................................
D:\FbEdit è compiler\FreeBASIC\fbc -s gui -dll -export "lists.bas"
lists.o:fake:(.text+0x271): undefined reference to `LIST::~LIST()'
lists.o:fake:(.text+0x2d1): undefined reference to `LIST::~LIST()'
lists.o:fake:(.text+0x32e): undefined reference to `LIST::~LIST()'
lists.o:fake:(.text+0x388): undefined reference to `LIST::~LIST()'

Build error(s)
'.............................................................................................
почему? и как это исправлять?
avatar
Саня

Сообщения : 65
Дата регистрации : 2010-04-28
Возраст : 23
Откуда : Екатеринбург

Посмотреть профиль http://vkontakte.ru/id30561430#/id57547166

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

Re: Экспорт/импорт из длл операторов???

Сообщение  tux в Ср Июл 14, 2010 8:51 pm

во первых "-s gui" для динамической библиотеки ну никак не применим, во вторых, неплохо было бы сначала посмотреть на код, который вы хотите откомпилить, так мало чего можно сказать, единственное, это чет с областью видимости может намудрил...
а вообще, если надо, когдато делал чета такое уже, тока без ооп-а, оставлю здесь, мож кому еще приглянется
list.bi
Код:
#ifndef LIST_BI
#define LIST_BI

type bool as byte
#define null 0
#define false 0
#define true 1

type ttListUnit
   xData as any ptr
   xNext as ttListUnit ptr
   xPrev as ttListUnit ptr
end type

type ttList
   xFirst as ttListUnit ptr
   xLast as ttListUnit ptr
   xNow as ttListUnit ptr ' указатель на текущий элемент
   pNow as integer ' ID текущей позиции
   pSize as integer
end type

' списки
declare function    fListIsEmpty(byref tList as ttList) as bool
declare function    fListIsFirst(byref tList as ttList) as bool
declare function    fListIsLast(byref tList as ttList) as bool
declare function    fListGetSize(byref tList as ttList) as integer
declare function    fListGetId(byref tList as ttList) as integer
declare sub       fListAddId(byref tList as ttList, byval xData as any ptr, byval pId as integer)
declare sub       fListAdd(byref tList as ttList, byval xData as any ptr)
declare sub       fListAddFirst(byref tList as ttList, byval xData as any ptr)
declare sub       fListAddLast(byref tList as ttList, byval xData as any ptr)
declare sub       fListDelId(byref tList as ttList, byval pId as integer)
declare sub       fListDel(byref tList as ttList)
declare sub       fListDelFirst(byref tList as ttList)
declare sub       fListDelLast(byref tList as ttList)
declare function    fListGetData(byref tList as ttList) as any ptr
declare function    fListGetDataId(byref tList as ttList, byval pId as integer) as any ptr
declare function    fListGetDataFirst(byref tList as ttList) as any ptr
declare function    fListGetDataLast(byref tList as ttList) as any ptr
declare sub       fListMoveId(byref tList as ttList, byval pId as integer)
declare sub       fListMoveFirst(byref tList as ttList)
declare sub       fListMoveLast(byref tList as ttList)
declare sub       fListMoveNext(byref tList as ttList)
declare sub       fListMovePrev(byref tList as ttList)

#endif
list.bas
Код:
' в списке ID начинаются с 1, те последний равен размеру

#include "list.bi"

' проверка на пустой список
function fListIsEmpty(byref tList as ttList) as bool
   if tList.pSize=0 then return true else return false
end function

' если ID на первом элементе
function fListIsFirst(byref tList as ttList) as bool
   if tList.pNow=1 then return true else return false
end function

' если ID на последнем элементе
function fListIsLast(byref tList as ttList) as bool
   if tList.pNow=tList.pSize then return true else return false
end function

' получить размер списка
function fListGetSize(byref tList as ttList) as integer
   return tList.pSize
end function

' получить адрес данных по id (используется тока для работы внутри списка)
private function fListGetListId(byref tList as ttList, byval pId as integer) as ttListUnit ptr
   if tList.pNow=pId then
      return tList.xNow
   else
      dim as ttListUnit ptr xPos
      dim as integer i
      if pId<1 then pId=1
      if pId>tList.pSize then pId=tList.pSize
      ' пытался немного оптимизировать поиск
      if pId<tList.pNow then
         if pId-1>tList.pNow-pId then
            xPos=tList.xNow
            for i=1 to tList.pNow-pId
               xPos=xPos->xPrev
            next i
         else
            xPos=tList.xFirst
            for i=1 to pId-1
               xPos=xPos->xNext
            next i
         end if
      elseif pId>tList.pNow then
         if tList.pSize-pId>pId-tList.pNow then
            xPos=tList.xNow
            for i=1 to pId-tList.pNow
               xPos=xPos->xNext
            next i
         else
            xPos=tList.xLast
            for i=1 to tList.pSize-pId
               xPos=xPos->xPrev
            next i
         end if
      end if
      return xPos
   end if
end function

' добавить элемент после ID
sub fListAddId(byref tList as ttList, byval xData as any ptr, byval pId as integer)
   dim as ttListUnit ptr xTmp=allocate(sizeof(ttListUnit))
   xTmp->xData=xData
   xTmp->xNext=null
   xTmp->xPrev=null
   if fListIsEmpty(tList)=true then
      tList.xFirst=xTmp
      tList.xLast=xTmp
      tList.xNow=xTmp
      tList.pNow=1
      tList.pSize=1
   elseif pId<1 then ' в начало
      tList.xFirst->xPrev=xTmp
      xTmp->xNext=tList.xFirst
      tList.xFirst=xTmp
      tList.pSize+=1
      tList.pNow+=1
   elseif pId>=tList.pSize then ' в конец
      xTmp->xPrev=tList.xLast
      tList.xLast->xNext=xTmp
      tList.xLast=xTmp
      tList.pSize+=1
   else ' посередине
      ' перемещаемся, если нужно, не изменяя внутреннего положения
      dim as ttListUnit ptr xPos=fListGetListId(tList, pId)
      xTmp->xNext=xPos->xNext
      xTmp->xNext->xPrev=xTmp
      xPos->xNext=xTmp
      xTmp->xPrev=xPos
      tList.pSize+=1
      if pId<tList.pNow then tList.pNow+=1
   end if
end sub

' добавить элемент после текущей позицией
sub fListAdd(byref tList as ttList, byval xData as any ptr)
   fListAddId tList, xData, tList.pNow
end sub

' добавить элемент в начало списка
sub fListAddFirst(byref tList as ttList, byval xData as any ptr)
   fListAddId tList, xData, 0
end sub

' добавить элемент в конец
sub fListAddLast(byref tList as ttList, byval xData as any ptr)
   fListAddId tList, xData, tList.pSize
end sub

' удалить элемент по указанному ID
sub fListDelId(byref tList as ttList, byval pId as integer)
   if fListIsEmpty(tList)=true then return
   dim as ttListUnit ptr xTmp
   if pId<=1 then
      xTmp=tList.xFirst
      tList.xFirst=tList.xFirst->xNext
      if tList.xFirst<>null then tList.xFirst->xPrev=null
      deallocate xTmp
      if tList.pNow>1 then tList.pNow-=1 else tList.xNow=tList.xFirst
   elseif pId>=tList.pSize then
      xTmp=tList.xLast
      tList.xLast=tList.xLast->xPrev
      if tList.xLast<>null then tList.xLast->xNext=null
      deallocate xTmp
      if tList.pNow=tList.pSize then
         tList.pNow-=1
         tList.xNow=tList.xLast
      end if
   else
      dim as ttListUnit ptr xPos=fListGetListId(tList, pId)
      if pId=tList.pNow then tList.xNow=tList.xNow->xNext
      xPos->xPrev->xNext=xPos->xNext
      xPos->xNext->xPrev=xPos->xPrev
      deallocate xPos
      if pId<tList.pNow then tList.pNow-=1
   end if
   tList.pSize-=1
   if tList.pSize=0 then tList.pNow=0
end sub

' удалить текущий элемент
sub fListDel(byref tList as ttList)
   fListDelId(tList, tList.pNow)
end sub

' удалить первый жлемент
sub fListDelFirst(byref tList as ttList)
   fListDelId(tList, 1)
end sub

' удалить последний элемент
sub fListDelLast(byref tList as ttList)
   fListDelId(tList, tList.pSize)
end sub

' получить данные из текущей позиции
function fListGetData(byref tList as ttList) as any ptr
   return tList.xNow->xData
end function

' получить данные по ID
function fListGetDataId(byref tList as ttList, byval pId as integer) as any ptr
   return fListGetListId(tList, pId)->xData
end function

' получить данные из первой позиции
function fListGetDataFirst(byref tList as ttList) as any ptr
   return tList.xFirst->xData
end function

' получить данные из последней позиции
function fListGetDataLast(byref tList as ttList) as any ptr
   return tList.xLast->xData
end function

' получить ID текущей позиции
function fListGetId(byref tList as ttList) as integer
   return tList.pNow
end function

' переместиться в начало
sub fListMoveFirst(byref tList as ttList)
   if fListIsEmpty(tList)=true then exit sub
   tList.xNow=tList.xFirst
   tList.pNow=1
end sub

' переместиться в конец
sub fListMoveLast(byref tList as ttList)
   if fListIsEmpty(tList)=true then exit sub
   tList.xNow=tList.xLast
   tList.pNow=tList.pSize
end sub

' переместиться на следующий элемент
sub fListMoveNext(byref tList as ttList)
   if fListIsEmpty(tList)=true then exit sub
   if tList.pNow<tList.pSize then
      tList.xNow=tList.xNow->xNext
      tList.pNow+=1
   end if
end sub

' переместиться на предыдущий элемент
sub fListMovePrev(byref tList as ttList)
   if fListIsEmpty(tList)=true then exit sub
   if tList.pNow>1 then
      tList.xNow=tList.xNow->xPrev
      tList.pNow-=1
   end if
end sub

' переместиться на указаный ID
sub fListMoveId(byref tList as ttList, byval pId as integer)
   if pId<1 then
      fListMoveFirst tList
   elseif pId>=tList.pSize then
      fListMoveLast tList
   else
      while pId<tList.pNow
         fListMovePrev tList
      wend
      while pId>tList.pNow
         fListMoveNext tList
      wend
   end if
end sub

avatar
tux

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

Посмотреть профиль http://tux.nsk.ru/

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

Re: Экспорт/импорт из длл операторов???

Сообщение  MOHCTP в Пн Фев 07, 2011 2:25 pm

Для начала - обрисую ситуацию. Для некоторой предварительной обработки данных эксперимента я иногда пишу программки на Фортране. Консольные, с чтением списка файлов, подлежащих обработке. Ну, не очень удобно: надо ее кинуть именно в папку с нужными файлами, создать их список (хотя Total Commander делает моментом)... Но меня устраивало. А тут надо студентам в практикум программу, для сглаживания слишком лохматых данных. Соответственно, хорошо бы (но не обязательно) оконную, а вот обязательно - умение выдать стандартный диалог открытия файлов, причем с флагом OFN_ALLOWMULTISELECT. Поскольку файлов много, и желательно выбрать все зараз, чтобы программка потихоньку их там по очереди перекрутила. А то если выбирать файлы по-одному, так еще студенты что-то забудут обработать, да и муторно это. Так вот: на фортране почти что консольную прогу с диалогом выбора файлов на Salford FTN95 я сделал. Там в стандартной библиотеке есть упрощенные варианты вызова некоторых Виндовских функций (в частности, диалога открытия файлов), оказалось полезным. Но: Salford FTN95 не переваривает имен папок/файлов с пробелами: обрывает строчку!!! То есть все работать будет, но если только лаборанткам сказать, что класть папку с данными на Рабочий стол винды нельзя - "Рабочий стол" пойдет в путях с пробелом! А также нельзя называть эту папку, скажем, "Осень 2010" - и то, и то у них в полнейшем обыкновении. Ну, не хорошо получается!

Вот и попробовал я состряпать основу программы на FreeBASIC. И замучился с этим диалогом открытия файлов. Что-то он, собака, при флаге OFN_ALLOWMULTISELECT у меня возвращает или ничего, или просто мусор... Evil or Very Mad То есть, я возвращаемую строку с именами файлов (по указателю в структуре OPENFILENAME) копировал в другую стоку - и, как я теперь стал подозревать, это копирование почему-то не происходило. Хотя без OFN_ALLOWMULTISELECT - никаких проблем нету. Так что если вдруг кто с этим диалогом поможет, то это решит все проблемы.

Да! Я уже написал тут многа букаф, боюсь, что вдруг комп зависнет, или что еще. Так что я сообщение это отправлю, а потом буду его дополнять, поясню, почему я про проблемы свои пишу именно в этой теме.

MOHCTP

Сообщения : 17
Дата регистрации : 2011-02-07

Посмотреть профиль

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

Re: Экспорт/импорт из длл операторов???

Сообщение  MOHCTP в Пн Фев 07, 2011 3:16 pm

Так вот! Набрел я на просторах интернета на такой язык как XBLite. Ну, тоже Бейсик, но с более древним синтаксисом... Но есть одна штука: для него сделан визуальный редактор окошек VIXEN. Он позволяет записать результат или в традиционный код XBLite, или в код, работающий с GUI библиотекой WinX. И вот программирование под эту библиотеку мне понравилось: нигде никогда не надо заполнять никаких структур, как при вызове WinAPI, и вообще все сильно упрощается. Ну и захотелось мне написать простенькую пробную программу на FreeBasic, нагло использующую эту библиотеку. Конкретно - одну только функцию вызова диалога открытия файлов. На вид все просто: описываешь используемые функции (описание функций в обоих языках заметно отличается, так что автоматом не скопируешь), определяешь используемую библиотеку, библиотека экспортируемых функций придается. И все дела! Но не прокатило. Поперли такие же сообщения, как у Саня: undefined reference на обе используемые функции (инициализация + открытие диалога). Ну, с учетом "маскировки" их имен по правилам STDCALL.

Попытки решения. Во-первых, на форуме FreeBASIC нашел такой способ: построить свою собственную библиотеку экспорта с использованием pexports и dlltool. Но не прокатило: линкер все равно dll не подцепил.

Во-вторых. Решил наплевать на стандартный линкер и взял GoLink. Ему библиотеку вообще не надо. А программу скомпилировал в объектный файл. Вышло еще хуже. На ссылки в DLL GoLink не жаловался, зато полезли сообщения о ссылках на fb_StrAssign, fb_StrDelete, fb_Printstring, fb_Sleep. Как я понял, это функции из стандартной рантайм-библиотеки FreeBASIC, которую стандартный линкер достает откуда-то из загашника (юзерам к ней доступа нету).

И вот я теперь в задумчивости чешу репу. То ли скачивать исходники и компилировать рантайм-библиотеку, то ли еще что попробовать... Shocked

MOHCTP

Сообщения : 17
Дата регистрации : 2011-02-07

Посмотреть профиль

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

Re: Экспорт/импорт из длл операторов???

Сообщение  Саня в Пн Фев 07, 2011 3:39 pm

мм..можно код.. и что компилер выдает. Там и понятней будет.
avatar
Саня

Сообщения : 65
Дата регистрации : 2010-04-28
Возраст : 23
Откуда : Екатеринбург

Посмотреть профиль http://vkontakte.ru/id30561430#/id57547166

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

Re: Экспорт/импорт из длл операторов???

Сообщение  MOHCTP в Пн Фев 07, 2011 9:52 pm

Taк! Поясненьица для начала. Программа, как я уже говорил, чисто тестовая, можно ли пользоваться функциями из WinX.dll или нет. И эта dll у меня старовата, версия 0.6.0.1 от 2008 года. Просто на свежую версию нет нигде документации, а эта шла с полным комплектом. В самой новой версии некоторые функции изменены (другое количество аргументов), да и синтаксис они несколько поменяли. Может, и сам компилятор тоже, в каких-то важных моментах. И по этой причине новая версия имеет больше шансов подцепиться. Но без толкового описания функций как-то боязно.
Код:
'' Test for WinX dll
#inclib "WinX"

Declare Function WinXDialog_OpenFile StdCall Alias "WinXDialog_OpenFile$"(ByVal parent As Integer, ByRef title As String, ByRef filter As String, ByRef initalName As String, ByVal multiSelect As Integer ) As String pointer
Declare Function WinX StdCall Alias "WinX"() As Integer

Dim As String title, filter, fileName
Dim As string Pointer z1
Dim As Integer j

j = WinX()

  title = "Откроем много файлов!"
  filter = "Файлы ABС, (*.AVS)\0*.avs\0Текстовые файлы, (*.TXT)\0*.txt\0Bce файлы, (*.*)\0*.*\0\0"

z1 = WinXDialog_OpenFile(0, title, filter, " ", 1)
'' 0 - вместо hWnd окна (а его нет), " " - вместо имени файла, которое должно показываться вначале
'' 1 - что нужен OFN_ALLOWMULTISELECT

  filename = *z1
'' в случае выбора нескольких файлов возвращается как расписано в MSDN, но с ";" в качестве разделителя, а не "\0"

  Print filename
  SLEEP (8000)
Компилятор на это не ругается, ругается линковщик:
C:\Coding\FreeBASIC\fbc -s console "openfile.bas"
openfile.o:fake:(.text+0x71): undefined reference to `WinX@0'
openfile.o:fake:(.text+0xda): undefined reference to `WinXDialog_OpenFile$@20'

Build error(s)

MOHCTP

Сообщения : 17
Дата регистрации : 2011-02-07

Посмотреть профиль

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

Re: Экспорт/импорт из длл операторов???

Сообщение  Саня в Пн Фев 07, 2011 10:39 pm

ну что я заметил..
#inclib "WinX" - это для статических либ. Если есть файлик "winX.dll.a" или что-то подобное, то ничего.. в принципе, можно не ипользовать.


Declare Function WinXDialog_OpenFile StdCall Alias "WinXDialog_OpenFile$"(ByVal parent As Integer, ByRef title As String, ByRef filter As String, ByRef initalName As String, ByVal multiSelect As Integer ) As String pointer
Declare Function WinX StdCall Alias "WinX"() As Integer
немного неправильно, вроде нужно как-то так:
Код:

Extern Windows lib "WinX"
Declare Function WinXDialog_OpenFile  Alias "WinXDialog_OpenFile$"(  _
          ByVal parent As Integer, ByRef title As String, ByRef filter As String,  _
          ByRef initalName As String, ByVal multiSelect As Integer _
 ) As String pointer
Declare Function WinX Alias "WinX"() As Integer
  '
  ' Либо
  '
Declare Function WinXDialog_OpenFile lib "WinX"  Alias "WinXDialog_OpenFile$"(  _
          ByVal parent As Integer, ByRef title As String, ByRef filter As String,  _
          ByRef initalName As String, ByVal multiSelect As Integer _
 ) As String pointer
Declare Function WinX lib "Winxl"  Alias "WinX"() As Integer


А если не получается, то вот из раздела документация..

Статические и динамические библиотеки
блок Extern ..
avatar
Саня

Сообщения : 65
Дата регистрации : 2010-04-28
Возраст : 23
Откуда : Екатеринбург

Посмотреть профиль http://vkontakte.ru/id30561430#/id57547166

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

Re: Экспорт/импорт из длл операторов???

Сообщение  MOHCTP в Пн Фев 07, 2011 10:57 pm

Попробовал так:
Код:
#inclib "WinX"

Extern "Windows"
Declare Function WinXDialog_OpenFile StdCall Alias "WinXDialog_OpenFile$"(ByVal parent As Integer, _
                ByRef title As String, ByRef filter As String, ByRef initalName As String, _
                ByVal multiSelect As Integer ) As String pointer
Declare Function WinX StdCall Alias "WinX"() As Integer
End Extern
..........
- что в лоб, что по лбу. Сейчас запущу с новой версией DLL, там придется еще один параметр учитывать (добавлен)

ЗЫ: Опаньки, оно прошло с первого тычка, с новой-то DLL! Но до конца не прокачал: требует для запуска кучу разных DLL от XBLite, a y меня старый выпуск, одной там еще не было... Ладно, буду апгрейдить!


Последний раз редактировалось: MOHCTP (Пн Фев 07, 2011 11:09 pm), всего редактировалось 1 раз(а)

MOHCTP

Сообщения : 17
Дата регистрации : 2011-02-07

Посмотреть профиль

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

Re: Экспорт/импорт из длл операторов???

Сообщение  Саня в Пн Фев 07, 2011 11:06 pm

а почему параметр lib "WinX" не вставили? кстати может динамически эти функции загружать? там кода чуток побольше, но должно сработать..
avatar
Саня

Сообщения : 65
Дата регистрации : 2010-04-28
Возраст : 23
Откуда : Екатеринбург

Посмотреть профиль http://vkontakte.ru/id30561430#/id57547166

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

Re: Экспорт/импорт из длл операторов???

Сообщение  MOHCTP в Пн Фев 07, 2011 11:19 pm

Я порылся в хелп-файле, там написано, что или используемая библиотека пишется в самом начале (и все), или она прописывается во всех объявляемых функциях. Это имеет одинаковый эффект. А динамически - смотрел через LoadLibrary в WinAPI, несколько ошизел. А вот по Вашей ссылке поковырялся в разъяснениях, там понятный метод. Как-то пропустил мимо, что у FreeBasic есть такие функции.

MOHCTP

Сообщения : 17
Дата регистрации : 2011-02-07

Посмотреть профиль

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

Re: Экспорт/импорт из длл операторов???

Сообщение  Саня в Пн Фев 07, 2011 11:28 pm

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

Сообщения : 65
Дата регистрации : 2010-04-28
Возраст : 23
Откуда : Екатеринбург

Посмотреть профиль http://vkontakte.ru/id30561430#/id57547166

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

Re: Экспорт/импорт из длл операторов???

Сообщение  MOHCTP в Вт Фев 08, 2011 7:14 am

Hy, как бы оно не совсем все в порядке, ибо после прикладывания всех нужных DLL программа таки вылетела с ошибкой, но по части подхвата WinX - все путем.

MOHCTP

Сообщения : 17
Дата регистрации : 2011-02-07

Посмотреть профиль

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

Re: Экспорт/импорт из длл операторов???

Сообщение  MOHCTP в Вт Фев 08, 2011 8:30 am

Не, не путем. Попробовал скомпилировать еще раз - кукиш. Решил написать с динамическим подключением:
Код:
'' Test for WinX dll

dim ptrWinX as any Ptr
dim WinX as function as Integer
Dim WinXDialog_OpenFile as function (ByVal parent As Integer, ByRef title As String, _
                ByRef filter As String, ByRef initalName As String, _
                ByVal multiSelect As Integer, ByVal readOnly as Integer) As String Pointer
Dim As String title, filter, fileName
Dim As string Pointer z1
Dim As Integer j

ptrWinX = DylibLoad("WinX.dll")
  If ptrWinX = 0 then
      Print "Ошибка: не найдена библиотека WinX"
      Sleep (4000)
      End
  End If 
 
WinX = DylibSymbol(ptrWinX, "WinX")
  If WinX = 0 then
    Print "Ошибка: не найдена функция WinX в библиотеке WinX"
    Sleep (4000)
    End
  End If 

j = WinX()
  If j <> 0 then
    Print "Ошибка инициализации библиотеки WinX"
    Sleep (4000)
    End
  End If
 
WinXDialog_OpenFile = DylibSymbol(ptrWinX, "WinXDialog_OpenFile$")
  If WinXDialog_OpenFile = 0 then
    Print "Ошибка: не найдена функция WinXDialog_OpenFile$ в библиотеке WinX"
    Sleep (4000)
    End
  End If 

  title = "Откроем много файлов!"
  filter = "Файлы ABС, (*.AVS)\0*.avs\0Текстовые файлы, (*.TXT)\0*.txt\0Bce файлы, (*.BCE)\0*.bce\0Любые файлы, (*.*)\0*.*\0\0"

z1 = WinXDialog_OpenFile(0, title, filter, " ", 1,0)
  filename = *z1
  If Len(filename) = 0 then
    Print "Ошибка: функция WinXDialog_OpenFile$ не работает!"
    Sleep (4000)
    End
  End If 

  Print filename
  SLEEP (8000)
Компилятор не ругается, все откомпилировал. Но при запуске программа опять вылетает с ошибкой.

ЗЫ: Да, в программе забыл отключить ДЛЛ, но она, похоже, и не подключалась. При дебаге, после сообщений об удачных подключениях системных ДЛЛ:
LOAD_DLL_DEBUG_EVENT
EXCEPTION_ACCESS_VIOLATION
EXCEPTION_ACCESS_VIOLATION
Вообще эта DLL с придурью, сам автор писал, что у нее есть баг: приходится ее сначала инициировать совершенно ничего не делающей функцией WinX, иначе она вылетает при обращении к ней. Похоже, при обращениях на других языках программирования придурь переходит в манию. Придется на нее забить... Sad

Но там любопытные трюки были, в исходниках. На предмет предварительной обработки возвращаемой системой строки с именами файлов, с заменой в ней "\0" другими символами. Что-то подобное вроде попадалось и на форуме PowerBASIC, где кто-то из юзеров выложил свой вариант работы с флагом OFN_MULTISELECT. Надо разбираться. Может, и на FreeBasic такую штуку надо вытворять тоже...

MOHCTP

Сообщения : 17
Дата регистрации : 2011-02-07

Посмотреть профиль

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

Re: Экспорт/импорт из длл операторов???

Сообщение  VerhoLom в Вт Фев 08, 2011 1:30 pm

MOHCTP пишет:Extern "Windows"

Extern "WINDOWS-MS" study
avatar
VerhoLom

Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 35

Посмотреть профиль

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

Re: Экспорт/импорт из длл операторов???

Сообщение  VerhoLom в Вт Фев 08, 2011 1:37 pm

MOHCTP пишет:Компилятор на это не ругается, ругается линковщик:
C:\Coding\FreeBASIC\fbc -s console "openfile.bas"
openfile.o:fake:(.text+0x71): undefined reference to `WinX@0'
openfile.o:fake:(.text+0xda): undefined reference to `WinXDialog_OpenFile$@20'

Build error(s)

Это сообщение означает одно: нету в библиотечке таких функций. Откройте ее в блокноте и посмотрите, что там написано (открытым текстом), т. е. перечень имен функций. Может с сигнатурой проблемы...
avatar
VerhoLom

Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 35

Посмотреть профиль

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

Re: Экспорт/импорт из длл операторов???

Сообщение  MOHCTP в Ср Фев 09, 2011 10:49 am

VerhoLom пишет:
MOHCTP пишет:Extern "Windows"

Extern "WINDOWS-MS" study
A! Синтаксис языка постоянно меняют (в мелочах), по хелпу, идущему с версией 0.21, там просто "WINDOWS". Ну и по логике, какая же может еще быть Винда, кроме как от MS? Компилятор это съел. Значит, так можно.
VerhoLom пишет:Это сообщение означает одно: нету в библиотечке таких функций. Откройте ее в блокноте и посмотрите, что там написано (открытым текстом), т. е. перечень имен функций. Может с сигнатурой проблемы...
Да я смотрел, НЕХ-редактором. Все там есть. Одна проблема: функции там с предшествующим подчеркиванием (как и подобает функциям STDCALL), a вот линковщик в своих матюгах их имена дает без подчеркивания, хотя и с добавлением в конце объема аргументов. Может, просто баг в функции, выдающей сообщения об ошибке. А может, еще что. Для успокоения совести в описаниях функций, там где Alias, добавлял подчеркивание. Практической пользы не было, разве что матюги линковщика кошерно выглядели.

Не, я думаю, всему виной глючность этой ДЛЛ (упомянутая автором).

Фсе, нафиг, сегодня ставлю старичка Compaq Visual Fortran, он виндовское междумордие (в смысле, интерфейс) умеет делать, и с диалогами дружит. Сыт я по горло попытками свалять что-то на других языках. Все равно вычислительную часть придется на фортране компилировать: там больно специфически алгоритм расписан, компиляторы других языков просто на ругань изойдут.

MOHCTP

Сообщения : 17
Дата регистрации : 2011-02-07

Посмотреть профиль

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

Re: Экспорт/импорт из длл операторов???

Сообщение  MOHCTP в Ср Фев 09, 2011 7:59 pm

Чтоб его, гада, Компака ентого... Результат с заполучением файлов при OFN_ALLOWMULTISELECT - такой же плачевный. Ну, фигня какая-то! Кроме того, он древний, на 64-битной винде не ходит, пришлось в виртуалке ставить... И все зря!

Вроде, PowerBasic нормально с OFN_ALLOWMULTISELECT работает, там на их форуме даже когда-то пример выкладывали, как это надо делать. Попробую тогда с ним!

MOHCTP

Сообщения : 17
Дата регистрации : 2011-02-07

Посмотреть профиль

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

Re: Экспорт/импорт из длл операторов???

Сообщение  trew в Ср Фев 09, 2011 9:56 pm

Посмотри в моей библиотеке функцию OpenFileRequester http://freebasic.justforum.net/t374-topic

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

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

Re: Экспорт/импорт из длл операторов???

Сообщение  MOHCTP в Ср Фев 09, 2011 11:06 pm

trew пишет:Посмотри в моей библиотеке функцию OpenFileRequester http://freebasic.justforum.net/t374-topic
Посмотрел примеры программ (на games-freeware), впечатлился. Мдя! Но я уже свалял все междомордие на PowerBasic, и c OFN_ALLOWMULTISELECT там проблем действительно нету никаких. Даже в инклюдах вполне работающая функция как обертка стандартной GetOpenFilename. И, более того, есть куча полезных функций для работы со строками. Например, прямо-таки для результата, возвращаемого GetOpenFilename, есть функция PATHNAME$: можно отсечь отдельно путь к папке, имя файла, и даже его расширение! Ну и куча всего еще. Не, мне понравилось! У FreeBasic со строковыми функциями не особо развернешься. По-моему, хуже чем в Фортране. Так что все: прогу пишу на PowerBasic, расчетную часть загоняю в фортрановскую ДЛЛ.

MOHCTP

Сообщения : 17
Дата регистрации : 2011-02-07

Посмотреть профиль

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

Re: Экспорт/импорт из длл операторов???

Сообщение  VerhoLom в Пт Фев 11, 2011 2:10 pm

MOHCTP пишет:
VerhoLom пишет:
MOHCTP пишет:Extern "Windows"

Extern "WINDOWS-MS" study
A! Синтаксис языка постоянно меняют (в мелочах), по хелпу, идущему с версией 0.21, там просто "WINDOWS".

Не-а! в справке написано тименно так - я ФБ с версии 0,21 юзать начал.

MOHCTP пишет:Да я смотрел, НЕХ-редактором. Все там есть. Одна проблема: функции там с предшествующим подчеркиванием (как и подобает функциям STDCALL), a вот линковщик в своих матюгах их имена дает без подчеркивания, хотя и с добавлением в конце объема аргументов. Может, просто баг в функции, выдающей сообщения об ошибке. А может, еще что. Для успокоения совести в описаниях функций, там где Alias, добавлял подчеркивание. Практической пользы не было, разве что матюги линковщика кошерно выглядели.

Не, я думаю, всему виной глючность этой ДЛЛ (упомянутая автором).

Фсе, нафиг, сегодня ставлю старичка Compaq Visual Fortran, он виндовское междумордие (в смысле, интерфейс) умеет делать, и с диалогами дружит. Сыт я по горло попытками свалять что-то на других языках. Все равно вычислительную часть придется на фортране компилировать: там больно специфически алгоритм расписан, компиляторы других языков просто на ругань изойдут.

Не дело это. Выложите библиотечку со своим примером - хочу тоже поэкспериментировать. Правда как таковая все-таки есть в мире! afro
avatar
VerhoLom

Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 35

Посмотреть профиль

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

Re: Экспорт/импорт из длл операторов???

Сообщение  VerhoLom в Пт Фев 11, 2011 2:13 pm

MOHCTP пишет:Для начала - обрисую ситуацию. Для некоторой предварительной обработки данных эксперимента я иногда пишу программки на Фортране. Консольные, с чтением списка файлов, подлежащих обработке. Ну, не очень удобно: надо ее кинуть именно в папку с нужными файлами, создать их список (хотя Total Commander делает моментом)... Но меня устраивало. А тут надо студентам в практикум программу, для сглаживания слишком лохматых данных. Соответственно, хорошо бы (но не обязательно) оконную, а вот обязательно - умение выдать стандартный диалог открытия файлов, причем с флагом OFN_ALLOWMULTISELECT. Поскольку файлов много, и желательно выбрать все зараз, чтобы программка потихоньку их там по очереди перекрутила. А то если выбирать файлы по-одному, так еще студенты что-то забудут обработать, да и муторно это. Так вот: на фортране почти что консольную прогу с диалогом выбора файлов на Salford FTN95 я сделал. Там в стандартной библиотеке есть упрощенные варианты вызова некоторых Виндовских функций (в частности, диалога открытия файлов), оказалось полезным. Но: Salford FTN95 не переваривает имен папок/файлов с пробелами: обрывает строчку!!! То есть все работать будет, но если только лаборанткам сказать, что класть папку с данными на Рабочий стол винды нельзя - "Рабочий стол" пойдет в путях с пробелом! А также нельзя называть эту папку, скажем, "Осень 2010" - и то, и то у них в полнейшем обыкновении. Ну, не хорошо получается!

Вот и попробовал я состряпать основу программы на FreeBASIC. И замучился с этим диалогом открытия файлов. Что-то он, собака, при флаге OFN_ALLOWMULTISELECT у меня возвращает или ничего, или просто мусор... Evil or Very Mad То есть, я возвращаемую строку с именами файлов (по указателю в структуре OPENFILENAME) копировал в другую стоку - и, как я теперь стал подозревать, это копирование почему-то не происходило. Хотя без OFN_ALLOWMULTISELECT - никаких проблем нету. Так что если вдруг кто с этим диалогом поможет, то это решит все проблемы.

OFN_ALLOWMULTISELECT помещает имена в строку, отделяя каждое нулем (Chr(0)), а в конце будет два ноля. может Вы по пробелам ориентируетесь?
avatar
VerhoLom

Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 35

Посмотреть профиль

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

Re: Экспорт/импорт из длл операторов???

Сообщение  MOHCTP в Пн Фев 14, 2011 5:09 pm

VerhoLom
Пардон, не сразу отвечаю: ковырялся в программе, на форум не залезал. Нет, вот как раз по ноликам и смотрел. И даже просил их мне во всей возвращаемой строке поменять на символ "|", чтобы можно было вывести на печать и посмотреть. В результате получается: полный буфер нулей, лишь изредка кое-где какие-то случайные символы. Что странно, и с FreeBasic, и с Compaq Visual Fortran у меня получается вот такая вот фигня. Ну, понятное дело, и там, и там написано было по одинаковому сценарию. А вот с PowerBasic файлы открываются на ура, зато целый день мучился, пока нашел способ перекидывать массивы между фортраном и бейсиком. В хелпе к Compaq Visual Fortran хороший совет дали: запихать их внутрь UDT. Так все работает.

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

MOHCTP

Сообщения : 17
Дата регистрации : 2011-02-07

Посмотреть профиль

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

Re: Экспорт/импорт из длл операторов???

Сообщение  MOHCTP в Пн Фев 14, 2011 8:02 pm

Так, для заинтересовавшихся! Сама WinX.dll + куча dll, которые она вызывает: некоторые - стандартные от XBlite, другие - специфические из комплекта самой WinX.dll (так вот ее дополнили). Плюс - файл справки (устаревший!) + исходники. Используемая функция WinXDialog_OpenFile$ по сравнению с файлом справки изменена, у нее появился новый параметр. Прочитать можно в комментариях к исходнику. Выложено здесь (одинаковый набор, просто для удобства):

Зеркало 1
Зеркало 2

Вызывающая функцию программа:
Код:
'' Test for WinX dll
'' Связывание в run-time

dim ptrWinX as any Ptr
dim WinX as function as Integer
Dim WinXDialog_OpenFile as function (ByVal parent As Integer, ByRef title As String, _
                ByRef filter As String, ByRef initalName As String, _
                ByVal multiSelect As Integer, ByVal readOnly as Integer) As String
Dim As String title, filter, fileName
Dim As string z1
Dim As Integer j

ptrWinX = DylibLoad("WinX.dll")
  If ptrWinX = 0 then
      Print "Ошибка: не найдена библиотека WinX"
      Sleep (4000)
      End
  End If 
 
WinX = DylibSymbol(ptrWinX, "WinX")
  If WinX = 0 then
    Print "Ошибка: не найдена функция WinX в библиотеке WinX"
    Sleep (4000)
    End
  End If 

j = WinX()
  If j <> 0 then
    Print "Ошибка инициализации библиотеки WinX"
    Sleep (4000)
    End
  End If
 
WinXDialog_OpenFile = DylibSymbol(ptrWinX, "WinXDialog_OpenFile$")
  If WinXDialog_OpenFile = 0 then
    Print "Ошибка: не найдена функция WinXDialog_OpenFile$ в библиотеке WinX"
    Sleep (4000)
    End
  End If 

  title = "Откроем много файлов!"
  filter = "Файлы ABС, (*.AVS)\0*.avs\0Текстовые файлы, (*.TXT)\0*.txt\0Любые файлы, (*.*)\0*.*\0\0"

filename = WinXDialog_OpenFile(0, title, filter, " ", 1,0)
   
  If Len(filename) = 0 then
    Print "Ошибка: функция WinXDialog_OpenFile$ не работает!"
    Sleep (4000)
    End
  End If 

  Print filename
  SLEEP (8000)
Никакая из прописанных ошибок не отлавливается, возникает консоль, и сразу все вылетает. Дебаггер выдает:
EXCEPTION_ACCESS_VIOLATION
EXCEPTION_ACCESS_VIOLATION

MOHCTP

Сообщения : 17
Дата регистрации : 2011-02-07

Посмотреть профиль

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

Re: Экспорт/импорт из длл операторов???

Сообщение  MOHCTP в Пн Фев 14, 2011 10:06 pm

Да! Решил попробовать провернуть этот же фокус с PowerBasic. Получается следующее:

1. Функция WinX, инициирующая ДЛЛ, отрабатывается нормально.
2. При попытке вызова функции WinXDialog_OpenFile$ программа вылетает с сообщением (в дебаггере):
Program tried to read or write an invalid memory address
Поскольку функция эта - строковая, похоже, разные бейсики по разному это понимают. Все равно там указатель передается. Но: на начало строки? на дескриптор? А черт его знает! Shocked

MOHCTP

Сообщения : 17
Дата регистрации : 2011-02-07

Посмотреть профиль

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

Re: Экспорт/импорт из длл операторов???

Сообщение  trew в Пн Фев 14, 2011 10:22 pm

MOHCTP пишет:
Поскольку функция эта - строковая, похоже, разные бейсики по разному это понимают. Все равно там указатель передается. Но: на начало строки? на дескриптор? А черт его знает! Shocked

Так и использовал бы ту функцию, о которой я тебе писал,тем более что исходник ее доступен, чем конителить закрытую функцию PowerBasic

trew

Сообщения : 331
Дата регистрации : 2010-10-14

Посмотреть профиль

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

Re: Экспорт/импорт из длл операторов???

Сообщение  Спонсируемый контент


Спонсируемый контент


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

Страница 1 из 2 1, 2  Следующий

Предыдущая тема Следующая тема Вернуться к началу


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