[FireNativeDLL] Создание полноценных DLL на Visual Basic

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

Модератор: BV

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1598
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: [FireNativeDLL] Создание полноценных DLL на Visual Basic

Сообщение arthur2 » 25.02.2014 (Вт) 4:44

TimVTimV писал(а):а вот вызвать форму из полученной длл нельзя!
Это почему это?
TimVTimV писал(а):Смысл всей этой поделки в чём?
Если руки кривые, то ни в чем.
Артур
 
   

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 25.02.2014 (Вт) 11:36

arthur2 писал(а):Это почему это?

Есть подозрение, что поэтому. Но вообще, я тут реакцию Хакера на это утверждение ждал, а он что-то молчит...

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1598
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: [FireNativeDLL] Создание полноценных DLL на Visual Basic

Сообщение arthur2 » 25.02.2014 (Вт) 17:42

Когда человек в ПЕРВОМ же своем сообщении на форуме, вместо того, чтобы спросить, как делать то, что у него не получилось, с каким-то непонятным апломбом заявляет, что это не возможно, причем, в таких пренебрежительны выражениях - это вызывает лёгкое недоумение.

Создать и показать экземпляр формы можно на раз. "Сложность", возникающая при этом, вообще никак не связана с "этой бессмысленной поделкой". То же самое, что в main обычного экзешника с помощью АПИ создать окно, а потом удивляться, что это окно тут же закрылось.

Если показывать экземпляр формы модально - никаких сложностей вообще нет. Если же показать немодально - код процедуры после показа формы сразу же продолжится, и, собственно, завершится. После чего, я так полагаю, библиотека выгрузится, выгрузив вместе с собой и все показанные формы. Значит, чтобы форма не выгрузилась, при её показе нужно просто запустить бесконечный цикл, а при закрытии цикл прерывать. Всё.
Артур
 
   

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 25.02.2014 (Вт) 17:54

arthur2 писал(а):Значит, чтобы форма не выгрузилась, при её показе нужно просто запустить бесконечный цикл, а при закрытии цикл прерывать. Всё.

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

The trick
Постоялец
Постоялец
 
Сообщения: 520
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: [FireNativeDLL] Создание полноценных DLL на Visual Basic

Сообщение The trick » 25.02.2014 (Вт) 19:22

Если в потоке, в котором вызывается форма, есть процедура обработки сообщений, то все должно работать. Я делал DLL на VB6 (с пропиской ключей в файле проекта, спасибо Хакеру), только окна на Api создавал, все прекрасно работало.
библиотека выгрузится
Отчего?
UA6527P

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1598
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: [FireNativeDLL] Создание полноценных DLL на Visual Basic

Сообщение arthur2 » 25.02.2014 (Вт) 20:03

Qwertiy писал(а):Это очень подозрительный метод.
Это стандартный метод. Просто нужен не бессмысленный цикл, а GetMessage->(TranslateMessage)->DispatchMessage. Это же самое происходит и в экзешнике при показе экземпляра формы, просто остается за кулисами. А здесь за нас никто цикл обработки сообщений не запустит - нужно запускать самим.
Qwertiy писал(а):Вероятно, за жизнь формы в таком случае должо отвечать вызывающее приложение, нет?
И чем вообще вечный цикл лучше модального показа?
Мы вообще не можем вернуться в вызывающее приложение, если форма ещё жива, хоть модальная, хоть не модальная. Чем лучше? Да ни чем не лучше. А отличаться будет только тем, что форма не будет блокировать другие окна в программе.


Кривоус Анатолий писал(а):Если в потоке, в котором вызывается форма, есть процедура обработки сообщений
Вот и я о нем же - о цикле обработки сообщений. В потоке-то он есть, а вот в вызываемой библиотеке он откуда возьмется, если его самому не написать?

Кривоус Анатолий писал(а):Отчего?
Оттого, что код процедуры, в которой показывается форма, закончился.

Код: Выделить всё
public sub test()
form1.show
'и стразу же:
end sub
После чего мы возвращаемся в вызывающую программу.
Артур
 
   

Qwertiy
Доктор VB наук
Доктор VB наук
 
