![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Импрот функций из exe. [D6]
Тимохов © (2004-06-29 11:44:00)Прочел тут как-то, что импортировать функции можно не только из dll, но и из других exe. Попробовал сделать динамической загрузкой, получилось :)) Я сделал один dpr, даже без begin и end, т.е. одна функция и секция exports.
Вопросы:
1. Что происходит при загрузке exe череp LoadLibrary? Для dll, если не ошибаюсь вызывается стартовая функция библиотеки с соответствующим флагом, что-то типа dllproc process_attach (на память не помню). Что вызывается для exe? У него вроде нет такой функции.
2. Почему у меня не сработал такой код в библиотеке
procedure f();
begin
MessageBox(0, 'text', 'caption', MB_OK);
end;
При вызове f из другого приложения впесто текстов получается ерунда (т.е. случайная область памяти).
И совершенно нормально сработал такой
procedure f();
var
kText: packed array[0..4] of char;
kCaption: packed array[0..7] of char;
begin
kText[0] := 't';
kText[1] := 't';
kText[2] := 't';
kText[3] := 't';
kText[4] := #0;
kCaption[0] := 'c';
kCaption[1] := 'a';
kCaption[2] := 'p';
kCaption[3] := 't';
kCaption[4] := 'i';
kCaption[5] := 'o';
kCaption[6] := 't';
kCaption[7] := #0;
MessageBox(0, @kText, @kCaption, MB_OK);
end;
В последнем случае все вывелось корректно.
Digitman (2004-06-29 16:28:00) [101]
> адрес откуда загружается текст указывает на область, в которой
> хранится явно не то, что нужно
значит, секция иниц.данных в случае LoadLibrary() была загружена по иному вирт.адресу
Тимохов (2004-06-29 16:24:00) [102]
> Игорь Шевченко © (29.06.04 16:20) [9]
да ладно, раньше бы сказали, что времени нет :)))
я сделаю развернутый пример.
Честно говоря у меня была идея его сделать, но мне мочему-то показалось, что причины моего непонимания на поверхности.
Оказалось нет...
Игорь Шевченко (2004-06-29 16:20:00) [103]Тимохов © (29.06.04 16:10)
Я не издеваюсь. Но с другой стороны, я не собираюсь делать тестовый пример, и смотреть, что и как там проиходит. Я полагаю, что лучше бы было, если бы ты привел здесь содержимое окна CPU с кодом функции, заодно и показал бы, на что указывают адреса и т.д.
Я эта...тонко намекаю, что чужое время можно бы и уважать...
Тимохов (2004-06-29 16:10:00) [104]
> Игорь Шевченко © (29.06.04 16:04) [7]
Ну Игорь, ну что вы издеваетесь :))
Какой же это ответ.
Это вполне корректный код
procedure f();
begin
MessageBox(0, 'text', 'caption', MB_OK);
end;
Он же без проблем выполняется. Почему же не выполняется в случае загрузки exe как библиотеки.
Данный вопрос, конечно не является для меня в текущую секунду жизненно важным. Для меня важно понять, что я понимаю не так: про релокацию я вроде читал, опять же не вижу причин почему это не работает.
Есть у меня предположение, что в случае задания строковых констант загрузчик не может им сделать корректную релокацию. Вот и интересуюсь мнением бывалых почему.
Игорь Шевченко (2004-06-29 16:04:00) [105]
> адрес откуда загружается текст указывает на область, в которой
> хранится явно не то, что нужно
Вот и ответ на "
> 2. Почему у меня не сработал такой код в библиотеке
"
Тимохов (2004-06-29 15:56:00) [106]
> Digitman © (29.06.04 15:32) [5]
смотрел :)))
адрес откуда загружается текст указывает на область, в которой хранится явно не то, что нужно
Digitman (2004-06-29 15:32:00) [107]а посмотреть в ходе трассировки 1-го случая CPU-окно - не судьба ?
Тимохов (2004-06-29 14:17:00) [108]
> По какому базовому адресу загрузилось приложение ? :))
конечно не по желаемому, т.к. оба exe имели $00400000 в качестве оного :)
Но вроде это не мое дело - система должна сделать релокацию? Имхо так в рихтере написано :)
Игорь Шевченко (2004-06-29 14:14:00) [109]Тимохов © (29.06.04 13:53)
По какому базовому адресу загрузилось приложение ? :))
Тимохов (2004-06-29 13:53:00) [110]
> Как ты загружал приложение ?
Приложение, из которого, я ипортировал процедуру f я загрузал через loadlibrary.
Игорь Шевченко (2004-06-29 13:34:00) [111]
> 2. Почему у меня не сработал такой код в библиотеке
>
> procedure f();
> begin
> MessageBox(0, 'text', 'caption', MB_OK);
> end;
Как ты загружал приложение ?