Экспорт/импорт из длл операторов???
Участников: 5
Страница 1 из 2
Страница 1 из 2 • 1, 2
Экспорт/импорт из длл операторов???
Пытаюсь написать либу для списков и возник такой вопрос.... судя по мануалу это невозможно, но вдруг есть что-нибудь извращенное...
И вдогонку...компилятор при попытках скомпилировать функции выдает непонятное:
'..............................................................................................
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)
'.............................................................................................
почему? и как это исправлять?
И вдогонку...компилятор при попытках скомпилировать функции выдает непонятное:
'..............................................................................................
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)
'.............................................................................................
почему? и как это исправлять?
Re: Экспорт/импорт из длл операторов???
во первых "-s gui" для динамической библиотеки ну никак не применим, во вторых, неплохо было бы сначала посмотреть на код, который вы хотите откомпилить, так мало чего можно сказать, единственное, это чет с областью видимости может намудрил...
а вообще, если надо, когдато делал чета такое уже, тока без ооп-а, оставлю здесь, мож кому еще приглянется
list.bi
а вообще, если надо, когдато делал чета такое уже, тока без ооп-а, оставлю здесь, мож кому еще приглянется
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
- Код:
' в списке 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
Re: Экспорт/импорт из длл операторов???
Для начала - обрисую ситуацию. Для некоторой предварительной обработки данных эксперимента я иногда пишу программки на Фортране. Консольные, с чтением списка файлов, подлежащих обработке. Ну, не очень удобно: надо ее кинуть именно в папку с нужными файлами, создать их список (хотя Total Commander делает моментом)... Но меня устраивало. А тут надо студентам в практикум программу, для сглаживания слишком лохматых данных. Соответственно, хорошо бы (но не обязательно) оконную, а вот обязательно - умение выдать стандартный диалог открытия файлов, причем с флагом OFN_ALLOWMULTISELECT. Поскольку файлов много, и желательно выбрать все зараз, чтобы программка потихоньку их там по очереди перекрутила. А то если выбирать файлы по-одному, так еще студенты что-то забудут обработать, да и муторно это. Так вот: на фортране почти что консольную прогу с диалогом выбора файлов на Salford FTN95 я сделал. Там в стандартной библиотеке есть упрощенные варианты вызова некоторых Виндовских функций (в частности, диалога открытия файлов), оказалось полезным. Но: Salford FTN95 не переваривает имен папок/файлов с пробелами: обрывает строчку!!! То есть все работать будет, но если только лаборанткам сказать, что класть папку с данными на Рабочий стол винды нельзя - "Рабочий стол" пойдет в путях с пробелом! А также нельзя называть эту папку, скажем, "Осень 2010" - и то, и то у них в полнейшем обыкновении. Ну, не хорошо получается!
Вот и попробовал я состряпать основу программы на FreeBASIC. И замучился с этим диалогом открытия файлов. Что-то он, собака, при флаге OFN_ALLOWMULTISELECT у меня возвращает или ничего, или просто мусор... То есть, я возвращаемую строку с именами файлов (по указателю в структуре OPENFILENAME) копировал в другую стоку - и, как я теперь стал подозревать, это копирование почему-то не происходило. Хотя без OFN_ALLOWMULTISELECT - никаких проблем нету. Так что если вдруг кто с этим диалогом поможет, то это решит все проблемы.
Да! Я уже написал тут многа букаф, боюсь, что вдруг комп зависнет, или что еще. Так что я сообщение это отправлю, а потом буду его дополнять, поясню, почему я про проблемы свои пишу именно в этой теме.
Вот и попробовал я состряпать основу программы на FreeBASIC. И замучился с этим диалогом открытия файлов. Что-то он, собака, при флаге OFN_ALLOWMULTISELECT у меня возвращает или ничего, или просто мусор... То есть, я возвращаемую строку с именами файлов (по указателю в структуре OPENFILENAME) копировал в другую стоку - и, как я теперь стал подозревать, это копирование почему-то не происходило. Хотя без OFN_ALLOWMULTISELECT - никаких проблем нету. Так что если вдруг кто с этим диалогом поможет, то это решит все проблемы.
Да! Я уже написал тут многа букаф, боюсь, что вдруг комп зависнет, или что еще. Так что я сообщение это отправлю, а потом буду его дополнять, поясню, почему я про проблемы свои пишу именно в этой теме.
MOHCTP- Сообщения : 17
Дата регистрации : 2011-02-07
Re: Экспорт/импорт из длл операторов???
Так вот! Набрел я на просторах интернета на такой язык как 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, которую стандартный линкер достает откуда-то из загашника (юзерам к ней доступа нету).
И вот я теперь в задумчивости чешу репу. То ли скачивать исходники и компилировать рантайм-библиотеку, то ли еще что попробовать...
Попытки решения. Во-первых, на форуме FreeBASIC нашел такой способ: построить свою собственную библиотеку экспорта с использованием pexports и dlltool. Но не прокатило: линкер все равно dll не подцепил.
Во-вторых. Решил наплевать на стандартный линкер и взял GoLink. Ему библиотеку вообще не надо. А программу скомпилировал в объектный файл. Вышло еще хуже. На ссылки в DLL GoLink не жаловался, зато полезли сообщения о ссылках на fb_StrAssign, fb_StrDelete, fb_Printstring, fb_Sleep. Как я понял, это функции из стандартной рантайм-библиотеки FreeBASIC, которую стандартный линкер достает откуда-то из загашника (юзерам к ней доступа нету).
И вот я теперь в задумчивости чешу репу. То ли скачивать исходники и компилировать рантайм-библиотеку, то ли еще что попробовать...
MOHCTP- Сообщения : 17
Дата регистрации : 2011-02-07
Re: Экспорт/импорт из длл операторов???
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: Экспорт/импорт из длл операторов???
ну что я заметил..
#inclib "WinX" - это для статических либ. Если есть файлик "winX.dll.a" или что-то подобное, то ничего.. в принципе, можно не ипользовать.
Статические и динамические библиотеки
блок Extern ..
#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 ..
Re: Экспорт/импорт из длл операторов???
Попробовал так:
ЗЫ: Опаньки, оно прошло с первого тычка, с новой-то DLL! Но до конца не прокачал: требует для запуска кучу разных DLL от XBLite, a y меня старый выпуск, одной там еще не было... Ладно, буду апгрейдить!
- Код:
#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 от XBLite, a y меня старый выпуск, одной там еще не было... Ладно, буду апгрейдить!
Последний раз редактировалось: MOHCTP (Пн Фев 07, 2011 11:09 pm), всего редактировалось 1 раз(а)
MOHCTP- Сообщения : 17
Дата регистрации : 2011-02-07
Re: Экспорт/импорт из длл операторов???
а почему параметр lib "WinX" не вставили? кстати может динамически эти функции загружать? там кода чуток побольше, но должно сработать..
Re: Экспорт/импорт из длл операторов???
Я порылся в хелп-файле, там написано, что или используемая библиотека пишется в самом начале (и все), или она прописывается во всех объявляемых функциях. Это имеет одинаковый эффект. А динамически - смотрел через LoadLibrary в WinAPI, несколько ошизел. А вот по Вашей ссылке поковырялся в разъяснениях, там понятный метод. Как-то пропустил мимо, что у FreeBasic есть такие функции.
MOHCTP- Сообщения : 17
Дата регистрации : 2011-02-07
Re: Экспорт/импорт из длл операторов???
здесь на форуме есть мануал на русском, в документации верхний топик. там можно найти немного интересного...
надеюсь, если все нормально, то поди и темку можно закрывать..
надеюсь, если все нормально, то поди и темку можно закрывать..
Re: Экспорт/импорт из длл операторов???
Hy, как бы оно не совсем все в порядке, ибо после прикладывания всех нужных DLL программа таки вылетела с ошибкой, но по части подхвата WinX - все путем.
MOHCTP- Сообщения : 17
Дата регистрации : 2011-02-07
Re: Экспорт/импорт из длл операторов???
Не, не путем. Попробовал скомпилировать еще раз - кукиш. Решил написать с динамическим подключением:
ЗЫ: Да, в программе забыл отключить ДЛЛ, но она, похоже, и не подключалась. При дебаге, после сообщений об удачных подключениях системных ДЛЛ:
Но там любопытные трюки были, в исходниках. На предмет предварительной обработки возвращаемой системой строки с именами файлов, с заменой в ней "\0" другими символами. Что-то подобное вроде попадалось и на форуме PowerBASIC, где кто-то из юзеров выложил свой вариант работы с флагом OFN_MULTISELECT. Надо разбираться. Может, и на FreeBasic такую штуку надо вытворять тоже...
- Код:
'' 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)
ЗЫ: Да, в программе забыл отключить ДЛЛ, но она, похоже, и не подключалась. При дебаге, после сообщений об удачных подключениях системных ДЛЛ:
Вообще эта DLL с придурью, сам автор писал, что у нее есть баг: приходится ее сначала инициировать совершенно ничего не делающей функцией WinX, иначе она вылетает при обращении к ней. Похоже, при обращениях на других языках программирования придурь переходит в манию. Придется на нее забить...LOAD_DLL_DEBUG_EVENT
EXCEPTION_ACCESS_VIOLATION
EXCEPTION_ACCESS_VIOLATION
Но там любопытные трюки были, в исходниках. На предмет предварительной обработки возвращаемой системой строки с именами файлов, с заменой в ней "\0" другими символами. Что-то подобное вроде попадалось и на форуме PowerBASIC, где кто-то из юзеров выложил свой вариант работы с флагом OFN_MULTISELECT. Надо разбираться. Может, и на FreeBasic такую штуку надо вытворять тоже...
MOHCTP- Сообщения : 17
Дата регистрации : 2011-02-07
Re: Экспорт/импорт из длл операторов???
MOHCTP пишет:Extern "Windows"
Extern "WINDOWS-MS"
VerhoLom- Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 42
Re: Экспорт/импорт из длл операторов???
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)
Это сообщение означает одно: нету в библиотечке таких функций. Откройте ее в блокноте и посмотрите, что там написано (открытым текстом), т. е. перечень имен функций. Может с сигнатурой проблемы...
VerhoLom- Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 42
Re: Экспорт/импорт из длл операторов???
A! Синтаксис языка постоянно меняют (в мелочах), по хелпу, идущему с версией 0.21, там просто "WINDOWS". Ну и по логике, какая же может еще быть Винда, кроме как от MS? Компилятор это съел. Значит, так можно.VerhoLom пишет:MOHCTP пишет:Extern "Windows"
Extern "WINDOWS-MS"
Да я смотрел, НЕХ-редактором. Все там есть. Одна проблема: функции там с предшествующим подчеркиванием (как и подобает функциям STDCALL), a вот линковщик в своих матюгах их имена дает без подчеркивания, хотя и с добавлением в конце объема аргументов. Может, просто баг в функции, выдающей сообщения об ошибке. А может, еще что. Для успокоения совести в описаниях функций, там где Alias, добавлял подчеркивание. Практической пользы не было, разве что матюги линковщика кошерно выглядели.VerhoLom пишет:Это сообщение означает одно: нету в библиотечке таких функций. Откройте ее в блокноте и посмотрите, что там написано (открытым текстом), т. е. перечень имен функций. Может с сигнатурой проблемы...
Не, я думаю, всему виной глючность этой ДЛЛ (упомянутая автором).
Фсе, нафиг, сегодня ставлю старичка Compaq Visual Fortran, он виндовское междумордие (в смысле, интерфейс) умеет делать, и с диалогами дружит. Сыт я по горло попытками свалять что-то на других языках. Все равно вычислительную часть придется на фортране компилировать: там больно специфически алгоритм расписан, компиляторы других языков просто на ругань изойдут.
MOHCTP- Сообщения : 17
Дата регистрации : 2011-02-07
Re: Экспорт/импорт из длл операторов???
Чтоб его, гада, Компака ентого... Результат с заполучением файлов при OFN_ALLOWMULTISELECT - такой же плачевный. Ну, фигня какая-то! Кроме того, он древний, на 64-битной винде не ходит, пришлось в виртуалке ставить... И все зря!
Вроде, PowerBasic нормально с OFN_ALLOWMULTISELECT работает, там на их форуме даже когда-то пример выкладывали, как это надо делать. Попробую тогда с ним!
Вроде, PowerBasic нормально с OFN_ALLOWMULTISELECT работает, там на их форуме даже когда-то пример выкладывали, как это надо делать. Попробую тогда с ним!
MOHCTP- Сообщения : 17
Дата регистрации : 2011-02-07
Re: Экспорт/импорт из длл операторов???
Посмотри в моей библиотеке функцию OpenFileRequester https://freebasic.forum2x2.ru/t374-topic
trew- Сообщения : 331
Дата регистрации : 2010-10-14
Re: Экспорт/импорт из длл операторов???
Посмотрел примеры программ (на games-freeware), впечатлился. Мдя! Но я уже свалял все междомордие на PowerBasic, и c OFN_ALLOWMULTISELECT там проблем действительно нету никаких. Даже в инклюдах вполне работающая функция как обертка стандартной GetOpenFilename. И, более того, есть куча полезных функций для работы со строками. Например, прямо-таки для результата, возвращаемого GetOpenFilename, есть функция PATHNAME$: можно отсечь отдельно путь к папке, имя файла, и даже его расширение! Ну и куча всего еще. Не, мне понравилось! У FreeBasic со строковыми функциями не особо развернешься. По-моему, хуже чем в Фортране. Так что все: прогу пишу на PowerBasic, расчетную часть загоняю в фортрановскую ДЛЛ.trew пишет:Посмотри в моей библиотеке функцию OpenFileRequester https://freebasic.forum2x2.ru/t374-topic
MOHCTP- Сообщения : 17
Дата регистрации : 2011-02-07
Re: Экспорт/импорт из длл операторов???
MOHCTP пишет:A! Синтаксис языка постоянно меняют (в мелочах), по хелпу, идущему с версией 0.21, там просто "WINDOWS".VerhoLom пишет:MOHCTP пишет:Extern "Windows"
Extern "WINDOWS-MS"
Не-а! в справке написано тименно так - я ФБ с версии 0,21 юзать начал.
MOHCTP пишет:Да я смотрел, НЕХ-редактором. Все там есть. Одна проблема: функции там с предшествующим подчеркиванием (как и подобает функциям STDCALL), a вот линковщик в своих матюгах их имена дает без подчеркивания, хотя и с добавлением в конце объема аргументов. Может, просто баг в функции, выдающей сообщения об ошибке. А может, еще что. Для успокоения совести в описаниях функций, там где Alias, добавлял подчеркивание. Практической пользы не было, разве что матюги линковщика кошерно выглядели.
Не, я думаю, всему виной глючность этой ДЛЛ (упомянутая автором).
Фсе, нафиг, сегодня ставлю старичка Compaq Visual Fortran, он виндовское междумордие (в смысле, интерфейс) умеет делать, и с диалогами дружит. Сыт я по горло попытками свалять что-то на других языках. Все равно вычислительную часть придется на фортране компилировать: там больно специфически алгоритм расписан, компиляторы других языков просто на ругань изойдут.
Не дело это. Выложите библиотечку со своим примером - хочу тоже поэкспериментировать. Правда как таковая все-таки есть в мире!
VerhoLom- Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 42
Re: Экспорт/импорт из длл операторов???
MOHCTP пишет:Для начала - обрисую ситуацию. Для некоторой предварительной обработки данных эксперимента я иногда пишу программки на Фортране. Консольные, с чтением списка файлов, подлежащих обработке. Ну, не очень удобно: надо ее кинуть именно в папку с нужными файлами, создать их список (хотя Total Commander делает моментом)... Но меня устраивало. А тут надо студентам в практикум программу, для сглаживания слишком лохматых данных. Соответственно, хорошо бы (но не обязательно) оконную, а вот обязательно - умение выдать стандартный диалог открытия файлов, причем с флагом OFN_ALLOWMULTISELECT. Поскольку файлов много, и желательно выбрать все зараз, чтобы программка потихоньку их там по очереди перекрутила. А то если выбирать файлы по-одному, так еще студенты что-то забудут обработать, да и муторно это. Так вот: на фортране почти что консольную прогу с диалогом выбора файлов на Salford FTN95 я сделал. Там в стандартной библиотеке есть упрощенные варианты вызова некоторых Виндовских функций (в частности, диалога открытия файлов), оказалось полезным. Но: Salford FTN95 не переваривает имен папок/файлов с пробелами: обрывает строчку!!! То есть все работать будет, но если только лаборанткам сказать, что класть папку с данными на Рабочий стол винды нельзя - "Рабочий стол" пойдет в путях с пробелом! А также нельзя называть эту папку, скажем, "Осень 2010" - и то, и то у них в полнейшем обыкновении. Ну, не хорошо получается!
Вот и попробовал я состряпать основу программы на FreeBASIC. И замучился с этим диалогом открытия файлов. Что-то он, собака, при флаге OFN_ALLOWMULTISELECT у меня возвращает или ничего, или просто мусор... То есть, я возвращаемую строку с именами файлов (по указателю в структуре OPENFILENAME) копировал в другую стоку - и, как я теперь стал подозревать, это копирование почему-то не происходило. Хотя без OFN_ALLOWMULTISELECT - никаких проблем нету. Так что если вдруг кто с этим диалогом поможет, то это решит все проблемы.
OFN_ALLOWMULTISELECT помещает имена в строку, отделяя каждое нулем (Chr(0)), а в конце будет два ноля. может Вы по пробелам ориентируетесь?
VerhoLom- Сообщения : 67
Дата регистрации : 2010-07-06
Возраст : 42
Re: Экспорт/импорт из длл операторов???
VerhoLom
Пардон, не сразу отвечаю: ковырялся в программе, на форум не залезал. Нет, вот как раз по ноликам и смотрел. И даже просил их мне во всей возвращаемой строке поменять на символ "|", чтобы можно было вывести на печать и посмотреть. В результате получается: полный буфер нулей, лишь изредка кое-где какие-то случайные символы. Что странно, и с FreeBasic, и с Compaq Visual Fortran у меня получается вот такая вот фигня. Ну, понятное дело, и там, и там написано было по одинаковому сценарию. А вот с PowerBasic файлы открываются на ура, зато целый день мучился, пока нашел способ перекидывать массивы между фортраном и бейсиком. В хелпе к Compaq Visual Fortran хороший совет дали: запихать их внутрь UDT. Так все работает.
А библиотечку я попозже выложу, когда домой с работы приеду. Но там к ней в компаньоны идет еще куча всяких ДЛЛ. И если уж с ней ковыряться, то нужны еще и исходники: в них в комментариях записаны изменения, введенные после составления справки.
Пардон, не сразу отвечаю: ковырялся в программе, на форум не залезал. Нет, вот как раз по ноликам и смотрел. И даже просил их мне во всей возвращаемой строке поменять на символ "|", чтобы можно было вывести на печать и посмотреть. В результате получается: полный буфер нулей, лишь изредка кое-где какие-то случайные символы. Что странно, и с FreeBasic, и с Compaq Visual Fortran у меня получается вот такая вот фигня. Ну, понятное дело, и там, и там написано было по одинаковому сценарию. А вот с PowerBasic файлы открываются на ура, зато целый день мучился, пока нашел способ перекидывать массивы между фортраном и бейсиком. В хелпе к Compaq Visual Fortran хороший совет дали: запихать их внутрь UDT. Так все работает.
А библиотечку я попозже выложу, когда домой с работы приеду. Но там к ней в компаньоны идет еще куча всяких ДЛЛ. И если уж с ней ковыряться, то нужны еще и исходники: в них в комментариях записаны изменения, введенные после составления справки.
MOHCTP- Сообщения : 17
Дата регистрации : 2011-02-07
Re: Экспорт/импорт из длл операторов???
Так, для заинтересовавшихся! Сама WinX.dll + куча dll, которые она вызывает: некоторые - стандартные от XBlite, другие - специфические из комплекта самой WinX.dll (так вот ее дополнили). Плюс - файл справки (устаревший!) + исходники. Используемая функция WinXDialog_OpenFile$ по сравнению с файлом справки изменена, у нее появился новый параметр. Прочитать можно в комментариях к исходнику. Выложено здесь (одинаковый набор, просто для удобства):
Зеркало 1
Зеркало 2
Вызывающая функцию программа:
Зеркало 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: Экспорт/импорт из длл операторов???
Да! Решил попробовать провернуть этот же фокус с PowerBasic. Получается следующее:
1. Функция WinX, инициирующая ДЛЛ, отрабатывается нормально.
2. При попытке вызова функции WinXDialog_OpenFile$ программа вылетает с сообщением (в дебаггере):
1. Функция WinX, инициирующая ДЛЛ, отрабатывается нормально.
2. При попытке вызова функции WinXDialog_OpenFile$ программа вылетает с сообщением (в дебаггере):
Поскольку функция эта - строковая, похоже, разные бейсики по разному это понимают. Все равно там указатель передается. Но: на начало строки? на дескриптор? А черт его знает!Program tried to read or write an invalid memory address
MOHCTP- Сообщения : 17
Дата регистрации : 2011-02-07
Re: Экспорт/импорт из длл операторов???
MOHCTP пишет:
Поскольку функция эта - строковая, похоже, разные бейсики по разному это понимают. Все равно там указатель передается. Но: на начало строки? на дескриптор? А черт его знает!
Так и использовал бы ту функцию, о которой я тебе писал,тем более что исходник ее доступен, чем конителить закрытую функцию PowerBasic
trew- Сообщения : 331
Дата регистрации : 2010-10-14
Страница 1 из 2 • 1, 2
Страница 1 из 2
Права доступа к этому форуму:
Вы не можете отвечать на сообщения
|
|