![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Exe как Dll [D7, WinXP]
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.
Но, повторяю, в общем случае работать эта схема не будет.
По двум важнейшимпричинам - при загрузке ехе-модуля как библиотеки он не будет должным образом настроен и инициализирован.