Сообщения: 2751
Зарегистрирован: 26.06.2011 (Вс) 21:26

Сообщение Qwertiy » 25.02.2014 (Вт) 21:21

arthur2 писал(а):Мы вообще не можем вернуться в вызывающее приложение, если форма ещё жива, хоть модальная, хоть не модальная. Чем лучше? Да ни чем не лучше. А отличаться будет только тем, что форма не будет блокировать другие окна в программе.

Что-то тут не так... Мы вызвали показ формы, но её ведь не ожидаем, значит она самостоятельна. Выполнение возвращается в вызывающую программу немедленно и если она жива, то жива и форма. Почему надо что-то ждать?
Проверять сейчас нет времени.

The trick
Постоялец
Постоялец
 
Сообщения: 520
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: [FireNativeDLL] Создание полноценных DLL на Visual Basic

Сообщение The trick » 25.02.2014 (Вт) 21:58

После чего мы возвращаемся в вызывающую программу.
Ну это понятно, но библиотека не выгружается после этого.
В потоке-то он есть, а вот в вызываемой библиотеке он откуда возьмется, если его самому не написать?
Что-то я тебя не пойму. Для каждого потока - своя очередь сообщений. Если экспортируемая функция вызывается из потока в котором есть цикл обработки сообщений, то, если окно внутри функции создается в этом же потоке, то DispatchMessage из вызывающего отправит нужные сообщения этому окну, и все должно работать.
UA6527P

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1598
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: [FireNativeDLL] Создание полноценных DLL на Visual Basic

Сообщение arthur2 » 25.02.2014 (Вт) 22:14

Qwertiy писал(а):Что-то тут не так...
Ну так я и не претендую на то, что всё именно так :) Дождемся Хакера :)
Артур
 
   

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1598
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: [FireNativeDLL] Создание полноценных DLL на Visual Basic

Сообщение arthur2 » 25.02.2014 (Вт) 22:35

Кривоус Анатолий писал(а):Ну это понятно, но библиотека не выгружается после этого.
Я и не сказал, что выгружается. Я сказал, "я так полагаю" :) Собственно, сейчас проверил - немодальная форма вполне показывается вообще без ухищрений.
Артур
 
   

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

Re: [FireNativeDLL] Создание полноценных DLL на Visual Basic

Сообщение Хакер » 26.02.2014 (Ср) 4:11

Qwertiy писал(а):Но вообще, я тут реакцию Хакера на это утверждение ждал, а он что-то молчит...

Хакер лежал еле-живой всё это время: всё читал, но ответить не мог. Теперь может. Поехали!

arthur2 писал(а):Это стандартный метод. Просто нужен не бессмысленный цикл, а GetMessage->(TranslateMessage)->DispatchMessage. Это же самое происходит и в экзешнике при показе экземпляра формы, просто остается за кулисами. А здесь за нас никто цикл обработки сообщений не запустит - нужно запускать самим.


Неправильно! Тот цикл, который «происходит в экзешнике» — его более чем достаточно. В существовании ещё одного цикла нет никакого особого смысла. Нет, ну правда, оба цикла берут сообщения из одной и той же очереди, и оба отправляют его в одну и ту же оконную процедуру, принадлежащую рантайму VB.

В твоём решении с циклом становится непонятно, когда такой вторичный цикл должен завершиться? Если при закрытии окна, то значит возврат к вызывающей стороне произойдёт только после закрытия окна. Что вряд ли является тем, что хочет рядовой писатель вызывающей стороны. Так что нет.

_________

Что касается того, что экземпляр исчезает сразу после возврата. Во-первых — мне бы пример, который можно было поотлаживать. Но я не знаю, есть ли у кого ещё такая проблема, а TimVTimV будет забанен (за оскорбления в ЛС).

Во-вторых, было две сильно отличающихся версии FNDLL. В обеих были проблемы:
  • В более ранней объект, который создавался для того, чтобы удерживать контекст инициализированным, создавался, но вообще не уничтожался. Таким образом, такие библиотеки создавали медленную утечку памяти.
  • В более поздней утечка была устранена, однако контекст не оставался инициализированным на всё время жизни DLL в рамках АП процесса, а поэтому всё последующая работа кода DLL фактически основывалась на мусоре, оставшемся в памяти от процесса ранее проведённой инициализации.

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

__________

Вообще, во внутренностях VB есть большой и весьма сложный механизм, задача которого — следить за временем жизни всего. Экземпляры открытых форм, строки/ссылки/массивы в глобальных/статических переменных и т.д. Есть определённые правила игры, есть объекты, существование которых поддерживает контекст живым, а есть объекты, жизнь которых наоборот подчиняется времени жизни контекста. Правила немного меняются при разных типах проектов. Поэтому все проблемы в стиле «что-то уничтожается раньше времени» растут отсюда и решаться должны не какими-то полугрязными трюками, а попыткой подружиться с этим механизмом.

__________


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

Я бы мог дать людям сто-процентов-стабильный вариант FNDLL, но проблема здесь заключается в том, что по правилам VB не должно быть ничего вечно-живущего. Всё должно иметь начало и конец, или другими словами — время жизни со строго декларироваными правилами определения.

Сейчас я знаю о внутренностях VB существенно больше, чем знал 7 лет назад, когда сделал этот проект, потому что провёл много времени над реверс-инженирингом. Так вот могу ответственно сказать: основной проблемой в этом деле является вовсе не инициализация рантайма. Основной проблемой является инициализация контекста.

Контекстом я называю ячейку матрицы, строки в которой образованы загруженными в АП процесса VB-проектами (любых типов), а столбцы — работающими в данный момент потоками. Таким образом, «инициализировать контекст» значит инициализировать конкретно взятый проект для конкретно взятого потока. Только в этом случае произвольный код данного VB-проекта будет без сбоев работать в нужном потоке.

Это задача в одинаковой степени актуальна для реализации многопоточности и NativeDLL.

Так вот, сложность состоит в следующем: если мы говорим о нормальной работе NativeDLL, то в какой момент должна происходить инициализация и деинициализация контекста?

У Standard EXE правила простые: инициализация контекста происходит при стартпе программы, деинициализация — при завершении.
У ActiveX DLL и ActiveX Control время жизни контекста — это математическое пересечение времён жизни внешних объектов. Иными словами, контекст инициализируется при создании первого объекта снаружи и умирает при смерти последнего из таких объектов.

Как быть с NativeDLL?

Итак, я мог бы дать людям стабильную NativeDLL, но она обязаны была бы иметь точки входа в стиле: InitializeLib и UninitializeLibrary, которые пользователь такой DLL должен был бы сам вызывать и гарантировать, что вызовы всех остальных экспортируемых функций происходят в промежутки времени между вызовами этих двух специальных фукнций.

Проблема в том, что при таком подходе во всём этом остаётся мало смысла. Потому что основное предназначение FNDLL — это делать DLL для чего-то другого, например плагины к другим продуктам, а там протокол взаимодействия хоста с плагином уже задекларирован и неизаменен: хост не будет вызывать ваши InitMyDll и DeInitMyDll — он ничего не знает о них.

В случаях же, когда вы сами делаете хост, я призываю использовать именно ActiveX DLL вместо Native DLL, как технологию, устраняющую все эти проблемы и гарантирующую большие бонусы (такие как гарантия совместимости между вызывающей и вызываемой стороной, чего совершенно не обеспечивается при вызове обычных функций из DLL).

Так что проблема лежит не в технической, а в идеологической плоскости.

(Хотя конечно есть вариант инициализацию контекста привязать к первому вызову любой их экспортируемых функций, а деинициализацию вообще не делать никогда, но это плохо подходит для очень многих случаев типичного использования DLL-библиотек)
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

arthur2
Продвинутый гуру
Продвинутый гуру
Аватара пользователя
 
Сообщения: 1598
Зарегистрирован: 23.01.2008 (Ср) 14:35

Re: [FireNativeDLL] Создание полноценных DLL на Visual Basic

Сообщение arthur2 » 26.02.2014 (Ср) 5:18

