Главная страница
    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.5 MB
Время: 0.014 c
9-1131311266
Yegorchic
2005-11-07 00:07
2006.06.11
Что-то добавить в Behaviours объекта в GLScene в Run-Time?


2-1148245086
Adolf
2006-05-22 00:58
2006.06.11
Срочно нужна помощь!


2-1148524398
Mozart
2006-05-25 06:33
2006.06.11
Подскажите ASCII код табуляции, пожалуйста...


2-1148619374
shmel
2006-05-26 08:56
2006.06.11
Связь с приложением


2-1148178304
Мурзилка
2006-05-21 06:25
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
Английский Французский Немецкий Итальянский Португальский Русский Испанский