Форум: "Основная";
Текущий архив: 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.5 MB
Время: 0.014 c