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-30 11:22:00) [61]


> SammIk ©   (30.06.04 11:16) [48]
> 2[45]
> А если так
> var
> p:DWORD?


а так - пожалуйста
если переменная р локальная, то память под нее аллокируется в стеке, и никаких проблем нет


> И почему вы сделали такои вывод?
> Может инициализированы.


см. [49]


Игорь Шевченко   (2004-06-30 11:17:00) [62]


> а поскольку в exe нет DllEntryPoint(), то и иниц-ция не
> выполняется


Ой.


SammIk   (2004-06-30 11:16:00) [63]

2[45]
А если так
var
p:DWORD
?
И почему вы сделали такои вывод?
Может инициализированы.


Digitman   (2004-06-30 11:16:00) [64]


> Тогда почему это все работает в dll? Там происходит инициализация
> system и sysutils?


ну а как же ?! при иниц-ции библ-ки система вызывает DllEntryPoint(), в ходе этого как раз и иниц-ся модули

а поскольку в exe нет DllEntryPoint(), то и иниц-ция не выполняется


Тимохов   (2004-06-30 11:11:00) [65]


> Игорь Шевченко ©   (29.06.04 20:46) [44]

Научиться бы еще это все понимать.
До ключа -R я вчера дома дошел. Структура информации где-то описана? Т.е. вчера я попробовал все тоже самое но из dll с базовым адресом, равным exe.  Все корректно перенеслось.

Вот я и подумал: почему в exe ничего не переносится. Попытался понять структуру отчета tdump -R для dll и exe. Но думаю, что тут просто так не разберешься - нужно описание структуры.

Всем.

ВОПРОСЫ.
1. Почему в dll создается таблица релокации, а в exe нет?
2. Этим можно как-то управлять, например, директивами компилятора?


Тимохов   (2004-06-30 11:04:00) [66]


> а уж вот это ты очевидную ерунду сморозил
>
> задействуя дин.тип, ты задействуешь как минимум модули system
> и sysutils, которые не инициализированы

Тогда почему это все работает в dll? Там происходит инициализация system и sysutils?


Digitman   (2004-06-30 08:57:00) [67]


> SammIk ©   (29.06.04 18:07) [22]
> Ну как раз из-за этого и баг.
> А ты попробуи так
> var
> str:string;
> begin
> str:='ffff';
> ....
> messagebox(0,@str[1],pchar(str),MB_OK);
> ....
> end;


а уж вот это ты очевидную ерунду сморозил

задействуя дин.тип, ты задействуешь как минимум модули system и sysutils, которые не инициализированы


Игорь Шевченко   (2004-06-29 20:46:00) [68]

Number interesting RVAs  00000010
Name                   RVA       Size  
------------------  --------  --------
Exports             00000000  00000000
Imports             00048000  00001F6E
Resources           00051000  00003600
Exceptions          00000000  00000000
Security            00000000  00000000
Fixups              0004C000  00004A7C
Debug               00000000  00000000
Description         00000000  00000000
Global Ptr          00000000  00000000
TLS                 0004B000  00000018
Callbacks           00000000  00000000
Bound Imports       00000000  00000000
Import Addr Table   00000000  00000000
Delayed Imports     00000000  00000000
COM Runtime         00000000  00000000
reserved            00000000  00000000

То, что жирным и есть Relocations

Секция обычно называется
07   .reloc   00004A7C  0004C000  00004C00  00048400  50000040 [IRS]

tdump -R обычно показывает таблицу Fixup'ов (она же Relocations)


Тимохов   (2004-06-29 19:32:00) [69]

X3 так ХЗ.

Разберусь - сообщу. Может кому будет интересно :))


Тимохов   (2004-06-29 19:09:00) [70]


> SammIk ©   (29.06.04 19:03) [40]

уверены?
Что-нибудь типа "Program control"?


SammIk   (2004-06-29 19:09:00) [71]

ХЗ


SammIk   (2004-06-29 19:03:00) [72]

В хелпе


SammIk   (2004-06-29 19:02:00) [73]

И не будет)))


Тимохов   (2004-06-29 19:02:00) [74]

я тоже в этом уверен.
интересно было бы знать, где это написано...


Тимохов   (2004-06-29 19:00:00) [75]


> Поищи в делфовом справочнике директивы на эту тему.

Пойду искать...

Дома еще попробую ту же фишку с dll.
Не может быть там такого, чтобы был тот же баг.


SammIk   (2004-06-29 18:57:00) [76]

Вообщем мои ответ тако:
В случае №1(когда не получается) у тебя адрес(те push $xxxxxx)
статическии(на этапи компиляции биндится), а когда ты грузишь свои exe как либу, то база у тебя далеко не $40000(или какая там). А поскольку базы у фаилов одни и теже, то фортень
загружает твою "длл" в другое место и все адреса меняются, НО
этот статическии адрес НЕ меняется. Получается, что строка
берется из адресного пространства вызывающеи проги.
Короче видешь ерундень вместо текста.
Что делать?
Поищи в делфовом справочнике директивы на эту тему.
У меня справочника нет, подсказать не могу.


Тимохов   (2004-06-29 18:50:00) [77]


> SammIk ©   (29.06.04 18:47) [33]

да ничего.

ведь интересно же - в чем фишка.

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


Тимохов   (2004-06-29 18:48:00) [78]


> SammIk ©   (29.06.04 18:43) [30]

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


> SammIk ©   (29.06.04 18:44) [31]

Находится 00000000


SammIk   (2004-06-29 18:47:00) [79]

Хотя в принципе это не важно))
И так ясно, куда надо указывает)))
Извени, загонял тебя)


Тимохов   (2004-06-29 18:45:00) [80]


> Игорь Шевченко ©   (29.06.04 17:58) [17]

Выполнил команду
TDUMP.EXE ExeLibrary.exe > result

Что в полученном файле является relocation секцией?
По строке "Relocation" найдено всего два места

Relocation Table entry count                          0000h  (     0. )
Relocation Table address                              0040h  (    64. )


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

Наверх

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