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

Вниз

Экспортируемая функция в EXE   Найти похожие ветки 

 
Still Swamp   (2006-05-02 14:15) [0]

Есть у меня забота в моем EXE сделать экспортируемую функцию. Пишу нечто вроде

program ....

uses ...

function Exec(AApplication:TApplication): boolean; stdcall;
begin
Это та самя экспортируемая функция
....
end;

exports Exec;

begin
// стандартный текст для создания приложения и основной формы
Application.Initialize;
Application.CreateForm(TVFormMain, VFormMain);
Application.Run;
end.

К сожалению, при первом запуске отладчик однозначно попадает на блок "Application.Initialize" вне зависимости от того вызвал ли я функцию Exec или запустил EXE файл. В прочем это и понятно.

Как можно определить, является ли вызов прямым (EXE) или через экспортируемую функцию так как в зависимости от этого мне надо либо создавать TApplication либопринимать его.


 
Сергей М. ©   (2006-05-02 14:38) [1]

см. IsLibrary

Только работать эта схема все равно не будет - при загрузке exe-файла как библиотеки не будет произведена инициализация модулей в его составе.


 
Still Swamp   (2006-05-02 15:15) [2]

Поясните плс "не будет произведена инициализация модулей в его составе"


 
Сергей М. ©   (2006-05-02 16:04) [3]

Поясняю - не будет вызван к выполнению ни один в разделе ШТШЕШФДШЯФЕШЩТ ни одного из модулей в составе загруженного приложения.


 
Сергей М. ©   (2006-05-02 16:09) [4]

Поясняю на огурцах - не будет вызван к выполнению ни один код в разделе INITIALIZATION ни одного из модулей в составе загруженного приложения, поскольку эти вызовы происходят при вызове EntryPoint, которая не вызывается в случае загрузки EXE как DLL. При загрузке DLL системой производится попытка вызова DllEntryPoint, которая напрочь отсутствует в EXE.


 
Still Swamp   (2006-05-02 16:31) [5]

Так EntryPoint могу установить и вызвать я при попытке вызова. Вопрос, отсутствует ли она в EXE.

по идее если есть экспорт - то должна быть.


 
Сергей М. ©   (2006-05-02 16:38) [6]

Ты понимаешь разницу между [Dll]EntryPoint РЕ-модуля и точками входа в экспортируемые п/программы в составе этого модуля ?


 
Сергей М. ©   (2006-05-02 16:43) [7]

Представляешь ли ты себе в деталях алгоритмы загрузки EXE и DLL ?


 
tesseract ©   (2006-05-02 16:51) [8]

Добавь в Exe Com-server, и можно будет вызывать из него функции.


 
Still Swamp   (2006-05-02 18:55) [9]


> Ты понимаешь разницу между [Dll]EntryPoint РЕ-модуля и точками
> входа в экспортируемые п/программы в составе этого модуля
> ?


Да в достаточной мере.
DLLProc:=@DLLEntryProc; обеспечивает мне перенаправление этого обработчика в мою DLL где в дальнейшем я разбираюсь как конкретно мне управляться и что далее делать. Только еще раз... толку то мне от этого, когда изначально при открытии модуля запускется именно этот код в котором я не могу определить как он запущен. IsLibrary - для EXE строго возвращает FALSE.


 
Still Swamp   (2006-05-02 18:56) [10]


> Представляешь ли ты себе в деталях алгоритмы загрузки EXE
> и DLL ?

Да в достаточной мере. Я не вижу проблем с точки зрения винды экспортировать функции из любого бинарника который сможет предоставить эту возможность.


 
Leonid Troyanovsky ©   (2006-05-02 21:00) [11]


> Still Swamp   (02.05.06 18:56) [10]

> Да в достаточной мере. Я не вижу проблем с точки зрения
> винды экспортировать функции из любого бинарника который
> сможет предоставить эту возможность.


Дык, и в чем же проблемы, если оных не видно?

Екзешник, с точки зрения винды, в полной мере предоставляет
возможность экспорта своих функций, ну, скажем, в загружаемую
им библиотеку (PE, если позволите-с).

