Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.042 c
3-1084623289
russko
2004-05-15 16:14
2004.06.06
Простой запрос


6-1082492388
Blackgrin
2004-04-21 00:19
2004.06.06
Определение IP по домену


14-1085034483
Igorek
2004-05-20 10:28
2004.06.06
Закрытие веток


1-1085645771
Floppy
2004-05-27 12:16
2004.06.06
Удаление файла


14-1085121676
Bunny
2004-05-21 10:41
2004.06.06
IDE not Found.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский