Native DLL

Обсуждение проектов наших жителей.
Вы можете выставить проект на тест или найти помощников для его реализации.

Модератор: BV

pitbull
Постоялец
Постоялец
 
Сообщения: 314
Зарегистрирован: 25.06.2004 (Пт) 15:37
Откуда: Кемерово

Сообщение pitbull » 25.10.2005 (Вт) 14:40

tyomitch, что-то я тупенький какой-то стал :(
Объясни поподробнее, в каком виде и как передавать/принимать строковые значения в NativeDLL.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 25.10.2005 (Вт) 16:58

Принимать как ByVal As Long и для получения из них строки вызывать SysAllocString
Передавать как ByVal StrPtr(stroka)
Изображение

pitbull
Постоялец
Постоялец
 
Сообщения: 314
Зарегистрирован: 25.06.2004 (Пт) 15:37
Откуда: Кемерово

Сообщение pitbull » 25.10.2005 (Вт) 17:03

Пасиба, сразу все понятна стало :)

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 25.10.2005 (Вт) 19:11

А на мои вопросы тишина... и мертвые с косами стоят!

pitbull
Постоялец
Постоялец
 
Сообщения: 314
Зарегистрирован: 25.06.2004 (Пт) 15:37
Откуда: Кемерово

Сообщение pitbull » 25.10.2005 (Вт) 19:31

A.A.Z. Дык вот, NativeDll которая на http://dansoftaus.r8.org/ почему-то не хочет компилить....

Вроде бы все установил, выбрал процедуры для экспорта, нажимаю компилить, создается текстовый файл и все. Убираю все галки в экспорте, нажимаю компилить и создается пустая Dll (без ф-ций).

Может кто пояснит?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 25.10.2005 (Вт) 22:13

pitbull писал(а):NativeDll которая на http://dansoftaus.r8.org/ почему-то не хочет компилить....

Это не наша.

Mikle писал(а):А на мои вопросы тишина...

Дык это... Не знаем мы...

Для меня это был чисто академический интерес - можно ли, и если можно, то как. С форматом PE, опять же, разобраться... Ни для чего серьёзного я это дело не использую, для библиотек дельфи есть и C++.
А грабли наверняка будут, до тех пор, пока мы не поймём, как корректно внедрить инициализацию виртуальной машины в DLLMain...
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

pitbull
Постоялец
Постоялец
 
Сообщения: 314
Зарегистрирован: 25.06.2004 (Пт) 15:37
Откуда: Кемерово

Сообщение pitbull » 26.10.2005 (Ср) 7:40

GSerg
Дык я знаю, что не ваша, ваша та работает.....
Вашу я еще один из первых скачал :)
Я хотел ту проверить, мож её тоже кто проверял... :)

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 26.10.2005 (Ср) 10:01

GSerg
Понял. :)
Но вещь все равно полезная, даже только для VB. Например я сделал в DLL функцию, которая просто возвращает свой аргумент типа Long, а декларирую ее как Single - в результате получил очень быструю FtoDW. Без DLL мне бейсик таких вольностей не позволял.

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 26.10.2005 (Ср) 12:39

Mikle писал(а):GSerg
Понял. :)
Но вещь все равно полезная, даже только для VB. Например я сделал в DLL функцию, которая просто возвращает свой аргумент типа Long, а декларирую ее как Single - в результате получил очень быструю FtoDW. Без DLL мне бейсик таких вольностей не позволял.

:roll: :roll:
Такая функция в msvbvm уже есть. Называется VarPtr.
Объявишь её как Single - получится то же самое что у тебя, только без левых библиотек и ещё быстрее.
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 26.10.2005 (Ср) 13:43

Ага :)
На всякий случай :)

Код: Выделить всё
Option Explicit

Private Declare Function FtoDW Lib "msvbvm60" Alias "VarPtr" (ByVal f As Single) As Long

Private Sub Form_Load()
  Dim d As Long
 
  d = FtoDW(5.5)
  MsgBox d
End Sub



Если нужна скорость, и если нужно избежать затрат на вызов функции бейсиковским способом, можно сделать tlb с маппигом VarPtr. Тогда её вызов будет компилироваться в одну ассемблерную команду.


И вообще, почему, в конце концов, d3drm не сделает себе tlb девятки? С C++ ведь мучается :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Amed
Алфизик
Алфизик
 
Сообщения: 5346
Зарегистрирован: 09.03.2003 (Вс) 9:26

Сообщение Amed » 26.10.2005 (Ср) 13:58

Тс-с! :)
Он не боится трудностей и не ищет лёгких путей.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 26.10.2005 (Ср) 19:07

Amed

и не ищет лёгких путей.

Последний комсомолец!
tyomitch
GSerg
Спасибо! Не знал, что VarPtr можно декларировать. :roll:

fr207
Начинающий
Начинающий
 
Сообщения: 1
Зарегистрирован: 12.07.2006 (Ср) 11:34

А как его скачать?

Сообщение fr207 » 12.07.2006 (Ср) 11:40

я зарегистрировался, а не дает

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 12.07.2006 (Ср) 12:51

fr207
В первом посте есть ссылка под словом "тут". Только что проверял - работает.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 12.07.2006 (Ср) 13:41

Наверное, то, что я сейчас пишу, не совсем в тему, раз топик подняли...
Создаваемые таким образом DLL не Native. Это обычные не ActiveX DLL.
Native DLL можно получить передав link.exe /SUBSYSTEM:NATIVE. Такие DLL(не использующие подсистемы) загрузятся, скорее всего, только в режиме ядра
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.07.2006 (Ср) 13:44

