Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 | 3 | 4 | 5 | 6 |

 

  Вопрос: DLL из FreeBasic в Visual Basic6.0 Добавлено: 22.12.06 10:24  

Автор вопроса:  Сергей Юдин
В этом форуме было уже около 40 тем по DLL, но ни в одной я не нашел ответа, а
решить вопрос надо, т.к. вопрос повышения быстродействия программ написанных на
Visual Basic6.0 является хоть и не смертельным, но насущным и многие с ним сталкивались.
Так вот, написал я программу SpuskVB6, которая нормально работает, но скорость работы из за
большого объема математических вычислений не удовлетворительная. На 100% тот же самый код (кроме визуальных объектов)
откомпилированный Free Basic (32 битный) работает в 10 раз быстрее, но мне не хочется расставаться
с удобством интерфейса программы предоставляемым Visual Basic6.0. Решил создать dll библиотеку
с математической частью программы и, откомпилировав ее Free Basic, использовать потом
ее в проекте Visual Basic6.0, но возникли проблемы. Написал для пробы маленький код
всего с одной функцией
''' program mydll2.bas for Spusk verWIN Free Basic
#include once "mydll2.bi"
function XYZ (byref ipm as integer, byref Xpm as double, byref Ypm as _
              double ) as double export
If ipm = 2 Then GoTo 110
Ypm = 1 - Xpm
GoTo 120
110: Ypm = 1
If Xpm > 0 Then Ypm = 1 - Sqr(1 - (Xpm - 1) * (Xpm - 1))
120 : function = 0
End Function

Используя
''' program mydll2.bi for Spusk verWIN Free Basic
Declare Function XYZ Lib "mydll2" (ByRef ipm As Integer, ByRef Xpm As _
                           Double, ByRef Ypm As Double) As Double

создал командой fbc -dll mydll2.bas файл библиотеки mydll2.dll, которая отлично работает в
программе SpuskFB, т.е. написанной на Free Basic, как при подключение на стадии компиляции проекта, так
и в режиме работы программы. Ниже приведены оба варианта кода программы (фрагменты)
REM program Spusk verWIN Free Basic
Option Explicit
#include once "windows.bi"
 '$include: 'mydll2.bi'
DIM as double FX(6) , FY(6), FZ(6), Tmax(6), VX(6), VY(6), VZ(6)
................................................................
For i = 1 To 2
x(i) = bx(i) - 2 * h: Zminus2(i) = XYZ(i, x(i), y(i)): Yminus2(i) = y(i)

REM program Spusk verWIN Free Basic
option explicit
#include once "windows.bi"
DIM as double FX(6) , FY(6), FZ(6), Tmax(6), VX(6), VY(6), VZ(6)
............................................................
dim library as integer
dim XYZ as function(byref ipm as integer, byref Xpm as double, byref Ypm as double ) as double
library = dylibload("mydll2")
    XYZ = dylibsymbol(library, "XYZ")
.................................................................
For i = 1 To 2
x(i) = bx(i) - 2 * h: Zminus2(i) = XYZ(i, x(i), y(i)): Yminus2(i) = y(i)

Однако IDE Visual Basic 6.0 отказывается добавить ссылку в проект на библиотеку
mydll2.dll, т.к. библиотека создана не с помощью COM технологии ActivX DLL, а
во время работы программа SpuskVB6 не может найти точку входа в библиотеку, после
объявления функции в программе следующим образом
Private Declare Function XYZ Lib "mydll2.dll" (ByRef ipm As Integer, ByRef Xpm As Double, ByRef Ypm As Double) As Double
Просматривая в IDE атрибуты процедуры вижу, что имя процедуры XYZ видно, а вот ID равен нулю.
Не помогает и lb = LoadLibrary("mydll2.dll") плюс pa = GetProcAddress(lb, "XYZ"), т.к.
адрес библиотеки я нахожу, а вот адреса моей функции опять определить не могу.
Помогите кто чем может.
А, если кого то зантересовал вопрос программирования на разных языках и быстродействия
кода различных компиляторов, то можете ознакомиться с коллекцией программ Spusk
написанных на разных языках на моей домашней странице http://ser.t-k.ru

С наилучшими пожеланиями Сергей Юдин.

Ответить

  Ответы Всего ответов: 77  

Номер ответа: 1
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #1 Добавлено: 22.12.06 11:31
Ну, на FreeBasic dll писать не приходилось, зато на C++ такая проблема могла возникнуть если ты не экспортируешь эту функцию из библиотеки. Не знаю какой там аналог def-файла, но, думаю, дело в этом.

Ответить

Номер ответа: 2
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #2
Добавлено: 22.12.06 14:22
Проверь имена экспортируемых DLLей функций, либо там такой функции нет, либо у нее другое имя

Ответить

Номер ответа: 3
Автор ответа:
 JMP



Вопросов: 6
Ответов: 171
 Профиль | | #3 Добавлено: 23.12.06 10:01
При экспорте и импорте надо использовать ALIAS
в обьявлениях DLL- функций. Регистр символов критичен.
не полагайтесь на то что по умолчанию все будет в верхнем регистре.

посмотрите каталог FreeBASIC\examples\export\

Ответить

Номер ответа: 4
Автор ответа:
 Сергей Юдин



Вопросов: 8
Ответов: 81
 Профиль | | #4 Добавлено: 23.12.06 12:57
Всем спасибо. Проблема решилась очень просто, но намучился вдоволь, т.к. в хэлпе по этому вопросу ничего не сказано. К тому же и написан он на английском, хотя IDE русифицирован. Хорошо, что вместе с компилятором идет большая коллекция примеров. В одном из них нашел пример, с одним строковым параметром и строковым значением функции, который работал под Visual Basic 6.0, но почему не понятно. Единственной зацепкой было то, что командная строка была немного отлична от типовой, т.е. вместо fbc –dll mydll2.bas надо было писать fbc mydll2.bas –dll и не надо было использовать файл с переименованием функции mydll2.bi, а замена имени функции производилась уже в Visual Basic 6.0 и при этом использовалась странная конструкция alias “XYZ@4”. Попробовал два строковых параметра – не работает, один строковый, другой целочисленный не работает. В общем почти отчаялся, пока не додумался посмотреть в дизассемблере, что же там пишется в откомпилированном файле, т.к. просмотрщик DLL файлов всегда показывал, что точка входа остается неизменной 1000h. Выяснилось, что при компиляции к новому имени функции как раз и добавляется это странное сочетание @4. Но, если у Вас два строковых или целочисленных параметра добавляется @8, а если один Integer а другой Double, то добавляется @12. В общем сделал файл

'' program mydll9.dll for Spusk verWIN Free Basic
function XY alias "XY" (byval ipm as integer, byval Xpm as double) as double export
Dim Ypm as double
Select Case ipm
       Case 1: Ypm = 1 - Xpm ' прямая
       Case 2: Ypm = 0.29173209 * Exp(-12.5379756 * Xpm) + 0.688232 * (Xpm - 1) * (Xpm - 1) 'циклоида (аппроксимация)
       Case 3: Ypm = (Xpm - 1) * (Xpm - 1) ' парабола
       Case 4: Ypm = 1: ' дуга окружности (четверть круга)
               If Xpm > 0 Then Ypm = 1 - Sqr(1 - (1 - Xpm) * (1 - Xpm))
End Select
function = Ypm
end function

откомпилировал Free Basic командой fbc mydll9.bas –dll и в Visual Basic 6.0 объявил функцию как
Private Declare Function XY Lib "mydll9.dll" Alias "XY@12" (ByVal ipm As Integer, ByVal Xpm As Double) As Double

Теперь в программе обращение к этой функции Ym2(i) = XY(i, x(i)) работает как и положено. Желаю всем удачи и настоятельно рекомендую ознакомиться с языком Free Basic, который может все, что может C++, а работает даже быстрее. К тому же он распространяется свободно. После окончания написания статьи “Выбор языка программирования для научных работников” можно будет более подробно ознакомиться с достоинствами этого и других языков программирования (я выложу эту статью на своей домашней странице http://ser.t-k.ru ), а сам компилятор можно скачать здесь http://www.freebasic.net/index.php/download или здесь http://prdownloads.sourceforge.net/fbc/FreeBASIC-v0.16b-win32.exe?download а IDE к нему здесь http://prdownloads.sourceforge.net/fbide/FBIde_0.4.6.zip?download (желательно устанавливать после компилятора), русский сайт (правда очень дохлый) здесь http://2088pm.com/fb/fb.php .

С наилучшими пожеланиями Сергей Юдин

Ответить

Номер ответа: 5
Автор ответа:
 Сергей Юдин



Вопросов: 8
Ответов: 81
 Профиль | | #5 Добавлено: 23.12.06 16:27
Посмотрел пример export. Виноват, действительно там именно об этом и говориться, когда мы не пишем, что у нас будет Си декларация ALIAS, т.е. cdecl alias XY, но вот в хэлпе хоть бы ссылку дали на этот пример в разделе DLL, а то ведь и не сразу догадаешься, что там именно об этом и идет речь, а примеров в examples целая куча. Ну да ладно, хорошо то, что хорошо кончается. А у меня теперь вскочил новый вопрос. Если библиотека DLL является таким же PE файлом как и исполняемый файл EXE, то наверное в ней тоже можно для нескольких функций объявить общие переменные примерно так.

'' program spuskDLL.dll for Spusk verWIN Visual Basic
Option Explicit
dim as double tau, h

function XYZ0 alias "XYZ0" (byval tau as double, byval h as double) as double export
function = 0
end function

function XYZ alias "XYZ" (byval ipm as integer, byval Xpm as double) as double export
DIM as double Zminus2(6), Zminus1(6), Znul(6), Zplus1(6), Zplus2(6)
……………………………………………………………….
Xminus2(ipm) = Xpm – h
Yminus2(ipm) = Yn – tau * Xminus2(ipm)
……………………………………………………………….
function = 0
end function

Это мне надо для того, чтобы не передавать по ссылке в функциию XYZ около десяти параметров (tau, h, …..), которые при многочисленных обращениях к этой функции остаются постоянными, а передавать только те, которые при каждом обращение изменяются, а постоянные параметры передать один раз по ссылке в функции XYZ0 в самом начале расчета. И еще, надо ли будет специально загружать библиотеку в начале работы программы в адресное пространство моего процесса LoadLibrary("spuskDLL.dll";) или она автоматически будет загружена, если ее функции задекларированы.

С наилучшими пожеланиями Сергей Юдин.

Ответить

Номер ответа: 6
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #6 Добавлено: 25.12.06 12:08
Желаю всем удачи и настоятельно рекомендую ознакомиться с языком Free Basic, который может все, что может C++, а работает даже быстрее.

У мну глюки или я обоссалось? :)))))
Аффтар, ты ЖЖОШ!!

Ответить

Номер ответа: 7
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #7
Добавлено: 25.12.06 15:38
который может все, что может C++, а работает даже быстрее

Мммм, меня тоже заинтересовало :) А частичная специализация темплейтов в нем есть? Перегрузка операторов? Множественное наследование?
А быстрее он как - намного?

Ответить

Номер ответа: 8
Автор ответа:
 Сергей Юдин



Вопросов: 8
Ответов: 81
 Профиль | | #8 Добавлено: 28.12.06 08:26
А быстрее он как - намного?

Нет, практически одна скорость, но многое зависит от типа решаемой задачи. Простейший бенчмарк работает также как и С+ (визуал С+ работает медленнее), а типичная физическая задача решается медленнее в два раза, но, когда я использую программу написанную на VisualBasic6.0 с применением DLL, написанной на Free Basic, то время получается даже меньше (правда немного) чем у С+, но окончательные результаты и анализ будет в статье, которую закончу недели через 2. Статью вместе со всеми программами, в том числе на VB NET, TurboPascal выложу на домашней странице http://ser.t-k.ru. А что касается возможностей языка, то читайте Хэлп в IDE языка, т.к. я решал конкретную задачу и по этому досканально все не изучал.

С наилучшими пожеланиями Сергей Юдин.

Ответить

Номер ответа: 9
Автор ответа:
 LamerOnLine



ICQ: 334781088 

Вопросов: 108
Ответов: 2822
 Профиль | | #9 Добавлено: 28.12.06 11:18
Драйвер Hands.sys стоит? Без него у тебя и ассемблер будет работать медленнее басика...

Ответить

Номер ответа: 10
Автор ответа:
 Сергей Юдин



Вопросов: 8
Ответов: 81
 Профиль | | #10 Добавлено: 29.12.06 04:12
Драйвер Hands.sys стоит? Без него у тебя и ассемблер будет работать медленнее басика...


Во-первых такой драйвер у меня действительно не стоит (по крайней мере я не нашел его в windows/system32/drivers/?).
Во-вторых у меня вопрос. А почему он у меня должен стоять или не стоять, если я производил типовую установку WindowsXP. И если этот драйвер так нужен, то какую роль он выполняет и почему Микрософт его не включила в типовую установку. И еще вопрос почему без этого драйвера откомпилированные программы, написанные на Бэйсике, должны работать быстро, а написанные на других языках программирования медленнее.

С наилучшими пожеланиями Сергей Юдин.

Ответить

Номер ответа: 11
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #11 Добавлено: 29.12.06 05:34
угагагагааа LOL!!! зачет!!!

Ответить

Номер ответа: 12
Автор ответа:
 HACKER


 

Разработчик Offline Client

Вопросов: 236
Ответов: 8362
 Профиль | | #12 Добавлено: 29.12.06 05:43
Нет, майкрософт пытается его включить... в частности уже 3-ий фреймвёрк то вон какой! Всё ж направлено на то, чтобы драйвер ровные_руки.sys имел просто каждый... Но тут такая муть срабатывает, если оказывается что драйвер ровные_руки.sys от мелкомягких хуже чем самопальные версии отдельных монстов, или случай попадает на конкретную задачу, на начинается творчество на чистом .net, то тут ховайся, в лучшем случае получится медление, кривее, итп итд... в худшем, если монстрик начинающий, то на форумах появятся топики, например "А как самому, т.е. без встроенных классов"... и в большенстве случает вопрос этот, на столько элементарен, что топстартера посылают...в поиск :) Ну да ладно, это так, отступление от темы чуть-чуть...

Ответить

Номер ответа: 13
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #13
Добавлено: 29.12.06 14:33
LOL имел ввиду, что для программирования на каком-то языке следует его знать, иначе бенчмарк будет проводиться в настолько разных условиях, что даже ассемблер окажется медленнее, чем VBScript.

Ответить

Номер ответа: 14
Автор ответа:
 Сергей Юдин



Вопросов: 8
Ответов: 81
 Профиль | | #14 Добавлено: 29.12.06 17:07
LOL имел ввиду, что для программирования на каком-то языке следует его знать, иначе бенчмарк будет проводиться в настолько разных условиях, что даже ассемблер окажется медленнее, чем VBScript.


Я не знаю, что хотел сказать LOL, но получилось, что у меня программа SpuskSiM работает даже немного медленнее, чем SpuskVB6MVdll только по тому, что я не знаю языка С+ (хотя я встречал данные по простейшему бенчмаку, где язык С+ уступал FreeBasic даже в несколько раз). Вот если бы он сам написал программу SpuskVSiM (вариант SpuskSi на VisualC+ модернизированный под проведение тестов на время) то тогда бы не удалось медлительность VisualC+ списывать на мою безграмотность, а пришлось бы думать о том, как повысить быстродействие программ написанных на VisualC+, также, как сейчас я пытаюсь повысить быстродействие программ, написанных на VB6. И если возникнет такое желание, то я могу выложить программы SpuskSiM и SpuskVB6M до публикации статьи, чтобы программа SpuskVSiM получилась максимально эквивалентной по функциональным возможностям для проведения сравнительных испытаний.

С наилучшими пожеланиями Сергей Юдин.

Ответить

Номер ответа: 15
Автор ответа:
 Sharp


Лидер форума

ICQ: 216865379 

Вопросов: 106
Ответов: 9979
 Web-сайт: sharpc.livejournal.com
 Профиль | | #15
Добавлено: 29.12.06 18:09
Выкладывай

Ответить

Страница: 1 | 2 | 3 | 4 | 5 | 6 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам