![]() |
| ||
|
|
Новости |
Поиск |
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-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. )