Слово Native DLL имеет несколько значений, в том числе оба из указанных.

DLL без подсистемы загрузятся безо всяких проблем. Указание подсистемы задаёт лишь объём выполняемой Виндой перед запуском инициализации.

ntdll -- DLL без подсистемы, и она прекрасно используется в прогах на VB ;-)
Изображение

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 08.08.2006 (Вт) 11:21

Эти DLL не работают с другими средами разработки, пробовал вызывать их из PowerBASIC и С - бесполезно. А значит ф топку весь этот проект..

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 08.08.2006 (Вт) 11:28

Они предназначаются для использования в VB.
Изображение

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 08.08.2006 (Вт) 11:35

Они предназначаются для использования в VB.


Уж лучше тогда писать Native DLL на PowerBASIC, тогда их можно юзать из любой среды разработки и работают они быстрее чем вэбэшные

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 08.08.2006 (Вт) 12:21

Сказано же-из академического интереса. Реально их никто не использует.
Изображение

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 08.08.2006 (Вт) 15:31

keks-n
Ну не совсем из академического. Иногда проект нельзя компилировать со всеми оптимизациями, а быстродействие терять не хочется, можно вынести в DLL самую тупую, но требовательную к быстродействию часть, а проект компилировать хоть в P-code. При декларации DLL мы не обязаны соблюдать дисциплину типов, что тоже бывает удобно.
jangle
и работают они быстрее чем вэбэшные

Ты проверял?

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 10.08.2006 (Чт) 12:37

DLL на PB работают шустрее далеко не всегда... Например, я написал хитрый поиск по подстроке с доп. условиями... Задействовал инлайн асму... А потом Хакер написал аналогичный код на VB, который в половине случаев работал быстрее.
Изображение

jangle
Википедик
Википедик
Аватара пользователя
 
Сообщения: 3013
Зарегистрирован: 03.06.2005 (Пт) 12:02
Откуда: Нидерланды

Сообщение jangle » 10.08.2006 (Чт) 13:50

Mikle - да это проверяно вдоль и поперек кучей юзеров, в среднем VB проигрывает PowerBasic`у от 30% до 200% в быстродействии.


DLL на PB работают шустрее далеко не всегда... Например, я написал хитрый поиск по подстроке с доп. условиями... Задействовал инлайн асму... А потом Хакер написал аналогичный код на VB, который в половине случаев работал быстрее


Может он алгоритм другой использовал?

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 10.08.2006 (Чт) 14:09

ХЗ, какой там алоритм... Но в теории это должно работать тормознее, а на практике не получаетца...

Попробую, на досуге, читать не mov al, [edi], а mov ax, WORD PTR[edi], и соответственно сравнивать al и ah
Изображение

yaklit
Продвинутый пользователь
Продвинутый пользователь
 
Сообщения: 129
Зарегистрирован: 09.09.2006 (Сб) 19:38

Сообщение yaklit » 09.09.2006 (Сб) 19:44

хм тема старая НО полездная я давно искал.

Mikle
Изобретатель велосипедов
Изобретатель велосипедов
Аватара пользователя
 
Сообщения: 4147
Зарегистрирован: 25.03.2003 (Вт) 14:02
Откуда: Туапсе

Сообщение Mikle » 10.09.2006 (Вс) 10:03

Давайте тут не оффтопить, в холиварах есть тема про быстродействие, можно продолжить там:
http://bbs.vbstreets.ru/viewtopic.php?t=26344

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 19.09.2007 (Ср) 17:08

Не удержался, чтобы не понтануться. DLL, написанная на VB, хитрым образом слинкованная(плагином, который я сейчас пишу, бажный пока) без каких-либо модификаций VB-шного исходника. Работает не только из VB, но и из C++, нормально работает рантайм.

Приложена dll+батничек, вызывающий её через rundll32
http://share.fire-lines.ru/keks-n/ndll.rar
Изображение

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 20.09.2007 (Чт) 8:57

Расскажи, как именно ты его линкуешь :?:
Изображение

Хакер
Телепат
Телепат
Аватара пользователя
 
Сообщения: 16473
Зарегистрирован: 13.11.2005 (Вс) 2:43
Откуда: Казахстан, Петропавловск

Сообщение Хакер » 20.09.2007 (Чт) 13:22

Блин, я проиграл :cry:
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

keks-n
Доктор VB наук
Доктор VB наук
Аватара пользователя
 
Сообщения: 2509
Зарегистрирован: 19.09.2005 (Пн) 17:17
Откуда: г. Москва

Сообщение keks-n » 20.09.2007 (Чт) 17:12

tyomitch
Линкую с /DEF: и дополнительным объектником(он эмулирует "обычную" загрузку DLL). Кстати, под вистой не пашет, в связи с чем буду колдовать над директивой IMPORTS в .DEF - мне таки нужна GetProcAddress.
Add:
Адреса API-функций в инициализаторе получаются не вполне законными методами - база kernel32.dll ищется через цепочку SEH, как следствие не работает под вистой. Это сделано из-за того, что линкер не переварил указание дополнительно kernel32.lib - просто всё похерилось, а GetProcAddress жизненно необходим.
Внимание, вопрос - как ещё можно импортировать GetProcAddress, кроме как через .lib?
Изображение

Пред.След.

Вернуться в Наши проекты

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 18

    TopList