Ну, я повёлся на то, что проблема есть, а её оказалось просто нет. Собственно, если у кого-то проблема всё-же наблюдается и экземпляр формы создается, но сразу выгружается - это ведь значит то, что я предположил? что библиотека-таки выгружается, выгрузив за собой попутно все свои существующие экземпляры классов?
Хакер писал(а):В твоём решении с циклом становится непонятно, когда такой вторичный цикл должен завершиться? Если при закрытии окна, то значит возврат к вызывающей стороне произойдёт только после закрытия окна. Что вряд ли является тем, что хочет рядовой писатель вызывающей стороны. Так что нет.
Ну да, возврат в вызывающую программу произойдет только после того, как окно закроется. Но это, по-моему, нормально и вполне логично, так и планировалось. Собственно, ведь показ модального окна в бейсике этим способом организован? или нет? Говорю же, отличие от модальной формы будет только в том, что останутся доступны другие окна программы.

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

Раз ты снова в строю, глянь ещё эти два вопроса:
viewtopic.php?f=9&t=43618&p=6772007#p6772007
viewtopic.php?f=1&t=43928&p=6771997#p6771997
Артур
 
   

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

Re: [FireNativeDLL] Создание полноценных DLL на Visual Basic

Сообщение Хакер » 26.02.2014 (Ср) 5:33

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

Нет.

Вообще, нужно смотреть. Формулировка несколько кривая. Не выгрузка DLL вызывает закрытие экземпляра. А деятельность менеджера компонентов вызывает уничтожение экземпляров форм и деинициализацию контекста. DLL физически из АП процесса вряд ли выгружается.

arthur2 писал(а):Но это, по-моему, нормально и вполне логично, так и планировалось.

Нет.

arthur2 писал(а):Собственно, ведь показ модального окна в бейсике этим способом организован? или нет?

Так, но модальное окно при показе блокирует «подложку», и это правильно и хорошо — собственно в таком виде второй блокирующий цикл хорош.

В твоём способе блокирующий цикл есть, а подложка не блокируется. Это плохо. Это значит, что можно «наверху» сделать какое-то действие, которое вызовет какое-то событие, обработчик которого будет вызван уже из твоего цикла. Это событие может запустить, например, ещё один такой цикл. Допустим, первое окно будет закрыто, но возврат в самое начало уже не произойдёт.

Это своего рода неконтролируемая рекурсия (любишь ты их, вспомни наш большой разговор о КРБ).



Представь себе очень простой случай. MDI-приложение, дочерние окна создаёт DLL. MDI-приложение хочет сразу показать 6 дочерних окон. Для этого она должна 6 раз вызвать функцию из DLL. У тебя всё это дело застрянет на первом же окне.


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

Совершенно неправильно. Я уже наверху писал: надо не подобные грязные методы использовать, а дружиться с менеджером компонентов.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

FelixMacintosh
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 05.01.2014 (Вс) 23:17

Re: [FireNativeDLL] Создание полноценных DLL на Visual Basic

Сообщение FelixMacintosh » 25.05.2014 (Вс) 21:43

я тут сделал свой SFX
исходники зимой ещё скачивал, но особо не смотрел
а когда понадобилось, и я обратился к ссылкам они
к сожалению оказались затёртыми, так вот...
уважаемый Хакер можно ли я буду использовать свой SFX
естественно ссылаясь на ваше авторство ? ...

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

вот текст внутри шаблона...
Код: Выделить всё
Option Explicit
'
'Необходимые элементы и информация взяты из этого сайта
'http://bbs.vbstreets.ru/viewtopic.php?f=15&t=34902&start=0&sid=87e484977a0dfc6f7acc19c4b03a668b
'Правообладателем и автором болшей части текста является администратор этого сайта под ником
'© Хакер (Конференция VBStreets)
'и моя скромная модификация
'© FelixMacintosh (CiberForum.ru) ,2014
'
'Точка входа в библиотеку.
'
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 DllEntryPoint(ByVal.............
У вас нет доступа для просмотра вложений в этом сообщении.

FelixMacintosh
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 05.01.2014 (Вс) 23:17

Re: [FireNativeDLL] Создание полноценных DLL на Visual Basic

Сообщение FelixMacintosh » 26.05.2014 (Пн) 20:50

Вообщето, я даже сделал еще лучше
теперь после установки запустится группа, по относительному пути

а можете ли вы подкинуть обновленные fndll_modifer или LINK ?
У вас нет доступа для просмотра вложений в этом сообщении.

FelixMacintosh
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 05.01.2014 (Вс) 23:17

Re: [FireNativeDLL] Создание полноценных DLL на Visual Basic

Сообщение FelixMacintosh » 26.05.2014 (Пн) 20:53

и заблокировал архив, от изменений

FelixMacintosh
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 05.01.2014 (Вс) 23:17

Re: [FireNativeDLL] Создание полноценных DLL на Visual Basic

Сообщение FelixMacintosh » 26.05.2014 (Пн) 21:20

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

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

Re: [FireNativeDLL] Создание полноценных DLL на Visual Basic

Сообщение Хакер » 27.05.2014 (Вт) 7:30

FelixMacintosh

Мир устроен так. Человек, который создал что-то новое, признаётся автором этого творения и обладает неким набором прав на созданное произведение. Эти права являются неотчуждаемыми — нельзя лишить человека авторских прав (даже при согласии самого автора). Одной из прерогатив автора является возможность распоряжаться тем, как другие люди могут поступать с его произведением. В мире ПО это выражается тем, что автор публикует лицензию на свой продукт: документ, в котором прописывает условия и положения, которые обязаны соблюдать пользователи продукта. В лицензии автор может разрешить делать всё что угодно с продуктом, или напротив, запретить очень многие потенциально возможные вещи. За нарушение условий лицензии и нарушение авторских прав может последовать уголовная ответственность.

Теперь я хочу напомнить, что оригинальный SFX-инсталлятор FNDLL был снабжён текстом с лицензией. В нём есть два запрета, которые у тебя хватает наглости нарушить.

Ты не имеешь права делать свой SFX-инсталлятор для FNDLL.
В лицензии явно описан запрет на модификацию FNDLL, а это в точности то, что ты делаешь.

Теоретически, я готов обсуждать возможность сотрудничества с кем-либо, кто хочет принести полезное улучшение в FNDLL. Об этом можно договориться.

Но мне точно не о чем говорить с человеком, поведение которого настолько уныло и бездарно, что он даже не может правильно написать адрес киберфорума, который хочет попиарить.
Я никогда не соглашусь и не допущу, чтобы в состав FNDLL был включен кусок кода, написанный человеком, которые без грамматических ошибок не может обойтись. У которого не возникает понимания, что крайне глупо включать форумный SID в URL, который помещается в шапку в коде.

Более того, мне не о чем говорить с человеком, который настолько бессовестный, что позволяет себе писать подобное:
felix_macintosh_bullshit.png


И лицензионное соглашение вырезать из инсталлятора ты не имеешь права.

И ни в каких скромных модификациях с твоей стороны FNDLL не нуждается: группа проектов абсолютно не нужна для создания DLL и модификацияя, при которой для каждой новой DLL у пользователя будет в IDE создаваться целая группа, это модификация ухудшающая продукт, потому что это образец плохого дизайна.
У вас нет доступа для просмотра вложений в этом сообщении.
—We separate their smiling faces from the rest of their body, Captain.
—That's right! We decapitate them.

FelixMacintosh
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 05.01.2014 (Вс) 23:17

Re: [FireNativeDLL] Создание полноценных DLL на Visual Basic

Сообщение FelixMacintosh » 29.05.2014 (Чт) 3:50

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

[Хакер] Поток бессвязных сообщений удалён.

The trick
Постоялец
Постоялец
 
Сообщения: 520
Зарегистрирован: 26.06.2010 (Сб) 23:08

Re: [FireNativeDLL] Создание полноценных DLL на Visual Basic

Сообщение The trick » 29.05.2014 (Чт) 7:47

FelixMacintosh писал(а):да ерунда это всё, это вообще была личная переписка, которую вы выложили на картинке

Не надо врать, это было обсуждение в теме, потом я просто удалил это из-за оффтопа. Я могу восстановить это и кинуть ссылку.
FelixMacintosh писал(а):я там еще одно приложение выложил

Конечно, скопипастил отсюда и приписал свои копирайты также без упоминания оригинального источника. Хотя на сайте явно написано
Содержимое сайта является интеллектуальной собственностью. Материалы сайта не подлежат распространению без согласования с авторами. (с) "Первые шаги", 1999-2012
Последний раз редактировалось The trick 29.05.2014 (Чт) 8:44, всего редактировалось 1 раз.
UA6527P

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

Re: [FireNativeDLL] Создание полноценных DLL на Visual Basic

Сообщение Mikle » 29.05.2014 (Чт) 8:42

FelixMacintosh писал(а):Сейчас меня забанили, на том форуме

Если будешь писать поток сознания, плодя кучи сообщений и не пользуясь кнопкой "Правка" - забанят и тут.

FelixMacintosh
Начинающий
Начинающий
 
Сообщения: 12
Зарегистрирован: 05.01.2014 (Вс) 23:17

Re: [FireNativeDLL] Создание полноценных DLL на Visual Basic

Сообщение FelixMacintosh » 17.06.2014 (Вт) 5:52

да забанивайте, мне без разницы
всёравно сюда почти никто не заходит,
одни и те же люди, друг другу лайки ставят

вот что удалось сделать...
Код: Выделить всё
Option Explicit
'
'   © Антихакер32™ Нативная DLL создаваемая по необходимости +Стильная иконка
'   И пример использования модуля SubClass
'   P.S Ничего устанавливать не нужно, требуется пустая форма
'
Const HTCAPTION = 2
Const WM_MOVE = &H3
Const WM_SIZE = &H5
Const WM_LBUTTONDOWN = &H201
Const WM_NCLBUTTONDOWN = &HA1
Dim WithEvents tx1 As TextBox
Dim WithEvents cm1 As CommandButton
Dim WithEvents cm2 As CommandButton

Private Declare Function Hooks Lib "MHook.dll" () As Object
'Экспортируемые функции
'Function AddChildHook(Child As Object, ByVal ParentProcName$, ByVal Message&) As Long
'    'Добавление хука для отлова сообщений от дочернего контрола
'    'Арг: Дочерний объект// вызываемое имя отцовой процедуры // сообщения окна
'    '
'Function AddParentHook(Child As Object, ByVal ChildProcName$, ByVal Message&) As Long
'    'Добавление хука для отлова сообщений от родительского окна
'    'Арг: Дочерний объект// вызываемое имя дочерней процедуры // сообщения окна
'    '
'Function AddHook(Obj As Object, ByVal ProcName$, ByVal Message&) As Long
'    'Добавление хука для отлова сообщений от указанного окна
'    'Арг: Объект// вызываемое имя процедуры // сообщения окна
'    '
'Function CloseHook(ByVal hwnd&) As Long
'    'Закрывает все хуки связанные с этим окном
'    'После этого можно останавливать программу
'    '
'Function CloseAllHooks() As Long
'    'Закрывает все ранее открытые хуки, и возвращает их число
    '

Dim h&, h1&
Dim mHooks As Object

Private Declare Function InternetGetConnectedState Lib "wininet.dll" (ByRef IpdwFlags As Long, ByVal dwReserved As Long) As Long
Private Declare Sub Sleep Lib "kernel32" (ByVal dwMilliseconds As Long)
'

Function CheckFiles(ByVal ZipUrl$, ByVal Folder$, ParamArray ParseNames()) As Long
    'Проверяет наличие файлов, указанных в аргументах ParseNames
    'И при необходимости докачивает их в указанную папку Folder
    'Если папка не указанна, то отсутствующие файлы будут скопированны в текущую папку
    '© Антихакер32™  ...2014
    '
    Const Promt0 = "Отсутствуют необходимые компоненты" & vbCrLf
    Const Promt1 = Promt0 & "Отсутствует соединение с интернетом, для того чтоб их скачать"
    Const Promt2 = Promt0 & "Указанный URL не является ZIP-папкой с компонентами"
    Const Promt3 = Promt0 & "URL Zip-папки, не указан"
    Dim vEach, OldDir$, ArcName$, f&, zExists As Boolean, s$, i&, b() As Byte
    Dim ShellApp As Object, Fso As Object, Zip As Object
    Set Fso = CreateObject("Scripting.FileSystemObject"): OldDir = CurDir$
    If Fso.FolderExists(Folder) Then ChDir Folder Else Folder = OldDir
    For Each vEach In ParseNames
        If Fso.FileExists(vEach) Or Fso.FolderExists(vEach) Then
            CheckFiles = CheckFiles + 1: GoTo NextEach
        ElseIf Len(ZipUrl) Then On Error Resume Next
            If Not zExists Then 'Обращение к интернету и закачка необходимых файлов
                If InternetGetConnectedState(0&, 0&) = 0 Then MsgBox Promt1, vbInformation: End
                With CreateObject("MSXML2.XMLHTTP")
                    .Open "GET", ZipUrl, False '--или--.Open "GET", ZipUrl, False, Имя, Пароль
                    .send: s = LCase(Split(.getResponseHeader("Content-Type"), "/")(1))
                    If s <> "zip" Then MsgBox Promt2, vbInformation: End
                    ArcName = .getResponseHeader("Content-disposition")
                    b = .responseBody: .abort 'Завершить соединение
                End With
                i = InStr(1, ArcName, "filename=") + 10: ArcName = Mid$(ArcName, i, Len(ArcName) - i)
                f = FreeFile: Open ArcName For Binary As #f: Put #f, 1, b: Close #f 'Копирование байт
                Set ShellApp = CreateObject("Shell.Application")
                Set Zip = ShellApp.NameSpace(Fso.GetAbsolutePathName(ArcName))
            End If: 'On Error GoTo 0
            If Zip.ParseName((vEach)) Is Nothing Then GoTo NextEach
            ShellApp.NameSpace((Folder)).CopyHere Zip.ParseName((vEach))
            f = FreeFile: Open CStr(vEach) For Binary As #f: ReDim b(LOF(f) - 1)
            Do: DoEvents: s = b: Get #f, 1, b: Sleep 100: Loop While s <> CStr(b) 'пока есть разница данных
            Close #f: CheckFiles = CheckFiles + 1 'Файл из архива успешно скопирован, переход к следующему файлу
        Else: MsgBox Promt3, vbInformation: End
        End If
NextEach:
    Next: If Folder <> OldDir Then ChDir OldDir 'Если папка была изменена, то возврат в прежнюю папку
    If Len(ArcName) Then Kill ArcName
End Function

Private Sub Form_Load()
    Dim c(1) As CommandButton, f&
    Call CheckFiles( _
    "http://www.cyberforum.ru/blog_attachment.php?attachmentid=2468&d=1402890085" _
    , "", "MHook.dll", "PlasticFantastic Icon 13.ico")
    '-------------------------------------------------------------
    Me.Icon = LoadPicture("PlasticFantastic Icon 13.ico")
    Set mHooks = Hooks 'Загружаем класс
   
    Set tx1 = Controls.Add("vb.TextBox", "tx1")
    tx1.Move 100, 100, 4000, 500: tx1.Text = "Сдвинь меня !, и посмотри на стильную иконку"
    tx1.Visible = 1
    Set c(0) = Controls.Add("vb.CommandButton", "cm1")
    Set c(1) = Controls.Add("vb.CommandButton", "cm2")
    For f = 0 To 1: c(f).Move 100, 100 + (500 * f), 1500, 500
        c(f).Visible = 1: c(f).Caption = Choose(f + 1, "Закрыть хук", "Активировать хук")
    Next
    Set cm1 = c(0): Set cm2 = c(1)
    h1 = mHooks.AddHook(Me, "WMove", WM_MOVE)
End Sub

Private Sub cm2_Click()
    h1 = mHooks.AddChildHook(tx1, "TXMove", WM_LBUTTONDOWN)
End Sub

Private Sub cm1_Click()
    mHooks.CloseHook h1
End Sub

Public Function WMove(ParamArray Arg())
    Debug.Print Me.Left, Me.Top
End Function

Public Function TXMove(ParamArray Arg())
    Arg(2) = WM_NCLBUTTONDOWN
    Arg(3) = HTCAPTION
    TXMove = 1
End Function


Пред.

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

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

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

    TopList