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

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

Импрот функций из exe. [D6]


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

Тимохов ©   (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;


Как ты загружал приложение ?


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

Наверх

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