![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
magn1t |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 16.5.2013 Репутация: нет Всего: нет |
Добрый день уважаемы форумчане.
Перерыл литературу, интернет, но на вопрос к сожалению не нашёл ответ, надеюсь на Вашу помощь. Каким образом запустить dll, через rundll32 без указания явной функции? Корректная работа DLL при указании функции main: ![]() Без указания функции ничего не происходит: ![]()
Большое спасибо. |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
magn1t |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 16.5.2013 Репутация: нет Всего: нет |
Спасибо за manual, но к сожалению ответа на мой вопрос там нет.
Переформулирую вопрос: Возможно ли запустить dll в rundll32 без указания entrypoint (т.е нужно чтобы функция выполнилась по умлочанию) Подскажите пожалуйста, что в коде необходимо поправить. |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Чем тебя не устроило с вызовом функции ???
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
magn1t |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 16.5.2013 Репутация: нет Всего: нет |
Поставили такую задачу было заявлено, что это возможно, я ищу решение. Всю голову сломал в поиске. |
|||
|
||||
Dem_max |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
Если и имеется такая возможность то она не документирована. Нормальные люди не ставят такие задачи по использованию недокументированных функций. -------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
|||
|
||||
feodorv |
|
||||||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Нет, не возможно. Подсмотрел исходники rundll32 для w2000, такой возможности не обнаружено))) Доказательства предъявили?))) Rundll должна уметь отличать EntryPoint от параметров вызова. Сравните:
Другое дело, что в синтаксисе запуска rundll запятая, предшествующая имени функции, может быть заменена на пробел. Или на группу пробелов. Или на группу запятых. Или на группу и того, и другого:
И вот создаётся видимость того, что "Options_RunDLL 1" - это аргументы к дефолтной функции. А это совсем не так! -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||||||
|
|||||||||
magn1t |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 16.5.2013 Репутация: нет Всего: нет |
Спасибо за развёрнутое объяснение, с Вашими словами пришло понимание. Увы без доказательств, явно не было озвучено, что default entrypoint. Но опереровали доводом, что во множестве ПО, есть возможность подключения и исполнения сторонних dll (без вмешательства в код), без описания и без указания каких-либо имен функций либо параметров. Если, есть информация каким образом это реализовано и каким образом ПО определяет entrypoint в dll без явного указания, примеры кода, я буду Вам благодарен. |
|||
|
||||
feodorv |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2214 Регистрация: 30.7.2011 Репутация: 9 Всего: 45 |
Вмешательства в код dll??? Или куда?
Это называется plugin. Вы кидаете соответствующую dll в нужную папку программы и... вуаля! в меню программы появился отсутствовавший ранее пункт меню, или проигрыватель теперь может проигрывать неподдерживаемые ранее типы файлов. Волшебство, да и только))) Всё отнюдь не так волшебно. Существуют соглашения и правила взаимодействия конкретной программы с предназначенными для неё плагинами. И в этих соглашения и правилах прописываются в том числе и имена экспортируемых из dll функций и параметры их вызова. То есть программа, подключающая внешнюю dll, заранее знает список функций, которые её нужны от этой dll. Если нужные функции (или переменные) не найдены, то plugin не будет подключен (сами подумайте, как его тогда вообще можно использовать). Тем не менее, при подключении dll есть одна функция, которая не обязана присутствовать в dll, и которую загрузчик dll автоматически исполняет (даже несколько раз). Это вызов DllMain. Обычно этот вызов используется для инициализации различных внутренних переменных и структур, используемых самой dll, но бывают и варианты. Тем не менее эта функция, автоматически вызываемая загрузчиком dll при подключении динамической библиотеки к процессу и отключении её от процесса, не должна включать в себя код, связанный с любыми блокировками. В том числе и MessageBox. Конечно, в познавательно-демонстрационных целях Вы можете вставить вызов MessageBox в DllMain в момент DLL_PROCESS_ATTACH (и это даже сработает), только учтите, это не будет Вашей победой над задачей, это будет Вашим поражением... Для общего развития советую ознакомиться с: -------------------- Напильник, велосипед, грабли и костыли - основные инструменты программиста... |
||||
|
|||||
Dem_max |
|
||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1780 Регистрация: 12.4.2007 Репутация: 16 Всего: 39 |
-------------------- Американские программисты долго не могли понять, почему русские при зависании Windоws всё время повторяют "Твой зайка написал" ("Yоur bunnу wrоte") |
||||
|
|||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
угу, возможно, в эксклюзивном режиме, как правильно заметил feodorv про DllMain, т.е. в DllMain все подключаемые dll исходного приложения и подключаемые dll подключаемых dll входят эксклюзивно, т.е. они в этой точке не могут пересекаться, это такое узкое горлышко, из которого можно выйти только создав в DllMain поток, в котором уже и может выполняться основной код. Некрасивый метод, но в крайних случаях, когда никакой иной способ взаимодействия с приложением не подходит, он работает. -------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
magn1t |
|
|||
![]() Новичок Профиль Группа: Участник Сообщений: 6 Регистрация: 16.5.2013 Репутация: нет Всего: нет |
Спасибо Вам большое за вектор, задачу решил, хотя методика решения и не является технологически правильной.
|
|||
|
||||
kuzulis |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 154 Регистрация: 5.9.2007 Репутация: 1 Всего: 1 |
Выложи свое решение. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |