Native DLL

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

Модератор: BV

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Native DLL

Сообщение A.A.Z. » 09.10.2004 (Сб) 18:57

Я, конечно, извиняюсь перед авторами, но решил сделать тему по объективным причинам: раньше этот вопрос очень часто обсуждался (как сделать обычный dll на vb), а теперь как-то затих. Так вот :)

daniel lo nigro, GSerg и tyomitch изобрели способ писать Native DLL на чистом VB (даже новый Link.exe на VB!). Скачать его можно, например, тут.

Запускаем приложение LinkReplacer, если все нормально, оно ничего не скажет.

Запускаем проект NativeDLL.vbp и топаем в modLibrary. Там внизу пишете свои функции / процедуры, а затем в процедуре Exporting пишете Exports "Будущий_Alias", AddressOf <имя функции>.

Компилируете проект, запускаете его и получаете готовый DLL.

Вот так вот! :)

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 09.10.2004 (Сб) 18:58

Ах, да! :)

1) Заценить
2) Высказаться

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

Сообщение GSerg » 09.10.2004 (Сб) 19:01

1. Заценил ещё тогда :)
2. Щас как поменяю всё нафиг! Путём беспринципного введения принципиально нового принципа общения с компилятором! :D
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 15.10.2004 (Пт) 18:22

Странный народ :roll:
Раньше каждую неделю такая тема появлялась, вот теперь умные люди сделали - так все молчат... :roll:

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

Сообщение pitbull » 23.10.2004 (Сб) 11:20

И не говори...
Я енту тулзу тогда тоже заценил - Классно!!!
Но в том обсуждении были ТАКИЕ умные слова использованы, что народ испугался и убежал.
Там даже скачиваний было очень мало!!!
---------------
Теперь по поводу самой Native DLL. Она не умеет работать со строковыми данными. Вернее пытается, но че-то слабо!

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 23.10.2004 (Сб) 17:52

А-а-а, точно, народ испугался умных слов - и как это я не догадался! Изображение :)

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

Сообщение pitbull » 23.10.2004 (Сб) 19:05

И подумать только!!! То, что все хотели, скачано всего(!!!) 14 раз! Очень интересно...

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 23.10.2004 (Сб) 20:38

Вот я о том же :)

Dr. Di0NiS
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 28.11.2004 (Вс) 11:40

Native DLL

Сообщение Dr. Di0NiS » 28.11.2004 (Вс) 11:47

Ребята зря Вы так плохо оценили свой труд, не качают потому что, ламоз и не знают что это такое, а я ручками пытаюсь уже две недели DLL собрать. С вашим линкером мой геморой разрешился! Огромное спасибо!
Принцип прост: сами кодим - сами юзим!

xolod
Гуру
Гуру
 
Сообщения: 1162
Зарегистрирован: 15.01.2004 (Чт) 0:42
Откуда: Moscow

Сообщение xolod » 28.11.2004 (Вс) 22:27

Dr. Di0NiS
Молодой человек, не надо думать, что тот, кто не качнул себе сие творения - человек, некомпетентный в данной области (ламоз по вашему определению).

Вариантов несколько, либо ему это просто не нужно, либо он выполняет это с помощью других средств (я, например DLL пишу в C)

Constant ERROR_SUCCESS deprecated. I'm so happy.
Программирование и дизайн – http://www.macrointellect.ru

Dr. Di0NiS
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 28.11.2004 (Вс) 11:40

Сообщение Dr. Di0NiS » 29.11.2004 (Пн) 2:28

xolod писал(а):Dr. Di0NiS
Молодой человек, не надо думать, что тот, кто не качнул себе сие творения - человек, некомпетентный в данной области (ламоз по вашему определению).

Вариантов несколько, либо ему это просто не нужно, либо он выполняет это с помощью других средств (я, например DLL пишу в C)


xolod, енто всё понятно, но речь о том, что сначала клянчили, а когда дали никому не нужно (в общем-то как оно всегда и бывает), а библиотеки на Сях я тоже собирать умею, вот только у меня был уже готовый проект на VB и куча плагинов, который я совсем не хотел перекладывать на Си, потому и мудрил с Native DLL (Не люблю я ActiveX, хоть убейте не люблю)
Принцип прост: сами кодим - сами юзим!

Dr. Di0NiS
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 28.11.2004 (Вс) 11:40

Инкапсуляция данных в DLL

Сообщение Dr. Di0NiS » 04.12.2004 (Сб) 19:20

Ребята есть вопрос: положим имеется Native DLL собранная вашим линкером, необходимо вписать данные в неё таким оразом, что бы экспортированная функция могла их прочитать из самой себя и выдать вызывающей программе, идея с дописыванием в конец dll-файла не подходит (библа используется для защиты программ), причём инкапсуляция должна работать после сборки готовой библиотеки, т.е. есть библа, сгенерили код привязки, а потом при необходимости импортировали функцию из библы и получили этот код... У кого есть идеи или готовый пример... поделитесь плиззз :D
Принцип прост: сами кодим - сами юзим!

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

Сообщение GSerg » 05.12.2004 (Вс) 5:03

Ничё не понял :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Dr. Di0NiS
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 28.11.2004 (Вс) 11:40

Сообщение Dr. Di0NiS » 05.12.2004 (Вс) 12:08

GSerg писал(а):Ничё не понял :)


Объясняю :D
Откомпилил либу (т.е. готовую DLL-ку) из неё экспортируется функция, например ReturnPassword, мне нужно вписать "нечто" (этот самый password) что бы при вызове функции ReturnPassword она возратила это "нечто". Можно конечно дописать в конец файла, но этот вариант уж больно нагляден (при декомпиляции его хорошо видно).
Принцип прост: сами кодим - сами юзим!

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

Сообщение GSerg » 05.12.2004 (Вс) 12:16

А чё, в тело функции этот пасворд нельзя записать до компиляции? :)

В общем, если обязательно после компиляции, то тогда тело функции пусть содержит единственную команду ReturnPassword = &hffffffff. И тогда по (адрес функции + 1) пиши искомое число :)

Но это же ломается ещё проще :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Dr. Di0NiS
Начинающий
Начинающий
 
Сообщения: 5
Зарегистрирован: 28.11.2004 (Вс) 11:40

Сообщение Dr. Di0NiS » 05.12.2004 (Вс) 21:17

Спасибо за идею, однако я тормоз (мог бы и сам догадаться) :D попробую, за одно подумаю как усложнить взлом этой беды :D
Принцип прост: сами кодим - сами юзим!

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 11.12.2004 (Сб) 19:13

Не могу "заценить" по причине непонимания мной следующей строки: AddressOf <Имя функции> вроде просит лонг, а оператора или процедуры AddressOf вроде нету. Объясните, что делать?
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

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

Сообщение tyomitch » 11.12.2004 (Сб) 19:37

AddressOf Operator

A unary operator that causes the address of the procedure it precedes to be passed to an API procedure that expects a function pointer at that position in the argument list.

Syntax

AddressOf procedurename

The required procedurename specifies the procedure whose address is to be passed. It must represent a procedure in a standard module module in the project in which the call is made.


Дальше цитировать, или сам МСДН откроешь и посмотришь? ;-)
Изображение

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 11.12.2004 (Сб) 19:40

Если б я знал английский, я бы на этом форуме на порядок меньше постил:(
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

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

Сообщение tyomitch » 11.12.2004 (Сб) 19:48

Ну ё-моё! http://world.altavista.com/ на что?
Оператор AddressOf

Унарный оператор причиняет адресу процедуры ее предшествует быть ым к процедуре по api надеется указатель функции на том положении в списке аргумента.

Синтаксис

Procedurename AddressOf

Необходимо procedurename определяет процедуру адрес должен быть ым. Оно должен представить процедуру в стандартном модуле модуля в проекте в позвонен.


Вариант от http://www.translate.ru/ :
Оператор AddressOf

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

Синтаксис

AddressOf procedurename

необходимый procedurename определяет процедуру, адрес которой нужно передать. Это должно представить процедуру в стандартном модуле модуля в проекте, в котором запрос сделан.
Изображение

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 11.12.2004 (Сб) 20:09

Я уже первел :oops: . У меня новый вопрос: че писать здесь?
Public Function DllMain(ByVal hInstDll As Long, ByVal fdwReason As Long, ByVal lpvReserved As Long) As Long
'TODO:
'Ïîìåñòèòå çäåñü êîä èíèöèàëèçàöèè áèáëèîòåêè.
Select Case fdwReason
Case DLL_PROCESS_ATTACH
'

DllMain = 1
Case DLL_PROCESS_DETACH
'

Case DLL_THREAD_ATTACH
'

Case DLL_THREAD_DETACH
'

End Select
End Function

И 2ой вопрос при запуске LinkerReplacer ничего не происходит.Это нормально?(WinXP)

3ий после компиляции и запуска выдает примерно следующее:
Исполняемый файл не может быть установлен. Такая ДЛЛ бесполезна. Убедитесьь .что у вас установлен ПсевдоЛинкер, и перекомпилируйте проект.
Подскажите или ткните меня носом в инфу про строение ДЛЛ.

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 11.12.2004 (Сб) 20:10

Короче, пишешь не AddressOf(имя_функции), а AddressOf имя_функции :)
Если твоя функция, например, "Calculate", то строка будет выглядеть так:
Код: Выделить всё
Exports "Calculate", AddressOf Calculate

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 11.12.2004 (Сб) 20:12

