Текущий архив: 2004.09.19;
Скачать: CL | DM;
Вниз
Импрот функций из exe. Найти похожие ветки
← →
SammIk © (2004-06-29 19:03) [40]В хелпе
← →
Тимохов © (2004-06-29 19:09) [41]
> SammIk © (29.06.04 19:03) [40]
уверены?
Что-нибудь типа "Program control"?
← →
SammIk © (2004-06-29 19:09) [42]ХЗ
← →
Тимохов © (2004-06-29 19:32) [43]X3 так ХЗ.
Разберусь - сообщу. Может кому будет интересно :))
← →
Игорь Шевченко © (2004-06-29 20:46) [44]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)
← →
Digitman © (2004-06-30 08:57) [45]
> 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-30 11:04) [46]
> а уж вот это ты очевидную ерунду сморозил
>
> задействуя дин.тип, ты задействуешь как минимум модули system
> и sysutils, которые не инициализированы
Тогда почему это все работает в dll? Там происходит инициализация system и sysutils?
← →
Тимохов © (2004-06-30 11:11) [47]
> Игорь Шевченко © (29.06.04 20:46) [44]
Научиться бы еще это все понимать.
До ключа -R я вчера дома дошел. Структура информации где-то описана? Т.е. вчера я попробовал все тоже самое но из dll с базовым адресом, равным exe. Все корректно перенеслось.
Вот я и подумал: почему в exe ничего не переносится. Попытался понять структуру отчета tdump -R для dll и exe. Но думаю, что тут просто так не разберешься - нужно описание структуры.
Всем.
ВОПРОСЫ.
1. Почему в dll создается таблица релокации, а в exe нет?
2. Этим можно как-то управлять, например, директивами компилятора?
← →
SammIk © (2004-06-30 11:16) [48]2[45]
А если такvar
?
p:DWORD
И почему вы сделали такои вывод?
Может инициализированы.
← →
Digitman © (2004-06-30 11:16) [49]
> Тогда почему это все работает в dll? Там происходит инициализация
> system и sysutils?
ну а как же ?! при иниц-ции библ-ки система вызывает DllEntryPoint(), в ходе этого как раз и иниц-ся модули
а поскольку в exe нет DllEntryPoint(), то и иниц-ция не выполняется
← →
Игорь Шевченко © (2004-06-30 11:17) [50]
> а поскольку в exe нет DllEntryPoint(), то и иниц-ция не
> выполняется
Ой.
← →
SammIk © (2004-06-30 11:22) [51]2[49]
Насколько я понимаю, приходит всетоки сообщение
PROCESS_ATTACH.
Вернее даже не сообщение, просто по энтрипоинт передается управление, с 3 параметрами.
← →
Digitman © (2004-06-30 11:22) [52]
> SammIk © (30.06.04 11:16) [48]
> 2[45]
> А если так
> var
> p:DWORD?
а так - пожалуйста
если переменная р локальная, то память под нее аллокируется в стеке, и никаких проблем нет
> И почему вы сделали такои вывод?
> Может инициализированы.
см. [49]
← →
SammIk © (2004-06-30 11:28) [53]Насколько я понял из сдк, то это принятое название.
И кличат им точку входа(entrypoint), или я чегото не допонимаю?
Если так, то поясните пожалуисто.
← →
Игорь Шевченко © (2004-06-30 11:39) [54]Тимохов © (30.06.04 11:11)
> 1. Почему в dll создается таблица релокации, а в exe нет?
Почему не пользоваться TDUMP прежде чем задавать подобные вопросы? Практика - критерий истины.
← →
Digitman © (2004-06-30 11:40) [55]
> SammIk © (30.06.04 11:28) [53]
все верно понимаешь.. но что тебе из всего этого остается неясным ?
← →
SammIk © (2004-06-30 11:43) [56]Тогда все понятно, просто выш светло голубои
(c)
с понтолыку иногда сбивает.
Малоли что, вдруг что-то не допонимаю.
← →
SammIk © (2004-06-30 11:43) [57]Кстати, да простят знающие, можно ручками создать
таблицу релоков.
← →
SammIk © (2004-06-30 11:45) [58]Удалено модератором
Примечание: Offtopic
← →
Тимохов © (2004-06-30 11:46) [59]
> Игорь Шевченко © (30.06.04 11:39) [54]
> Почему не пользоваться TDUMP прежде чем задавать подобные
> вопросы? Практика - критерий истины.
Силился понять, как этот ответ (выше) отностися к этому вопросу (ниже) :))
> > 1. Почему в dll создается таблица релокации, а в exe нет?
tdump я полльзовался. О чем я выше и сказал. А также спросил про формат данных, которые tdump выдает. Он описан где нибудь?
Все же - один и тот же код в dll делает перемещаемым, в exe - нет. Можно ли в дельфи управлять перемещаемостью кода? НАсколько я понимаю в dll это делается само, в exe - нет.
← →
Тимохов © (2004-06-30 11:58) [60]
> SammIk © (30.06.04 11:43) [57]
Наверное, можно и ручками (не знаю).
Но ведь и компилятор должен предоставлять такой сервис?
Для dll он же это радостно делает. Почему не хочет для exe?
Посмотрел вчера директивы компилятора: знаний не хватает, чтобы понять есть ли такая директива. Есть там, что-то по управлению PE флагами.
← →
Игорь Шевченко © (2004-06-30 12:17) [61]Тимохов © (30.06.04 11:46)
> Силился понять, как этот ответ (выше) отностися к этому
> вопросу (ниже) :))
Ответ относится так, что у EXE есть таблица Fixup(Relocations), как и у DLL
← →
Тимохов © (2004-06-30 12:21) [62]
> Игорь Шевченко © (30.06.04 12:17) [61]
Спасибо, что принмаете участие в этом обсуждении.
Про fixup у exe я понял - посмотрю внимательнее.
Но как относиться к тому, что у dll в нее внесены константные строки, а в exe - нет. Я же не делал никаких действий ни в том ни в другом случае. Это на компилятор дельфи директивы labrary и program так действуют?
Т.е. никто не говорит о том, где свзять описание формата данных, выдаваемых tdump, то я прихожу к выводу, что такого формата нет, а для того, чтобы понимать, что там написано, нужно просто хорошо знать структуру исполняемых модулей, например, изучив msdn и другие источники. Так?
← →
Тимохов © (2004-06-30 12:24) [63]Попытаюсь объяснить, зачем это нужно.
Вопрос возник просто как теоретический. Но сейчас в том, чтобы делать export функции в своей программе я вижу практические выгоды. Не буду говорить какие, т.к. ногами затоптать могут (скажут пользуйся com и не умничай :))).
Поэтому вопрос из чистого любопытсва для меня перешел в разряд важных с практической точки зрения.
← →
Игорь Шевченко © (2004-06-30 12:28) [64]Тимохов © (30.06.04 12:24)
Есть встречное предложение: Ты собираешь ма-аленький неработающий пример, со всеми EXE, PAS"ами, DPR"ами и прочими нужными файлами, посылаешь мне на почту. Я не гарантирую, что посмотрю быстро, но специально для этого мне разрабатывать проект некогда. Результаты своих наблюдений я сообщу в форум.
← →
Тимохов © (2004-06-30 12:31) [65]
> Игорь Шевченко © (30.06.04 12:28) [64]
Отличное предложение.
Завтра составлю и пришлю пример с документацией, о том, что не не понятно и что понятно. А также вопросы.
Спасибо.
:)
← →
Piter © (2004-06-30 15:05) [66]Я тоже очень заинтересовался фактом, "открытым" Тимоховым. Очень хотел бы знать его объяснение
← →
Тимохов © (2004-06-30 15:12) [67]Удалено модератором
Примечание: Offtopic
← →
Тимохов © (2004-06-30 15:13) [68]Удалено модератором
Примечание: Offtopic
← →
Тимохов © (2004-06-30 18:00) [69]
> Игорь Шевченко © (30.06.04 12:28) [64]
Вопрос-уточнение про формат примера, который я хочу Вам предоставить.
Скажите нужно или мне в комментирии к каждой выписывать асм код, который у меня получается или нет?
← →
Игорь Шевченко © (2004-07-01 00:50) [70]Тимохов © (30.06.04 18:00)
> Скажите нужно или мне в комментирии к каждой выписывать
> асм код, который у меня получается или нет?
Я думаю, не стоит. Мне главное, чтобы его можно было быстро и ничего не настраивая, собрать и запустить.
← →
Piter © (2004-07-02 21:37) [71]ну и как там что?
← →
GrayFace © (2004-07-03 07:41) [72]Похоже, все это связано именно с System и SysUtils. В Delphi есть менеджер памяти, находящийся в одном из этих модулей. Глобальное выделение памяти идет чераз него, а, значит, не идет в данном случае.
Попробуй так:
procedure ...;
const Text="text"; Caption="Caption";
begin
MessageBox(0, Text, Caption, MB_OK);
end;
Digitman [45]
>задействуя дин.тип, ты задействуешь как минимум модули system и sysutils, которые не инициализированы
Я так не думаю. ИМХО, это обычный PChar с выделением памяти. Если бы каждый раз, когда нужна строка, компилятор ставил обращение к System и/или SysUtils, то оптимизация летела бы к чертям... тоже ИМХО.
← →
GrayFace © (2004-07-03 07:49) [73]Ой. Я ступил в ответе на [45].
А так точно должно работать:procedure ...;
const Text:ShortString="text"; Caption:ShortString="Caption";
begin
MessageBox(0, Text, Caption, MB_OK);
end;
← →
Piter © (2004-07-05 23:46) [74]Игорь Шевченко (01.07.04 00:50) [70]
ну так как ваше мнение?
← →
Тимохов © (2004-07-06 10:37) [75]
> Piter © (05.07.04 23:46) [74]
Игорь сказал, что нам придется подождать, т.к. у него отпуск.
Но после он обязательно посмотрит.
← →
Piter © (2004-07-08 12:16) [76]Удалено модератором
Примечание: Offtopic
← →
Piter © (2004-07-11 12:43) [77]И когда мы увидим ответ? Ветка умерт к тому времени?
← →
SammIk © (2004-07-11 20:17) [78]Слухаи, и мне пошли свои ваилик, тож интересно скомпилить да поразбирать.
sammik(DOG)mail(DOT)ru
Скорее всего в понедельник скажу, вот экзамен сдам))
← →
Тимохов © (2004-07-12 12:05) [79]
> Piter © (11.07.04 12:43) [77]
потерпите - я же объяснил в чем дело.
вопрос не помрет - уверяю вас. :)))
← →
SammIk © (2004-07-12 17:55) [80]
Из дизасма:
CODE:0044DBF4 public ExportFunctionWithStringConst
CODE:0044DBF4 ExportFunctionWithStringConst proc near
CODE:0044DBF4 push 0
CODE:0044DBF6 push 44DC08h<<<Конкретно компилер подвел нас, записал пуш статически((CODE:0044DBFB push 44DC08h<<<Тут тоже
CODE:0044DC00 push 0
CODE:0044DC02 call pMessageBoxA
CODE:0044DC07 retn
CODE:0044DC07 ; ---------------------------------------------------------------------------
CODE:0044DC08 db 68h ; h<<Наша HI
CODE:0044DC09 db 69h ; iС дугои функциеи дела проще
:
CODE:0044DBD0 public ExportFunctionWithCharArray
CODE:0044DBD0 ExportFunctionWithCharArray proc near
CODE:0044DBD0
CODE:0044DBD0 var_2 = byte ptr -2
CODE:0044DBD0 var_1 = byte ptr -1
CODE:0044DBD0
CODE:0044DBD0 push ecx
CODE:0044DBD1 mov byte ptr [esp+0], 68h
CODE:0044DBD5 mov [esp+3+var_2], 69h
CODE:0044DBDA mov [esp+3+var_1], 0
CODE:0044DBDF push 0
CODE:0044DBE1 lea eax, [esp+4]<<Тут переменные грузит из стека, динамически
CODE:0044DBE5 push eax
CODE:0044DBE6 lea eax, [esp+8]
CODE:0044DBEA push eax
CODE:0044DBEB push 0
CODE:0044DBED call pMessageBoxA
CODE:0044DBF2 pop edx
CODE:0044DBF3 retn
CODE:0044DBF3 ExportFunctionWithCharArray endp ; sp = -10h
___________________________________________А это вообще одельно
CODE:0044DBED call pMessageBoxAОн сначала кидает нас сюда:
CODE:00406D28 pMessageBoxA proc near ;
CODE:00406D28 ;
CODE:00406D28 jmp ds:MessageBoxA_0
CODE:00406D28 pMessageBoxA endpА потом джампаем сюда:
.idata:00450490 extrn MessageBoxA_0:dword ;
Таким образом, когда первую грузит вторая прога, то мы при вызове
CODE:0044DBED call pMessageBoxA
поподаем в адресное пространство вызывающеи проги, а не нашеи
псевдодлл.
А по этому адресу малоли чего может быть.
Лично у меня не работал ни первыи, ни второи вариант.
>>>Тоесть правильно что у тебя ацессвиол, это следствие того, что мы колимся в кудато-туда, а не туда куда надо))
Релоки есть, но мне надо про них скил поднять.
Потом скажу что релокают, а что нет))
Страницы: 1 2 3 вся ветка
Текущий архив: 2004.09.19;
Скачать: CL | DM;
Память: 0.65 MB
Время: 0.024 c