Форум: "Основная";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
ВнизEXE как DLL Найти похожие ветки
← →
-SeM- (2004-05-21 12:41) [0]Может ли EXE-файл выступать в роли DLL?
← →
PVOzerski © (2004-05-21 12:50) [1]Может в рамках одного процесса экспортировать функции и переменные другим модулям (dll-ям) - по имени или индексу.
← →
Digitman © (2004-05-21 13:35) [2]
> -SeM-
точно так же - LoadLibrary() + GetProcAddress()
но учти, что иниц-ция данных exe-модуля происходит лишь тогда, когда при старте процесса система передает управление на точку входа в исп.код exe-модуля (точка старта)
в случае же использования exe-модуля в LoadLibrary() этого не произойдет, поскольку в дан.случае exe-модуль не порождает является самостоятельный процесс, у exe-модуля по умолчанию отсутствует DllEntryPoint() и , как следствие, данные модуля оказываются неинициализированными
← →
-SeM- (2004-05-22 09:37) [3]Извиняюсь за долгое молчание ...
Digitman © (21.05.04 13:35)
> по умолчанию отсутствует DllEntryPoint()
Т.е. возможно, чтобы она была в EXE?
Как правильно ее объявить, чтобы ЕХЕ-файл можно было грузить именно как DLL? Что-то типа DLLProc := @FuncName?
← →
AlexG © (2004-05-22 09:41) [4]
> Как правильно ее объявить, чтобы ЕХЕ-файл можно было грузить
> именно как DLL?
Так именно не получится. Ограничение ОС Винд.
← →
-SeM- (2004-05-22 09:57) [5]AlexG © (22.05.04 09:41)
> Ограничение ОС Винд
Подробнее можно?
А как получится?
← →
AlexG © (2004-05-22 10:08) [6]Ты можешь объявить процедуры и функции как экспортируемые, но они могут быть доступны только внутри процесса этого ЕХЕ. Технические подробности см. [2]
> А как получится?
А чем тебе DLL не нравится?
← →
sniknik © (2004-05-22 10:12) [7]> А как получится?
пишеш и компилиш обыкновенную dll, после переименовываеш в *.exe. ;о)
← →
-SeM- (2004-05-22 10:18) [8]AlexG © (22.05.04 10:08)
[2]
> у exe-модуля по умолчанию отсутствует DllEntryPoint()
Я ухватился за это. Т.е. если она будет присутствовать, значит можно будет произвести ини-цию, т.о. ЕХЕ может выступать в качестве DLL. Так ли это?
> А чем тебе DLL не нравится?
Просто надо (если это возможно) чтобы файл был и как самостоятельным исполняемым, так и мог експортировать свои функции другому процессу.
← →
AlexG © (2004-05-22 10:29) [9]
> Просто надо (если это возможно) чтобы файл был и как самостоятельным
> исполняемым, так и мог експортировать свои функции другому
> процессу
Я так думаю (сам не делал), это реализуется через ActivX.
> .о. ЕХЕ может выступать в качестве DLL. Так ли это?
В теории я разделяю твоё мнение. Но вообще, разработчиками ОС такая фишка не предусматривалась. Поэтому если хочешь разбирайся, но стоит ли игра свечь?
← →
Cobalt © (2004-05-22 10:34) [10]Удалено модератором
← →
-SeM- (2004-05-22 10:40) [11]sniknik © (22.05.04 10:12)
> пишеш и компилиш обыкновенную dll, после переименовываеш
> в *.exe
Пробовал :). Но или что-то не так делаю или нельзя - "... не я вляется приложением Win32"
← →
-SeM- (2004-05-22 10:43) [12]Cobalt © (22.05.04 10:34)
> то можешь в своих прогах собственнноручно доделывать все
> эти фишки для своих exe-"dll".
В том то и дело, что я не догнал как их доделывать...
← →
Kerk © (2004-05-22 15:32) [13]
> Дело в том, что формат у длл и ехе разный:
В том то и дело, что одинаковый.. :)
Отличаются одним флагом в заголовке.
← →
Jel © (2004-05-22 15:35) [14]Может быть стоит сделать свое приложение COM сервером? Тогда получишь как раз то, что хочешь - и исполняемый файл будет самостоятельным и фунции свои сможет экспортировать.
← →
-SeM- (2004-05-22 15:47) [15]С форматом решили :)
Почему при LoadLibrary(DLL) происходит инициализация модуля, а при LoadLibrary(EXE) нет? При том, что експортируемая функция EXE находится, ее выполнение приводит к AV. Не хватает DLLEntryPoint?
← →
Jel © (2004-05-22 15:52) [16]
> -SeM- (22.05.04 15:47) [15]
Перечитай еще раз [2]
AV получаешь из-за неинициализхированных данных. Данные не инициализируются из-за отсутствия в EXE DLLEntryPoint. Самостоятельная реализация этой функции в дельфийском exe выглядит весьма проблематичной.
← →
-SeM- (2004-05-22 16:04) [17]Jel © (22.05.04 15:52)
> AV получаешь из-за неинициализхированных данных
Об этом я и говорю. Как виндовый загрузчик производит загрузку. Мапирует файл, импорт, експорт, настройка адресов. Это работает в обоих случаях.
Что происходит дальше? В ЕХЕ переход ImageBase+AddressOfEntryPoint. В DLL усли есть DLLEntryPoint, то на нее. Так?
Когда происходит инициализация данных EXE? Как ее произвести?
Хотя бы идеи, plz...
> реализация ... выглядит весьма проблематичной
Но возможной? В чем проблема?
← →
Jel © (2004-05-22 16:12) [18]
> Когда происходит инициализация данных EXE?
При переходе на
> ImageBase+AddressOfEntryPoint
> Как ее произвести?
Запустив exe. (передав управление на EntryPoint) - побочный эффект - начнется выполнение программы :)
> В чем проблема?
В отделении мух от котлет. Серьезно. Нужно каким-то образом позволить выполниться коду инициализации, но не дать запуститься приложению. IMHO.
← →
default © (2004-05-22 16:18) [19]"Просто надо (если это возможно) чтобы файл был и как самостоятельным исполняемым, так и мог експортировать свои функции другому процессу."
COM-сервер в EXE?
← →
-SeM- (2004-05-22 16:23) [20]default © (22.05.04 16:18)
Не сработает, если другой процесс написан не мной?
← →
default © (2004-05-22 16:27) [21]-SeM- (22.05.04 16:23) [20]
всмысле?ты хочешь из чужого exe-ка ф-ии что-ли экспортировать?
← →
-SeM- (2004-05-22 16:46) [22]default © (22.05.04 16:27)
Наоборот, из своего в чужой.
Пример. Нужно поставить хук. Обработка хука должна быть в dll. При запуске мой ехе заставляет загрузить чужой процесс мой ехе как dll и заканчивает работу.
← →
default © (2004-05-22 17:01) [23]-SeM- (22.05.04 16:46) [22]
поставил хук значит, на DLL_PROCESS_DETACH или как там ты получаешь управление, что ещё нужно?можешь создать кодовый поток в этот момент(будет создан в чужом процессе) и будешь получать процессорное время для выполнения нужных дел в чужом процессе, а не только по активации событий хука)после анхука только облом будет - ведь память под кодовый поток будет лежать там и после анхука или после завер-ия прил-ия постав-его хук кодовый поток отмппиться от адрес-ого прост-ва чужого процесса...поэтому твой exe-ик должен жить и без анхука
сделай поиск по яндексу - внедр-ие в АП чужого процесса
или у Рихтера посмотри
← →
default © (2004-05-22 17:30) [24]http://clifftown.narod.ru/HDK/HDK3.htm
вот по-моему неплохой материал правда сам ещё не читал
← →
sniknik © (2004-05-22 20:28) [25]>> пишеш и компилиш обыкновенную dll, после переименовываеш
>> в *.exe ;о)
> Пробовал :). Но или что-то не так делаю или нельзя - "... не я вляется приложением Win32"
если это dll (по внутренностям) то неважно какое у нее разширение, exe ничуть не хуже чем любое другое. даже $$$ работает, именно как с dll.
значит пробовал не так, или пытался его запустить как exe-шик а то что оно так будет работать никто не обещал.
← →
-SeM- (2004-05-25 10:55) [26]default © (22.05.04 17:01) [23]
С внедрением как раз проблем и нет, да и не нужно оно в моем случае. Пример [22] был приведен как один из вариантов. [24] уже знакомо, но за ссылку спасибо.
2ALL
Задача - использование одного и того же VCL модуля как EXE и как DLL.
За выходные добил использование экспортируемых функций. Работает. Остались проблемы с перехватом DLL_PROCESS_ATTACH, DLL_PROCESS_DETACH и как инициализировать VCL в уже загруженном как DLL модуле. Простой переход на Application.Initialize ... приводит к AV.
Может кто подскажет умные мысли начинающему ;)?
← →
Digitman © (2004-05-25 12:20) [27]
> -SeM- (25.05.04 10:55) [26]
> Задача - использование одного и того же VCL модуля как EXE
> и как DLL.
не надо мудрить !
просто оформляешь приложение как внешний сервер автоматизации, после чего приложение может работать как автономно, так и представлять контроллеру автоматизации методы и св-ва для доступа к создаваемому по запросу контроллера объекту автоматизации
> Простой переход на Application.Initialize ... приводит к
> AV.
а кто его, объект TApplication, создавал ? Никто ! Application - это переменная-ссылка на объект класса TApplication, создаваемый при инициализации модуля Forms, которая, в свою очередь, осуществляется (в строго определенный момент времени !) при передаче системой управления в EXE EntryPoint
← →
KSergey © (2004-05-25 19:28) [28]Простите, умные люди... А если сделать всю функциональность в DLL, а к ней маленький пускачек (exe) написать, а?
← →
-SeM- (2004-05-26 09:21) [29]KSergey © (25.05.04 19:28) [28]
IMHO, что это еще тяжелей, чем
> [18] позволить выполниться коду инициализации, но не дать запуститься
> приложению
над чем сейчас и воюю.
Фактически, опять же IMHO, нужно выполнить участок кода между главным begin и Application.Initialize в dpr.
Еще одной проблемой осталось определение(перехват) DLL_PROCESS_ATTACH и DLL_PROCESS_DETACH в ЕХЕ-файле.
Будут мысли, предположения - высказывайте, будем думать.
← →
PVOzerski © (2004-05-26 10:00) [30]Слушай, а может, ты попробуешь написать свой startup-код и соберешь всё потом из obj-файлов линкером от какого-нибудь CBuilder"а? Впрочем, за правильность этого пути (как и всех прочих) ответственности нести не хочу :^)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2004.06.06;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.036 c