Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.06.06;
Скачать: CL | DM;

Вниз

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;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.056 c
3-1084537217
Дмитрий
2004-05-14 16:20
2004.06.06
Отчеты в базах данных


4-1083243415
DoG
2004-04-29 16:56
2004.06.06
CreateNamedPipe


14-1084909409
Vasya.ru
2004-05-18 23:43
2004.06.06
Скоко прога стоит?


14-1083761789
SPeller
2004-05-05 16:56
2004.06.06
Спам для спамеров


1-1085639652
ilnarab
2004-05-27 10:34
2004.06.06
Как извлечь имя файла