--
Regards, LVT.


 
tesseract ©   (2006-05-02 21:55) [12]


> Да в достаточной мере. Я не вижу проблем с точки зрения
> винды экспортировать функции из любого бинарника который
> сможет предоставить эту возможность.

Угу. Сколько точек входа у Exe? а сколько у DLL?


 
Deka ©   (2006-05-03 12:06) [13]

Недавно у меня в проекте с использованием DLL отладчик так-же останавливался на инициализации. Запустил без отладчика и винда мне сказала, что "нет такой-то экспортируемой функции". Вот такая простая ошибка и к чему она привела отладчик. Экспорт был статическим. Это я к о том, почему отладчик останавливается. Думаю надо запустить пример без отладчика и посмотреть на то, что скажет винда.


 
Leonid Troyanovsky ©   (2006-05-03 18:52) [14]


> Deka ©   (03.05.06 12:06) [13]

> и посмотреть на то, что скажет винда.


Что сову о пень, что пнем о сову,
все равно - нежить сове.

--
Regards, LVT.


 
Сергей М. ©   (2006-05-04 08:34) [15]


> Still Swamp   (02.05.06 18:56) [10]
> Да в достаточной мере. Я не вижу проблем с точки зрения
> винды экспортировать функции из любого бинарника который
> сможет предоставить эту возможность.


Проблема не в экспорте, а в том что EXE-модуль не имеет DllEntryPoint в своем заголовке (это поле равно nil).
А именно DllEntryPoint вызывается системой, когда она грузит DLL-модуль.
И как раз в ходе исполнения этого вызова происходит инициализация DLL-модуля.

Убедись в этом сам, загрузив EXE-модуль по LoadLibrary() и вызвав некую экспортируемую им процедуру, в теле которой происходит, например,

ShowMessage("Ok");

AV при этом гарантирован.


 
GrayFace ©   (2006-05-04 11:04) [16]

> Still Swamp   (02.05.06 18:55) [9]
> > Ты понимаешь разницу между [Dll]EntryPoint РЕ-модуля и точками
> > входа в экспортируемые п/программы в составе этого модуля ?
>
> Да в достаточной мере.
> DLLProc:=@DLLEntryProc; обеспечивает мне перенаправление
> этого обработчика в мою DLL где в дальнейшем я разбираюсь
> как конкретно мне управляться и что далее делать. Только
> еще раз... толку то мне от этого, когда изначально при открытии
> модуля запускется именно этот код в котором я не могу определить
> как он запущен. IsLibrary - для EXE строго возвращает FALSE.

DLLProc, как раз, к PE модулю не имеет никакого отношения. Опиши ситуацию - твой путь тупиковый.


> Сергей М. ©   (04.05.06 08:34) [15]
> Проблема не в экспорте, а в том что EXE-модуль не имеет
> DllEntryPoint в своем заголовке (это поле равно nil).

Хм. Я думал, что в DllEntryPoint и EntryPoint хранятся в одном месте.


 
Сергей М. ©   (2006-05-04 11:57) [17]


> GrayFace ©   (04.05.06 11:04) [16]


Да, я наврал.

Адрес точки входа в EXE и DLL действительно хранится в одном и том же поле PE-заголовка AddressOfEntryPoint и оно в случае EXE заведомо <> nil.

Но поскольку флаг IsDLL в заголовке в случае EXE линкером не установлен, система попросту не вызывает EntryPoint, хотя бы потому что ф-ции EXEMain и DLLMain отличаются параметрами.



Страницы: 1 вся ветка

Текущий архив: 2006.06.11;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.05 c
15-1147763288
Kolan
2006-05-16 11:08
2006.06.11
Где взять про объектное связывание?


15-1148043039
Nikolga
2006-05-19 16:50
2006.06.11
Ищем программиста Delphi


6-1135840770
Wolferio
2005-12-29 10:19
2006.06.11
Ping PC


2-1148406639
dera
2006-05-23 21:50
2006.06.11
Как перекодировать символ в DOS 866 кодировке в WIN1251?


4-1142354826
Volf_555
2006-03-14 19:47
2006.06.11
Как изменить UIN и пароль в QIP?