Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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
14-1093623426
Michael
2004-08-27 20:17
2004.09.19
Посоветуйте как лучше разбить диск на 80Гб


4-1091110061
kblc
2004-07-29 18:07
2004.09.19
Как для TRichEdit организовать прозрачность?


14-1093769352
kaif
2004-08-29 12:49
2004.09.19
Хорошее применение для метода LIFO в складском учете


1-1093955952
IXT
2004-08-31 16:39
2004.09.19
Dll


14-1094032850
megabyte
2004-09-01 14:00
2004.09.19
Neverending story