Вот для чего мне это надо:
http://soaron.fromru.com/vkhints.htm
Все эти "штуки" делаются?
Алкоголь и сканеры-ваши враги! Не верите-смотрите аватару :-)

A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 11.12.2004 (Сб) 20:12

1) Здесь можно ничего не писать
2) Да, он просто заменяет файл.
3) :shock: Ты точно все правильно сделал? :roll: Кинь проект, может, где-то ошибка закралась... :roll:

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 11.12.2004 (Сб) 20:16

Вот, что я делал:
Код: Выделить всё
Private Const DLL_PROCESS_ATTACH As Long = 1
Private Const DLL_PROCESS_DETACH As Long = 0
Private Const DLL_THREAD_ATTACH As Long = 2
Private Const DLL_THREAD_DETACH As Long = 3


Public Function DllMain(ByVal hInstDll As Long, ByVal fdwReason As Long, ByVal lpvReserved As Long) As Long
  'TODO:
  'Поместите здесь код инициализации библиотеки.
  Select Case fdwReason
  Case DLL_PROCESS_ATTACH
    '
   
    DllMain = 1
  Case DLL_PROCESS_DETACH
    '
   
  Case DLL_THREAD_ATTACH
    '
   
  Case DLL_THREAD_DETACH
    '
   
  End Select
End Function


Public Sub Exporting()
  'TODO:
  'Поместите тут Exports для каждой функции, которую нужно экспортировать.
  'Exports "Будущий_Alias", AddressOf <Имя функции>.
  Exports "dllka", AddressOf Кружок
  Base &H60000000    'Базу можно указать вручную, а можно не указывать.
 
End Sub
Public Sub Кружок()
'тут процедуры
End Sub


A.A.Z.
Член-корреспондент академии VBStreets
Член-корреспондент академии VBStreets
 
Сообщения: 3035
Зарегистрирован: 30.06.2003 (Пн) 13:38

Сообщение A.A.Z. » 11.12.2004 (Сб) 20:19

Вставил твой код, откомпилировал, запустил - получил DLL, продекларировал процедуру - All OK, никаких ошибок :roll:

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 11.12.2004 (Сб) 20:23

Все убрал, откомпилировал, запустил, таже ошибка:(
Что это может быть? Уже и преименовал по англиски и все опреаторы убрал, мож перезагрузиться? Ща попробую :)

Matew
Постоялец
Постоялец
Аватара пользователя
 
Сообщения: 894
Зарегистрирован: 28.06.2004 (Пн) 17:44
Откуда: Дальний Восток, г. Ха

Сообщение Matew » 11.12.2004 (Сб) 20:35

Вот ошибка:
У вас нет доступа для просмотра вложений в этом сообщении.

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

Сообщение tyomitch » 11.12.2004 (Сб) 20:52

Matew, добавь в "свойствах системы -> дополнительно -> переменные среды" переменную LINK со значением "/FIXED:NO" и не мучайся ;-)
Изображение

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

Сообщение tyomitch » 11.12.2004 (Сб) 20:54

Matew писал(а):Вот для чего мне это надо:
http://soaron.fromru.com/vkhints.htm
Все эти "штуки" делаются?

Я не понял, а зачем там Native DLL? Обычной ActiveX DLL же вроде достаточно?
Изображение

След.

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

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

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

    TopList