Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Embarcadero RAD Studio XE3

Модерирует : ShIvADeSt

 Версия для печати • ПодписатьсяДобавить в закладки
Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

Открыть новую тему     Написать ответ в эту тему

Aleksandr N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Подскажите решение, хотя возможно немного не туда пишу.
Наткнулся на такую проблему при компиляции под 64 бит.
Есть две записи типа:
 
  Paaa = ^aaa;
  aaa = record
   aaaa: Integer;
  end;
 
  bbb = record
   bbbb: Paaa;
  end;
 
В 32-битном приложении размер SizeOf(bbb) равен 4, а в 64-битном равен 8. Понятно, что это из-за размера Pointer. В 64-битном он равен 8.
Вопрос: как сделать чтобы в 64-битном приложении размер bbb был бы равен 4, а не 8.
Записи должны иметь именно такой вид, это связано с обработкой OBJ файлов.
Спасибо.

Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 18:40 10-01-2013
DeathMAD

Junior Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Лечение моей проблемы
 
REGEDIT4
 
[HKEY_CLASSES_ROOT\.htm]
"Content Type"="text/html"
"Perceived Type"="text"
 
 
[HKEY_CLASSES_ROOT\.html]
"Content Type"="text/html"
"Perceived Type"="text"
 
Спасибо за chm настройки, но проблема, как оказалось в итоге, была не в нём.

Всего записей: 114 | Зарегистр. 13-10-2004 | Отправлено: 21:14 10-01-2013
HeMet

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aleksandr N
А как указатели на память связаны с файлами на диске? В объектники, наверное, пишется смещение каких-то данных внутри файла, а не указатели.
Ну а вообще на ум приходит разве что вместо указателя использовать 32 разрядное целое и приводить его к указателю, когда надо. Но этот изврат полный, сопряженный с очевидными проблемами, потому как под x64 нету никаких «коротких указателей».
Поэтому, короткий ответ, наверное: никак, при условии сохранения в структуре указателя.
Собственно, в справке по Делфи тоже никаких намеков, что это возможно: http://docwiki.embarcadero.com/RADStudio/XE3/en/64-bit_Windows_Data_Types_Compared_to_32-bit_Windows_Data_Types

Всего записей: 212 | Зарегистр. 05-09-2007 | Отправлено: 22:21 10-01-2013
Aleksandr N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
HeMet
В принципе с файлами на диске это не связано никак.
Ну чтобы совсем понять степень моего извращения нужно обратится к конкретной задаче. Возникла необходимость внести изменения в файл Vcl.Imaging.jpeg.pas. Проблема сразу возникла при определении размера заголовка картинки. Из-за того, что Pointer в 64-битах равен 8, то соответственно увеличивается размер записи под заголовок. Вот, по началу, и нужно привести этот заголовок в соответствие. Записи там приведены именно так.
Ну а так, новых мыслей не у кого не возникло?

Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 22:37 10-01-2013
Arioch1



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
а без перекомпиляции в памяти нельзя пропатчить нужную функцию ?

Всего записей: 904 | Зарегистр. 03-03-2010 | Отправлено: 22:49 10-01-2013
Aleksandr N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arioch1
Считаю что нет, по крайней мере я не вижу способа. И честно говоря не люблю использовать модули без исходников.
Ещё раз уточню, проблема не в получении OBJ файлов под 64. Проблема именно на первом шаге, в размере заголовка. Считывается заголовок с неверным размером и, соответственно, код считает, что не верный заголовок картинки с номером ошибка №21.

Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 23:02 10-01-2013
HeMet

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Aleksandr N
Т.е. у Вас есть файл Vcl.Imaging.jpeg.pas, в который вы хотите внести изменения, но не хотите менять сам файл, поэтому Вы хотите внести изменения в OBJ файл, полученный из него, а потом скормить этот файл компоновщику, который с ним соберет программу? Или я чего-то не понимаю?

Всего записей: 212 | Зарегистр. 05-09-2007 | Отправлено: 23:23 10-01-2013 | Исправлено: HeMet, 23:25 10-01-2013
Aleksandr N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
HeMet
Не совсем так. Есть Vcl.Imaging.jpeg.pas, есть исходники JPEG на "С" из которых получены 64-битные OBJ файлы. Вносятся изменения в PAS файл и при перекомпиляции просто прилинковываются OBJ файлы.

Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 23:34 10-01-2013
Arioch1



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Скорее он хочет перекомпилировать в 64-бита этот юнит. Правда не знаю, есть ли в составе Дельфи 64-битные OBJ-файлы.
 
Я бы скорее пробовал найти другой, независимый загурзчик jpeg-файлов. Graphics32, GraphicEx, Vampyre Imagine, ....
 
Добавлено:
А где именно изменения нужны, в C-файле или PAS-файле ?
Патчить чистую паскаль-функцию без внешних ссылок не очень сложно.

Всего записей: 904 | Зарегистр. 03-03-2010 | Отправлено: 23:46 10-01-2013
Aleksandr N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arioch1

Цитата:
Скорее он хочет перекомпилировать в 64-бита этот юнит.

Именно так.

Цитата:
Правда не знаю, есть ли в составе Дельфи 64-битные OBJ-файлы

Нет, но я их получил из исходников библиотеки.

Цитата:
А где именно изменения нужны, в C-файле или PAS-файле ?

В PAS.

Цитата:
Патчить чистую паскаль-функцию без внешних ссылок не очень сложно.

Честно сказать что "БЕЗ", что "С" не представляю как...
Считаю что нуосто привести размер заголовка к нужному значению, но опять-же не понятно как.
Проблема начинается вот где:
 
procedure TJPEGImage.ReadStream(Size: Longint; Stream: TStream);
...
jpeg_CreateDecompress(cinfo, JPEG_LIB_VERSION, sizeof(cinfo));
...
 
Вот этот "sizeof(cinfo)" под 64-бита больше нужного, а структура "cinfo" жестко определена...

Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 00:09 11-01-2013
Arioch1



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
копируешь текст процедуры целиком в другой юнит.
Вносишь изменения.
Компилируешь, чтобы проверить что нет левых внешних ссылок.
 
http://qc.embarcadero.com/wc/qcmain.aspx?d=111277
в комментах показано как новая функция вставляется вместо старой.
единственное нужно будет в отладчике в CPU mode найти другой двоичный кусок для проверки, что все правильно, иначе после какого-нибудь апдейта функция может начать ломать RTL

Всего записей: 904 | Зарегистр. 03-03-2010 | Отправлено: 00:19 11-01-2013
Aleksandr N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arioch1
Я конечно почитаю, но судя по имеющимся там исходникам всё это слишком сложно для пары строк изменения в оригинальном исходнике.
 
Может кто-то предложит иной способ приведения заголовка к нужному размеру...?
Приветствуются (рассмотрю) самые безумные идеи.

Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 00:24 11-01-2013
Arioch1



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
структура "cinfo" жестко определена...

и правильно определена. Потому что в C такая же.
 
Разбирайся почему разные длины, може быть packed record надо или data alignment отключить...
Или ты таки делаешь 32-битные OBJ'и
 
Но это именно указатель и он должен быть 64 бита.
 
И еще раз скажу - возьми лучше другйо JPEG-декодер найди
 
Добавлено:

Цитата:
всё это слишком сложно

если так - то держись подальше от двочиный интерфейсов вообще. OBJ, DLL - ты с ними не справишься при малейшей проблеме.
 

Цитата:
иной способ приведения заголовка к нужному размеру

а зачем ?
Чтобы волшебная фея его скомпилировала как угодно ?
это же не самоцель.
 
Цель - чтобы совпала побайтовое расположение и побайтовый смысле всех полей в структуре.
Побайтово!
Низкий, двоичный уровень.
 
Даже если размер совпадет - ты сможешь проконтролировать, что какое-то поле там не сместилось на чуточку другое место ?  
 
Твой исходный вопрос, если по простому: "помогите воткнуть мобильник в розетку, он туда не влезает, как бы его обточить". У тебя даже мысли не возникает, что форма розетки не просто так придумана и мобильник на 220В не рассчитан. И следовательно его туда не надо втыкать.
 
Я тебе очень не советую с таким опытом и представлением лезть в OBJ-файлы и другие бинарники.
Ищи готовые pure pascal библиотеки.

Всего записей: 904 | Зарегистр. 03-03-2010 | Отправлено: 00:38 11-01-2013
Aleksandr N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Arioch1
Разные длины именно из-за вот такой, определённой структуры записей:
  Paaa = ^aaa;  
  aaa = record  
   aaaa: Integer;  
  end;  
 
  bbb = record  
   bbbb: Paaa;  
  end;  
packed record ставил, не помогло

Цитата:
data alignment отключить

Это как?
Делаю ИМЕННО 64-битные OBJ.
Другой декодер - тоже вариант, но если только с этим ничего не получится, Кстати, краем глаза уже смотрел - по-моему у замеченных мной декодеров то-же какие-то проблемы под 64.

Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 00:48 11-01-2013
Arioch1



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
В C структура такая же.
 
Если не совпадает - разбирайся как именно отображаются в CLang и в Delphi разные типы данных на физическую низкоуровневую память при любых настройках компилятора.
И не забудь, что CLang в исполнение EMB очень глючный. Если ты им компилируешь, а не GCC/ICC/MSVC++/etc
 
Когда разберешься - проанализируй как именно эти поля расположились в C коде, проще всего это сделать просмотрев ассемблерный код получившийся из C модуля, там где он обращается к этоим типам данных.
 
И т.д.

Всего записей: 904 | Зарегистр. 03-03-2010 | Отправлено: 00:53 11-01-2013
Aleksandr N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Компилирую MVS 2010, с остальным попробую разобраться...

Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 00:58 11-01-2013
HeMet

Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
Компилирую MVS 2010

Такс... VS вроде объектники создает в формате COFF, а Делфи использует и понимает только OMF. Наверное, нужно компилировать в Билдере.
И как уже говорили, нужно разбираться с выравниванием данных в структуре и добиваться двоичного соответствия, тогда при наличии исходников на С и Delphi не нужно будет ничего патчить в объектниках.

Цитата:
И не забудь, что CLang в исполнение EMB очень глючный

А на QC всего три бага открыто

Всего записей: 212 | Зарегистр. 05-09-2007 | Отправлено: 16:32 11-01-2013
AlekXL



Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Посоветуйте!  
Мне нужен некоторый функционал РТТИ, или что-то подобное. Итак
1.Есть некоторый интерфейсный тип, ImyType, скажем, унаследованный от IDispatch
2.функция принимает экзепляр интерфейса ImyType, и массив аргументов array of const, или, быть может array of TValue,  
3. и ей нужно вызвать некий метод экземпляра с некоторым именем, хранящимся в строке (e.g. 'Execute'), но сигнатура его неизвестна(неизвестны параметры)
4. то есть нужно в принципе реализовать стандартную COM  авто диспетчеризацию,
НО
5. решение, крайне желательно, а)должно быть совместимо со стандатным Win32 COM,  
   б)НО не должно быть завязано лишь только на этой платформе.
---
в принципе, я поискал решения, но D2010 RTTI завязан на классы, а не на интерфесы, например
  ti:=lContext.GetType((itask as  TObject).ClassType );
 так что все завязано на лишь только дельфийские классы. Это не то. Да еще , говорят, там полно багов
А я хочу, чтобы код мог вызывать методы экзепляра, реализованного даже на скриптовом языке с поддержкой IDispatch.
 
---
если же копать все же в интефейсную реализацию, то  
1) есть ли  межъязыковые интефейсы в unix-подобных(Мак, Линь) и  Андроид системах?
2) как проще всего реализовать IDispatch для класса ? TAutoObject или что?

Всего записей: 792 | Зарегистр. 24-04-2008 | Отправлено: 17:04 11-01-2013 | Исправлено: AlekXL, 17:05 11-01-2013
Blind

Full Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
1. Как изменить базовый цвет фона по умолчанию для цветовой схемы (редактора кода)?
2. Можно ли экспортировать/импортировать цветовые схемы?

Всего записей: 592 | Зарегистр. 06-10-2003 | Отправлено: 17:09 11-01-2013 | Исправлено: Blind, 17:24 11-01-2013
Aleksandr N

Advanced Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
HeMet
Неа, начиная с XE2 идёт поддержка COFF. А под 64 в Билдере OBJ получить нельзя.
Проект компилируется без проблем, вот только не работает.

Всего записей: 1665 | Зарегистр. 25-02-2008 | Отправлено: 17:34 11-01-2013 | Исправлено: Aleksandr N, 17:38 11-01-2013
Открыть новую тему     Написать ответ в эту тему

Страницы: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57

Компьютерный форум Ru.Board » Компьютеры » Прикладное программирование » Вопросы по Embarcadero RAD Studio XE3


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru