Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Exe как Dll [D7, WinXP]


Страницы:   1 2 3

s_ ©   (2007-04-05 09:15:00) 

Каким образом сделать в исполняемом  файле (exe-файле)экспортируемые функции, как в dll. Если можно с примером. Заранее спасибо.


Сергей М.   (2007-04-05 17:00:00) [21]


> s_


Чтобы не быть голословным по поводу "определенных" случаев, когда "это" гарантированно работает, предлагаю экспортировать/импортировать/вызвать следующую процедуру:

procedure MagicEXEImportExportTest;
begin
 exit;
end;


Пробуй.
Удивись.
Вникни, ПОЧЕМУ это работает, а что-то другое не работает.
Думай.
Задавай вопросы.
Делай выводы.
Принимай соотв.решение.


Сергей М.   (2007-04-05 16:44:00) [22]


> s_   (05.04.07 16:42) [27]


Тебе это не по силам.
Да и не нужно.
см. [23]


s_   (2007-04-05 16:42:00) [23]

> Сергей М. ©   (05.04.07 16:18) [24]
> Но не в твоем случае


А как можно переделать программу, чтобы было в моём случае?
Или это невозможно?


Сергей М.   (2007-04-05 16:31:00) [24]


> s_   (05.04.07 16:27) [25]


Потому что исполняемый файл представляет собой точно такой же PE-модуль, как и DLL.

Возможность импорта-экспорта заложена в любоммодуле, имеющем формат Portable Executable.


s_   (2007-04-05 16:27:00) [25]

Вы можете мне сказать
для чего сделали возможным ЭКСПОРТИРОВАТЬфункции в исполняемом(exe) файле????? :((((


Сергей М.   (2007-04-05 16:18:00) [26]


> s_   (05.04.07 16:00) [22]


> Я же задал в полне понятный вопрос, взможно ли исполнять
> импортируемую функцию из exe-шки?


Вполне понятно тебе и ответили - возможно.
Но не в твоем случае.


clickmaker   (2007-04-05 16:02:00) [27]


> и в одном из них хочу использовать функции другого приложения

в этих случаях лучше общие функции выносить в DLL, которую могут юзать оба exe
Или писать EXE как COM-сервер


s_   (2007-04-05 16:00:00) [28]

А зачем ?)
> Чем DLL-то не устраивает ?

Я же задал в полне понятный вопрос, взможно ли исполнять импортируемую функцию из exe-шки?
Ну, если нет, то для чего сделали возможным экспортировать функции в исполняемом файле?
А зачем ?)
Например:
 Я работаю с двумя приложениями, и в одном из них хочу использовать функции другого приложения.

Заранее говорю, что не хочу использовать там всякие DDE и т.п.


Сергей М.   (2007-04-05 14:46:00) [29]


> s_   (05.04.07 13:22) [18]
> КАК же сделать, чтобы наконец Р А Б О Т А Л АААААААААААА!


А зачем ?)
Чем DLL-то не устраивает ?


clickmaker   (2007-04-05 14:13:00) [30]


> [18] s_   (05.04.07 13:22)

скомпили DLL, потом поменяй расширение на exe


Elen   (2007-04-05 13:54:00) [31]


> А КАК же сделать, чтобы наконец Р А Б О Т А Л АААААААААААА!

А что за срочная необходимость такого изврата?


s_   (2007-04-05 13:22:00) [32]

> Но, повторяю, в общем случае работать эта схема не будет
А КАК же сделать, чтобы наконец Р А Б О Т А Л АААААААААААА!


Сергей М.   (2007-04-05 13:01:00) [33]


> критичности по секции инициализации модуля не вижу


Какого модуля-то ?

Ни один ведь не инициализируется, если ты о юнитах, из которых построен EXE-модуль... А среди них запросто м.б. и юнит, где реализован менеджер памяти, который тоже требует инициализации... Строка же Result:=s+' Exports' гарантированно обращается к менеджеру


vl_chel   (2007-04-05 12:37:00) [34]

>>DiamondShark ©   (05.04.07 11:38) [13]

Из опыта работы на D6 всегда из библиотеки возвращал строки как PChar
пока библиотека в памяти никогда AV не возникала. Может я везунчик :))

>>Сергей М. ©   (05.04.07 11:16) [11]
критичности по секции инициализации модуляне вижу, если там AnsiString то они при работе используют механизм подсчета ссылок, при нем _AdRef и _Release вызываются автоматом, этот механизм очень неплохо работает


Сергей М.   (2007-04-05 11:47:00) [35]


> Вот пожалуйста абсолютно рабочий код для dll


Но при этом абсолютно бестолковый и бессмысленный.


Сергей М.   (2007-04-05 11:46:00) [36]


> s_   (05.04.07 11:34) [12]


> мне главное определить, возможно ли импортировать в другом
> приложении


Тебе уже сказали - возможно.
И ты в этом убедился, иначе бы ты просто не смог бы скомпилировать импортирующее приложение.

Но импорт процедуры и собственно вызов/исполнение импортируемой процедуры - две разные разницы.

Первое, как видишь, не вызывает проблем, возможность же беспроблемного осуществления второго зависит от множества факторов, два важнейших из которых до тебя уже доведены.


DiamondShark   (2007-04-05 11:38:00) [37]


> Вот пожалуйста абсолютно рабочий код для dll


> Result:=PChar(s+' Exports')

Это абсолютно нерабочий код даже для монолитных приложений.

То, что такой код в некоторых случаяхне приводит к нарушению доступа -- всего лишь результат благоволения судьбы к дуракам, больным и пьяным.


s_   (2007-04-05 11:34:00) [38]

> vl_chel ©
Да не важно String, PChar, Integer..., мне главное определить, возможно ли импортировать в другом приложении?

Вот пожалуйста абсолютно рабочий код для dll


library Project1;

uses
Forms,
Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

function Exprt(s:PChar):PChar;Export;
begin
Result:=PChar(s+' Exports')
end;

exports
Exprt;

begin
Application.Initialize;
Application.CreateForm(TForm1, Form1);
Application.Run;  
end.

...................
{Приложение для импорта}
function Exprt(s:PChar):PChar;External 'project1.exe';

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
var es:String;
begin
es:=Exprt('Call');
Memo1.Lines.Add(es);
end;


Но когда я делаю из первого кода exe-шку, при нажатии на кнопку в функции Exprt происходит ошибка Access violation


Сергей М.   (2007-04-05 11:16:00) [39]


> vl_chel ©   (05.04.07 10:59) [8]
> не отработают секции инициализации. Для
> Вашего кода в принципе это не критично.


Как раз для подобного кода это еще как критично !)


Сергей М.   (2007-04-05 11:13:00) [40]


> s_   (05.04.07 10:52) [7]


> КАК импортировать эту функцию в другом приложении?


Обычным образом. Точно так же как и из DLL.

Но, повторяю, в общем случае работать эта схема не будет.

По двум важнейшимпричинам - при загрузке ехе-модуля как библиотеки он не будет должным образом настроен и инициализирован.


Страницы:   1 2 3

Наверх

Титульная страница Поиск, карта сайта Написать письмо