Наши проекты:
Журнал · Discuz!ML · Wiki · DRKB · Помощь проекту |
||
ПРАВИЛА | FAQ | Помощь | Поиск | Участники | Календарь | Избранное | RSS |
[35.171.164.77] |
|
Страницы: (9) 1 [2] 3 4 ... 8 9 все ( Перейти к последнему сообщению ) |
Прикр. сообщ.
#1
,
|
|
|
В DLL можно использовать только модули (нет классов и форм, почему-то при их вызове прога вызвавшая функцию рушится).
Возможности: Экспорт функций по ординалу^ Создание консольных приложений Минимальный размер программы 5 кб Автодобавление функций DllMain и Main (опционально) Создание *.map файла (опционально) Переключение языков (русский/английский) 12.08.2004 Добавилась возможность создания консольных приложений (пример есть в архиве) автор примера Lamerroot 13.08.2004 В опциях добавилась возможность уменьшать размер любого компилируемого объекта. Пустая экзешка теперь весит 5 кб! 18.08.2004 Приношу свои извинения. Но в последней версии Alex221(особоая благодарность за помощь) обнаружил серьезный баг не позволявший компилировать DLL-файлы. Ссылка на скачивание обновлена. Принимается помощь по переводам на различные языки. Языки хранятся в виде строк с раздилителями в ресурсах файла vb_dll.dll. Качать (Последнее обновление 2 декабря 2006г.): (предыдущее обновление 18 Августа 2004г.): Прикреплённый файлvb_dll.rar (27.73 Кбайт, скачиваний: 3791) |
Сообщ.
#16
,
|
|
|
Цитата Я решил проверить стабильность. Создал DLL в VB (с функцией работающей с потоками)и начал вызывать процедуру из других языков таких как VC, Delphi, PowerBasic, ну и из самого VB конечно. При данном тестировании не было замечено ни одного признака нестабильности. Все отработало как часы. Я как раз сказал, что с потоками библиотека работает нормально. Ты попробуй там СОМ-объекты посоздавать побольше. Приколешься. Цитата 1. Ключ /DEBUG не действует по той причине, что эта самая отладочная инфа уже лежит в .obj файле, созданная компилятором. Я это и сказал. Цитата 2. Ты утверждаешь, что такие функции, как __adjust_fdiv или __vbaR8IntI2 экспортируются с кодом. Плюс к тому они еще в составе какого-то интерфейса и экспортируются в EXE. Попробуй, загляни в msvbvm. Все сомнения насчет этого отпадут разом! Там фугкции именно так и называются. Не может быть такого, чтобы он таскал за собой msvbvm да еще и в себя их копировал. В этом случае экзешник был бы похож на дельфийский. Ну я же не говорил, что вот прямо полностью весь код всех ф-ий в ЕХЕ переноситься. Зато вот виртуальное объявление этих ф-ий как членов класса в ЕХЕ есть точно + какие-то ф-ии точно экспортируются полностью. Цитата 3. Пишешь, что главная процедура небесполезная. Это частично так. По ним можно ориентироваться создавать или уничтожать классы. Ну какая может идти речь о классах в модулях. В этой функции только одно полезно. С помощью нее можно посмотреть кто тебя вызвал и решить позволять ему пользоваться твоими функциями или нет. Вот и вся прелесть. Ну, это совсем не мало. Цитата 4. Все верно. Кстати, а может по этому мап файлу может вырезать ненужные блоки. Например, блок и ресурсами о версии DLL. Не я пробовал. Они находятся в другом сегменте данных. ВБ их не видит, как членов кода, т.е. откомпилировать проект будет невозможно. Мапфайл это чисто логи линковки. Ресурсы о версии можно удалить в последствии уже из готовой ДЛЛ стандартными АПИ или прикладной прогой, а так не знаю даже. Цитата 5. Я очень неаккуратно работал с Copymemory с блоками по 60 мег. Ничего страшного не происходило. Все стабильно. Ресурсы не глючат (тестировал на Win9X, Win2000, WinXProHome). Да и вообще действуют все те же правила, что и в простой VB-пограмме. Причем тут CopyMemory? Я говорю про GlobalAlloc, VirtualAlloc, HeapAlloc и т.д. Цитата 6. ... т.к. DLL находится не в адресном пространстве вызвавшей ее программы. Та конечно, а где она, по-твоему, тогда находится? Любая библиотека динамической компоновки загружается в адресное пространство процесса, который её вызвал (это на уровне ОС). Так что ты шутишь. |
Сообщ.
#17
,
|
|
|
to SCINER:
К сожалению никак не могу заставить работать твой AddIn. DLL не компилируются, при запуске компиляции появляется месанджбокс "Bad file name or number". У меня на вижул студии стоит 6 сервис пак. Может из-за этого? |
Сообщ.
#18
,
|
|
|
Цитата SCINER @ 17.08.04, 09:21 А как ты его устанавливал. Соблюдал ли все шаги описанные в ридми ? Стоит софт Visual Studio 6 SP6, Windows2000 build 5.00.2195 SP4. Addin устанавливал по инструкции, консольные программы компилируются нормально.При попытке копиляции тестового прожекта DLL.VBP появлялся месенджбокс "Bad file name or number". Деинсталлировал Addin, переустановил VS и SP6, заново установил Addin. Ура! Заработала. DLL наконец появилась. Компилирую Проверка.vbp, запускаю. Жму на кнопочку ADD появляется сообщение об ошибке: "Run-time error 453. Can`t find DLL entry point ADD in dll" Натравливаю на эту DLL "Stud_PE Analizator", он показывает девственно чистый раздел экспорта... "Number of exported Functions - 0" Абыдно понимаешь... Очень хочется нормальные DLL на VB писать.. |
Сообщ.
#19
,
|
|
|
Это мой глюк, точно!
Надо было так: VBInstance.ActiveVBProject.BuildFileName а я написал так: VBInstance.ActiveVBProject.Name В результате заместо c:\progman\vb\dll\mydll.vbd в линкер посылалось mydll.vbd разница очевидна Это только в последней версии, седня обновлю! |
Сообщ.
#20
,
|
|
|
SCINER:
Цитата Её и не должно было быть. Какая разница, как называется эта функция? VB её даже не экспортирует (да и зачем?).Я так понял, что ты имел в виду про обход стандартной процедуры точки входа. Если так, то да. Но. Я решил проверить стабильность. Создал DLL в VB (с функцией работающей с потоками)и начал вызывать процедуру из других языков таких как VC, Delphi, PowerBasic, ну и из самого VB конечно. При данном тестировании небыло замечено ни одного признака нестабильности. Все отработало как часы. Цитата Народ, вы что, думаете, что линкер просто "соединяет" obj-файлы и прописывает заголовок? Если отладочная инфа есть в obj'е, то это не значит, что она должна попасть в EXE-шник/DLL-ку. Линкер сам выбирает, что ему кидать в EXE-шник из obj'а, а что нет.1. Ключ /DEBUG не не действует по той причине, что эта самая отладоная инфа уже лежит в .obj файле, созданная компилятором. Цитата А также удаление временных файлов, восстановление каких-то параметров, сохранение установок и т.д... в зависимоти от задач модуля В этой функции только одно полезно. С помощью ние можно посмотреть кто тебя вызвал и решить позволять ему пользоваться твоими функциями или нет. Вот и вся прелесть. Цитата Гы! А если создать в VB обычный пустой проект, скомпилить и упаковать UPX'ом, то он тоже будет 5120 байт Сорри. Минимальный размер экзешек 5120 байт!!!, т.е. 6кб! Lamerroot: Цитата Может, я торможу, но что-то я не понял, причём тут стек? И причём тут 64kb, когда размер стека растягивается до метра?5. Лучше вообще не пользоваться в этой библиотеке такими ф-иями как New и CreateObject, т.к. создание любого объекта, размер данных которого превышает размер стека, т.е. 64 кб, приведет к краху приложения. Так же надо очень аккуратно проводить операции по копированию блоков памяти и выделению места в адресном пространстве процесса. Цитата Та конечно, а где она, по-твоему, тогда находится? Любая библиотека динамической компоновки загружается в адресное пространство процесса, который её вызвал (это на уровне ОС). Так что ты шутишь. p.s. Кстати, ничего, что... 1. При первом запуске после установки add-in'а VB выдал мне мессагу: "Method '~' of object '~' failed." ? 2. Пункт "Компиляция" появился не сразу, а после того, как я нажал на "Make DLL" 3. Frame "Настройки компиляции" (со всем содержимым) не... эээ... англифицируется 4. При создании проекта выбрал "DLL", увидел функции DLLMain и Main (зачем, кстати, вторая?). Решил откомпилить, но нашёл только Make EXE. Подумал, вдруг так и надо. Откомпилил. Файл по-прежнему EXE. Заглянул внутрь. Файл не-DLL. Так, в чём прикол-то? |
Сообщ.
#21
,
|
|
|
Еще вопрос по консольным приложениям.
К примеру, хочу я написать прогу типа FAR`а. С текстовым интерфейсом. Ну и мне нужно обрабатывать события в консоли. Нажатие клавишь, мышь и т.п. Как реализовать обработку событий в консольном окне? Вопрос довольно интересный... |
Сообщ.
#22
,
|
|
|
Цитата p.s. Кстати, ничего, что... 1. При первом запуске после установки add-in'а VB выдал мне мессагу: "Method '~' of object '~' failed." ? 2. Пункт "Компиляция" появился не сразу, а после того, как я нажал на "Make DLL" 3. Frame "Настройки компиляции" (со всем содержимым) не... эээ... англифицируется 4. При создании проекта выбрал "DLL", увидел функции DLLMain и Main (зачем, кстати, вторая?). Решил откомпилить, но нашёл только Make EXE. Подумал, вдруг так и надо. Откомпилил. Файл по-прежнему EXE. Заглянул внутрь. Файл не-DLL. Так, в чём прикол-то? Специально, форматнул винт, установил Win2000 и Win98 буду проверять! Добавлено в : Цитата Alex221 @ 18.08.04, 09:40 Еще вопрос по консольным приложениям. К примеру, хочу я написать прогу типа FAR`а. С текстовым интерфейсом. Ну и мне нужно обрабатывать события в консоли. Нажатие клавишь, мышь и т.п. Как реализовать обработку событий в консольном окне? Вопрос довольно интересный... Цитата Еще вопрос по консольным приложениям. К примеру, хочу я написать прогу типа FAR`а. С текстовым интерфейсом. Ну и мне нужно обрабатывать события в консоли. Нажатие клавишь, мышь и т.п. Как реализовать обработку событий в консольном окне? Вопрос довольно интересный... Сам думай! Добавлено в : Все работает, не гони Добавлено в : Цитата Jin X @ 18.08.04, 09:29 SCINER: Цитата Её и не должно было быть. Какая разница, как называется эта функция? VB её даже не экспортирует (да и зачем?).Я так понял, что ты имел в виду про обход стандартной процедуры точки входа. Если так, то да. Но. Я решил проверить стабильность. Создал DLL в VB (с функцией работающей с потоками)и начал вызывать процедуру из других языков таких как VC, Delphi, PowerBasic, ну и из самого VB конечно. При данном тестировании небыло замечено ни одного признака нестабильности. Все отработало как часы. Цитата Народ, вы что, думаете, что линкер просто "соединяет" obj-файлы и прописывает заголовок? Если отладочная инфа есть в obj'е, то это не значит, что она должна попасть в EXE-шник/DLL-ку. Линкер сам выбирает, что ему кидать в EXE-шник из obj'а, а что нет.1. Ключ /DEBUG не не действует по той причине, что эта самая отладоная инфа уже лежит в .obj файле, созданная компилятором. Цитата А также удаление временных файлов, восстановление каких-то параметров, сохранение установок и т.д... в зависимоти от задач модуля В этой функции только одно полезно. С помощью ние можно посмотреть кто тебя вызвал и решить позволять ему пользоваться твоими функциями или нет. Вот и вся прелесть. Цитата Гы! А если создать в VB обычный пустой проект, скомпилить и упаковать UPX'ом, то он тоже будет 5120 байт Сорри. Минимальный размер экзешек 5120 байт!!!, т.е. 6кб! Lamerroot: Цитата Может, я торможу, но что-то я не понял, причём тут стек? И причём тут 64kb, когда размер стека растягивается до метра?5. Лучше вообще не пользоваться в этой библиотеке такими ф-иями как New и CreateObject, т.к. создание любого объекта, размер данных которого превышает размер стека, т.е. 64 кб, приведет к краху приложения. Так же надо очень аккуратно проводить операции по копированию блоков памяти и выделению места в адресном пространстве процесса. Цитата Та конечно, а где она, по-твоему, тогда находится? Любая библиотека динамической компоновки загружается в адресное пространство процесса, который её вызвал (это на уровне ОС). Так что ты шутишь. p.s. Кстати, ничего, что... 1. При первом запуске после установки add-in'а VB выдал мне мессагу: "Method '~' of object '~' failed." ? 2. Пункт "Компиляция" появился не сразу, а после того, как я нажал на "Make DLL" 3. Frame "Настройки компиляции" (со всем содержимым) не... эээ... англифицируется 4. При создании проекта выбрал "DLL", увидел функции DLLMain и Main (зачем, кстати, вторая?). Решил откомпилить, но нашёл только Make EXE. Подумал, вдруг так и надо. Откомпилил. Файл по-прежнему EXE. Заглянул внутрь. Файл не-DLL. Так, в чём прикол-то? Все работает! скачай последнее обновление |
Сообщ.
#23
,
|
|
|
Я и не спорю, что работает (ты лучше повнимательнее почитай, что я написал, я там и не говорил, что не работает, просто есть замечания), но то, что я описал, я же не сам придумал.
Видимо, я просто не понял, как создать DLL-ку. Запускаю VB, выбираю "DLL", открываю "modDLL"... ах вон что! Нужно через "компиляцию" компилить! А я-то думал, что стандартно Добавлено в : Неее, не всё так просто! Теперь так. Запускаем VB (делаю всё параллельно написанию этого текста), выбираем "DLL", затем "modDLL", создаём Sub xyz():MsgBox "hi!":End Sub. File/Компиляция... тьфу, блин, забыл сохраниться... File/Save..., File/Компиляция. Выбираю функцию xyz, жму OK. Указываю файл (по умолчанию DLL.exe, кстати). DLL-ка скомпилена! Ура! А теперь проверим её. Жмём просмотр, поиск, "xyz"... найден, что радует. Делаем прогу, вызывающую процедуру. Запускаем. Ошибка. Так, через OllyDBG, модуль загрузили, адрес процедуры получили, call eax (заходим внутрь). Идём, идём... ошибень! Ладно, может, я накосячил? Делаем на Delphi procedure...external.... Запускаем. Опять всё нормально. Ok, лезем в файл через hiew. F8, F2, смотрим "File is DLL: YES". Хм... почему ж не работает? Почему не работает? Чтоб не быть голословным, вот вам мой проект. Прикреплённый файлproject1.zip (26.15 Кбайт, скачиваний: 274) |
Сообщ.
#24
,
|
|
|
Вообще, надо бы, чтоб всё было чётко при "стандартной" компиляции, если это возможно.
А то когда делаешь File/Make DLL.dll, делается exe-шник, без экспортов и т.д. p.s. Кстати, если в dll-ке (имеется в виду вообще в исходнике) нет экспортируемых функций (DLLMain не в счёт), то это не значит, что она не имеет право на существование! К тому же, для чего нужна функция main? |
Сообщ.
#25
,
|
|
|
Спасибо насчет 2-х советов по улучшению аддина.
Однако я проверив твою DLL был в шоке! Раньше-то все работало...вроде Я в дельфях не спец, но написал динамический вызов (может неправильно): uses Windows, SysUtils; //procedure xyz; stdcall; external 'dll.dll'; var hDll:longint; pProc:pointer; begin //xyz hDll := LoadLibrary('dll'); pProc := GetProcAddress(hDll, 'xyz'); hDll := CallWindowProc(pProc,0,0,0,0); FreeLibrary (hDll); end. но и с помощью него вылетает таже ошибка, однако тот-же код на VB работает четко: Dim hDll As Long, pProc As Long hDll = LoadLibrary("dll") pProc = GetProcAddress(hDll, "xyz") pProc = CallWindowProc(pProc) FreeLibrary hDll Что-же это может быть? |
Сообщ.
#26
,
|
|
|
uses Windows, SysUtils; //procedure xyz; stdcall; external 'dll.dll'; var hDll:longint; pProc:procedure; {stdcall}; может быть надо поставить begin //xyz hDll := LoadLibrary('dll'); pProc := GetProcAddress(hDll, 'xyz'); pProc; FreeLibrary (hDll); end. |
Сообщ.
#27
,
|
|
|
И что это за код? Всё равно он не работает.
Видимо, дело в том, что процедура в DLL вызывает что-то. Если MsgBox убрать, то будет всё нормально. Это какие-то MS VB-шные штучки... |
Сообщ.
#28
,
|
|
|
Вы вообще мои посты читали? Я там про точку вхождения кое-что писал.
Попробуйте сдеалть так: Переименовать ф-ию DLLMain, скажем, в Entry. Ну и откомпилять файл с ключом /ENTRY:Entry. Msgbox должен работать. Или можно, к примеру, воспользоваться API ф-ией MеssageBox. Она будет работать. А вообще в таких ДЛЛ нет никакой пользы т.к. процедура "Set obj = New Obj" приводит к немедленному краху ВБ. Лучше уже делать всё на старом добром ВЦ. |
Сообщ.
#29
,
|
|
|
А лучше во всем разобраться и довести все до ума
|
Сообщ.
#30
,
|
|
|
Lamerroot, да, читали. И что с того? Почему при переименовании будет работать? Ты писал, что __vbaS вызывает разные функции, а затем Main, а если мы переопределяем точку входа, что будет вызываться только DLLMain или что-то ещё (которая уже ничего не вызывает... по идее в этом и должна быть проблема). Причём тут имя вообще?
|