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

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

Формат map файла


Страницы:   1 2

Виктор007 ©   (2007-09-05 20:47:00) 

Здравствуйте! Пытаюсь разобраться с map файлом генерируемом Delphi.
Мне из Map-файла нужно выудить адрес такой переменной:
const
 langstrings: array[0..sizeof(langarray)-1] of char = 'tr54455777654440';


в файле я нашел следующую строчку:
0002:00013948       langstrings

но вот по адресу 00013948h находится какая-то билиберда. Как узнать по какому смещению в файле программы находится строка tr54455777654440  используя map файл мне непонятно...


Виктор007   (2007-09-06 18:46:00) [1]

Мдям, что-то не получилось как я хотел...
Такая запись не проходит,
const
 langstrings: langarray;


Пришлось так оставить
const
 langstrings: array[0..sizeof(langarray)-1] of char = '';


Dimaxx   (2007-09-06 17:39:00) [2]


> Фрагмент программы мнооязыковой:
>
> type
>  Tlanguage = record
>    S: string[255];
>    crypt: boolean;
>  end;
>  LangArray = array[0..50] of Tlanguage;
> ....
> const
>  langstrings: array[0..sizeof(Langarray)-1] of char = 'tr54455777654440';
>  //Языковые строки
>
> .....
> function TForm1.GetLngStringByID(id: integer): string;
> begin
> if langarray(langstrings)[id].crypt then
>   result := DecodeStr(langarray(langstrings)[id].S)
> else
>   result := langarray(langstrings)[id].S;
> end;
>
> ....
> //Установка интерфейса
> // Применяем настройки внешнего вида окна.
> btnRun.Caption := GetLngStringByID(0);
> btnRun.Hint.Text := GetLngStringByID(1);
> btnMore.Caption := GetLngStringByID(2);
>
>
> Фрагмент программы - редактора языков:
>
> // Определение адреса массива строк в файле программы
> langstrings.Addr     := ScanFile('testproga.exe', 'tr54455777654440',
>  false);
> // Запись по этому адресу массива строк
> ...
>  Seek(f, Client.langstrings.Addr);
>  BlockWrite(f, langstrings, sizeof(LangArray));
> ...
>
>
> Так вот, мне хочется искать не сканируя сам exe файл, а
> сканируя map файл, т.к. это будет вроде как нагляднее и
> понятнее...
>

Такого бреда еще не видел. Море реализаций многоязыковых приложений, но этот нуна в орешник прямой дорогой...


Сергей М.   (2007-09-06 16:52:00) [3]


> Dib@zol ©   (06.09.07 16:50) [22]


> ЧЁ???


Тебя это не касается)


Dib@zol   (2007-09-06 16:50:00) [4]

> гигабайтных исполняемых модулях

ЧЁ??? <8() Это ты про установочные комплекты?


Сергей М.   (2007-09-06 16:40:00) [5]


> Если пихать все в ресурсы то приложение на пару килобайт
> будет больше.
>


Еще один ловец блох)

Ну и что ?

Что такое 2К при современных гигабайтныхисполняемых модулях ?
Слону дробина ?)


> Смещение в файле данных этой константы находится по адресу


Смещение секции не постоянно и определяется PE-загрузчиком в ран-тайм.


Anatoly Podgoretsky   (2007-09-06 16:36:00) [6]

> Виктор007  (06.09.2007 16:19:19)  [19]

Этот адрес определяется в момент загрузки приложения.


Виктор007   (2007-09-06 16:19:00) [7]

> Любопытно было бы узнать почему ...
Если пихать все в ресурсы то приложение на пару килобайт будет больше.

Да, разобрался, в моем случае
0002:00013948       langstrings

Смещение в файле данных этой константы находится по адресу:
Смещение секции DATA + 00013948 = 2D400 + 13948 = 40D48

Мне как раз и нужен был этот адрес.


Сергей М.   (2007-09-06 15:39:00) [8]


> От ресурсов я намеренно отказался - это для меня не подходит


Любопытно было бы узнать почему ..


> Вопрос у меня стоит про формат map файла


Он прост до безобразия:

Секция:Смещение СимвольныйИдентификатор


Инс   (2007-09-06 15:37:00) [9]


> скажем с Фаронова

Фаронов - это в принципе тоже база. Ничего сверхъестественного в его книгах нет, но несмотря на это они достаточно хорошего качества.


Dib@zol   (2007-09-06 15:35:00) [10]

> [14] Anatoly Podgoretsky ©   (06.09.07 15:31)

Извините конечно, но начать сразу, скажем с Фаронова, я не мог. Нужны были хоть какие-то азы.


Инс   (2007-09-06 15:34:00) [11]


> Anatoly Podgoretsky ©   (06.09.07 15:31) [14]

Радует, что "вся жизнь" у парня еще впереди, так что ситуация поправима.


Anatoly Podgoretsky   (2007-09-06 15:31:00) [12]

> Dib@zol  (06.09.2007 15:29:13)  [13]

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


Dib@zol   (2007-09-06 15:29:00) [13]

> [11] Инс ©   (06.09.07 15:20)

В 98-м debug по-моему реально получает физический доступ к РАМе. Это я взял не с потолка, это было, кажется, у Сергея Симоновича. Была у меня такая книжка "занимательное программирование", для полных ЛМД. Я начинал с неё. И вот там это и было сказано. Так что если что - претензии не ко мне.


Виктор007   (2007-09-06 15:23:00) [14]

От ресурсов я намеренно отказался - это для меня не подходит. Вопрос у меня стоит про формат map файла, меня это интересует не только со стороны использования языков...


Инс   (2007-09-06 15:20:00) [15]


> Наверняка, существуют проги и посовременней. Я просто пример
> привёл.

Тут дело не в программе. Операционная система не дает приложениям работать с физическими адресами. А если копнуть еще глубже, то дело даже не в системе, а в принципах защищенного режима работы микропроцессора.


Сергей М.   (2007-09-06 15:19:00) [16]


> смещение этой переменной мскать по map файлу


Ты что-нибудь про ресурсы исп.файла слышал ?

С языковой конструкцией resourcestringзнаком ?

Ведь велосипед изобретаешь) .. С квадратными колесами)


Виктор007   (2007-09-06 14:40:00) [17]

Т.е. мне это нужно чтобы не применять в программе такие метки
const
langstrings: array[0..sizeof(Langarray)-1] of char = 'tr54455777654440';


после чего необходимо приведение типов, а использовать нормальные строки
const
langstrings: Langarray;

А смещение этой переменной мскать по map файлу а не по метке 'tr54455777654440'
Так выглядеть исходник будет понятней и меньше путаницы.


Виктор007   (2007-09-06 14:35:00) [18]

В программе используется многоязычность. Сейчас реализовал так:
Фрагмент программы мнооязыковой:

type
 Tlanguage = record
   S: string[255];
   crypt: boolean;
 end;
 LangArray = array[0..50] of Tlanguage;
....
const
 langstrings: array[0..sizeof(Langarray)-1] of char = 'tr54455777654440'; //Языковые строки

.....
function TForm1.GetLngStringByID(id: integer): string;
begin
if langarray(langstrings)[id].crypt then
  result := DecodeStr(langarray(langstrings)[id].S)
else
  result := langarray(langstrings)[id].S;
end;

....
//Установка интерфейса
// Применяем настройки внешнего вида окна.
btnRun.Caption := GetLngStringByID(0);
btnRun.Hint.Text := GetLngStringByID(1);
btnMore.Caption := GetLngStringByID(2);


Фрагмент программы - редактора языков:

// Определение адреса массива строк в файле программы
langstrings.Addr     := ScanFile('testproga.exe', 'tr54455777654440', false);
// Запись по этому адресу массива строк
...
 Seek(f, Client.langstrings.Addr);
 BlockWrite(f, langstrings, sizeof(LangArray));
...


Так вот, мне хочется искать не сканируя сам exe файл, а сканируя map файл, т.к. это будет вроде как нагляднее и понятнее...


Anatoly Podgoretsky   (2007-09-06 14:30:00) [19]

00013948h это относительный адрес, к нему наверно надо добавить смещение базы.


Dib@zol   (2007-09-06 14:02:00) [20]

> [5] DrPass ©   (06.09.07 14:00)

Наверняка, существуют проги и посовременней. Я просто пример привёл.


Страницы:   1 2

Наверх

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