Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2006.06.11;
Скачать: [xml.tar.bz2];

Вниз

Экспортируемая функция в 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.49 MB
Время: 0.016 c
15-1148024063
McSimm
2006-05-19 11:34
2006.06.11
Пароль уже занят, выберите другой


2-1148557809
tvv
2006-05-25 15:50
2006.06.11
Работа с DLL


15-1147621721
Pazitron_Brain
2006-05-14 19:48
2006.06.11
Magic Forum


1-1146726447
petun
2006-05-04 11:07
2006.06.11
окно ввода пароля


2-1148401854
Juice
2006-05-23 20:30
2006.06.11
Перетаскивание формы





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский