Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Внести изменить в VCL\RTL, Как это сделать? 
:(
    Опции темы
Gnusss
  Дата 2.5.2007, 22:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 19.1.2005

Репутация: нет
Всего: нет



Привет всем.

Собственно вот в чем проблема, в CodeGear когда делали Delphi 2007 допустили, одну (хотя, наверное больше) ошибку в файле UxTheme.pas (конкретно с функцией DrawThemeTextEx), ну так вот я хочу исправить эту ошибку, но простого изменения UxTheme.pas не достаточно, т.е. делфи просто игнорирует всё что я там пишу.

От суда вопрос, как правильно вносить изменения в файлы VCL\RTL чтобы дефли реагировала на их изменения.

Заранее благодарю за ответ!

PM MAIL   Вверх
Bose
Дата 3.5.2007, 03:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Я не слышал, чтобы кому-нибудь удалось пересобрать и установить модифицированный VCL\RTL.

Но если положить изменённый файл в папку с проектом, и использовать его непосредственно в проекте, то проект скомпилируется с изменённым вариантом. Хотя сомневаюсь, что это повлияет на VCL-контролы. И при компиляции с Runtime packages это наверно не окажет эффекта.

Добавлено через 33 секунды
Есть ещё вариант. Не знаю как его обозвать. Использовать те же методы что и используются в проектах типа FastCode и FastMove. На сайте он назван RTL patching
Для этого понадобится модуль FastCodePatch из проекта FastCode. Вот он:
Код

unit FastcodePatch;

(* ***** BEGIN LICENSE BLOCK *****
 * Version: MPL 1.1
 *
 * The contents of this file are subject to the Mozilla Public License Version
 * 1.1 (the "License"); you may not use this file except in compliance with
 * the License. You may obtain a copy of the License at
 * http://www.mozilla.org/MPL/
 *
 * Software distributed under the License is distributed on an "AS IS" basis,
 * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
 * for the specific language governing rights and limitations under the
 * License.
 *
 * The Original Code is Fastcode
 *
 * The Initial Developer of the Original Code is Fastcode
 *
 * Portions created by the Initial Developer are Copyright (C) 2002-2005
 * the Initial Developer. All Rights Reserved.
 *
 * Contributor(s):
 * Charalabos Michael <[email protected]>
 *
 * ***** END LICENSE BLOCK ***** *)

interface

function FastcodeGetAddress(AStub: Pointer): Pointer;
procedure FastcodeAddressPatch(const ASource, ADestination: Pointer);

implementation

uses
  Windows;

type
  PJump = ^TJump;
  TJump = packed record
    OpCode: Byte;
    Distance: Pointer;
  end;

function FastcodeGetAddress(AStub: Pointer): Pointer;
begin
  if PBYTE(AStub)^ = $E8 then
  begin
    Inc(Integer(AStub));
    Result := Pointer(Integer(AStub) + SizeOf(Pointer) + PInteger(AStub)^);
  end
  else
    Result := nil;
end;

procedure FastcodeAddressPatch(const ASource, ADestination: Pointer);
const
  Size = SizeOf(TJump);
var
  NewJump: PJump;
  OldProtect: Cardinal;
begin
  if VirtualProtect(ASource, Size, PAGE_EXECUTE_READWRITE, OldProtect) then
  begin
    NewJump := PJump(ASource);
    NewJump.OpCode := $E9;
    NewJump.Distance := Pointer(Integer(ADestination) - Integer(ASource) - 5);

    FlushInstructionCache(GetCurrentProcess, ASource, SizeOf(TJump));
    VirtualProtect(ASource, Size, OldProtect, @OldProtect);
  end;
end;

end.


Применяется следующим образом:
Код

  FastcodeAddressPatch(FastcodeGetAddress(@ProcedureToPatchOld), @ProcedureToPatchNew);

// у них было так:
  FastcodeAddressPatch(FastcodeGetAddress(@StringReplace), @FastcodeAnsiStringReplace);


Сам я не проверял - нужды не было, так что это вполне может и не работать.  smile А может и сработать.  smile 

Так или иначе отпишись о результатах плииз.  smile 
PM MAIL WWW Skype   Вверх
Gnusss
  Дата 3.5.2007, 10:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 19.1.2005

Репутация: нет
Всего: нет



В общем вот что получилось:

1. Заставить работать код из FastcodePatch у меня почему-то не получилось. Пробовал с тем же StringReplace и никаких изменений. Конкретно у меня не проходила вот эта проверка 
Код
if PBYTE(AStub)^ = $E8 then


2. Даже если бы это всё и заработало, мне бы это всё ровно не помогло, т.к. в UxTheme ошибка в описании функции (конкретно там последний параметр не того типа которого должен). Т.е все ровно бы пришлось заново описывать функцию.

Я вот еще что подумал:

1. В папке "...\source\Win32\rtl\" лежит файл "makefile", если я правильно понял он то как раз и нужен для перекомпиляции (пере борки RTL). Но при выполнении команды "make" вот какой результат я увидел:
Код

C:\Program Files\CodeGear\RAD Studio\5.0\source\Win32\rtl>make
MAKE Version 5.2  Copyright (c) 1987, 2000 Borland
        dcc32 -q sys\system -m -y -z -$D- -nlib
CodeGear Delphi for Win32 compiler version 18.5
Copyright (c) 1983,2007 CodeGear
sys\System.pas(537) Warning: W1000 Symbol 'TVariantManager' is deprecated
sys\System.pas(631) Warning: W1000 Symbol 'TMemoryManager' is deprecated
sys\System.pas(939) Warning: W1000 Symbol 'TMemoryManager' is deprecated
sys\System.pas(940) Warning: W1000 Symbol 'TMemoryManager' is deprecated
sys\System.pas(975) Warning: W1000 Symbol 'THeapStatus' is deprecated
sys\System.pas(1221) Warning: W1000 Symbol 'TVariantManager' is deprecated
sys\System.pas(1222) Warning: W1000 Symbol 'TVariantManager' is deprecated
sys\SysInit.pas(838) Fatal: F2039 Could not create output file 'lib\SysInit.dcu'


** error 1 ** deleting lib\system.dcu

C:\Program Files\CodeGear\RAD Studio\5.0\source\Win32\rtl>


2. Для делфи же выходят официальные заплатки, которые исправляют разные ошибки и в RTL и в VCL, значит (наверное) можно сделать собственную заплатку.

3. Еще один вариант есть, скомпилировать исправленный файл UxTheme, и получившийся dcu кинуть в папку "...\lib\" правда не знаю поможет ли. Надо попробовать.

Добавлено через 11 минут и 6 секунд
Восле встаыки "нового" UxTheme.dcu в папку "...\lib\", при компиляции появилась след. ошибка:
Цитата
 [DCC Error] Ultimate.dpr(43): F2051 Unit StdCtrls was compiled with a different version of UxTheme.DrawThemeTextEx

PM MAIL   Вверх
mutex
Дата 3.5.2007, 11:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 17.10.2004

Репутация: нет
Всего: 3



Гляньте сюда: "Creating a debug version of the vcl package"
http://blogs.teamb.com/davenottage/archive...9366.aspx#20440

Этим способом удалось перекомпилировать VCL для Delphi7.
Интересно, сработает ли это для  Delphi2007?
PM MAIL   Вверх
Gnusss
Дата 3.5.2007, 12:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 190
Регистрация: 19.1.2005

Репутация: нет
Всего: нет



Цитата(mutex @  3.5.2007,  11:14 Найти цитируемый пост)
Гляньте сюда: "Creating a debug version of the vcl package"
http://blogs.teamb.com/davenottage/archive...9366.aspx#20440

Не открывается. :(
PM MAIL   Вверх
Bose
Дата 3.5.2007, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Участник Клуба
Сообщений: 1458
Регистрация: 5.3.2005
Где: Riga, Latvia

Репутация: 23
Всего: 51



Цитата(Gnusss @  3.5.2007,  12:17 Найти цитируемый пост)
Не открывается. :(

Вот текст с этой страницы:
Цитата

Ever have a package-based application that has been affected by a bug in the VCL? If so, you'll know how difficult it can be to hunt it down. I had one recently, so I began searching for exactly how to debug into the VCL source when using packages. Oddly, I found very little info on the subject. Fortunately, I found enough info and knew enough myself already to achieve it. Here's how, as it applies Delphi 7. For other versions of Delphi, use the corresponding suffix, eg 50 for Delphi 5, 60 for Delphi 6 etc, in place of 70. 

1. Start a new package, by clicking File|New|Other, select the “Package” icon and click OK.
2. Click File|New|Form
3. Press Ctrl-F9 to compile the package. The package will compile with warnings, and present a dialog with changes necessary to your package, namely adding a reference to vcl. Click OK to accept the changes, and Delphi will add the reference, and finish compiling the package.
4. In the “Requires” branch of the package, double click the reference to vcl. It will take a while to generate, so be patient. Note that Delphi automatically generates the list of units that the package contains.
5. Press Ctrl-S to bring up the Save dialog. You will need to give the package a name other than vcl.dpk. I chose to name mine vcl70.dpk. You'll be able to change it back in a later step. Save the package somewhere appropriate.
6. Click the “Options“ button in the package editor, select the “Description” tab and change the LIB suffix value to: 70. Select the “Compiler” tab, and check the “Use debug DCUs” checkbox.
7. Click File|Save As and change the name of the package to vcl.dpk
8. Close Delphi
9. In the Windows System32 directory, rename vcl70.bpl to vcl70.borl.bpl. In the Delphi \Lib directory, rename vcl.dcp to vcl.borl.dcp
10. Copy the following files from the Delphi \Lib directory to the Delphi \Lib\Debug directory
    buttons.res
    controls.res
    extdlgs.res
11. Bring up a command prompt (eg click Start|Run, type cmd and press enter), and change directory to where you saved the vcl.dpk package
12. Use the following command to compile the package:
    dcc32 vcl.dpk
13. Copy the resulting vcl70.bpl to the Windows System32 directory, and copy the resulting vcl.dcp to the Delphi \Lib directory.

That completes building the debug vcl package. You'll need to rebuild the packages in your project that use the vcl so that you can debug into the vcl source.



PM MAIL WWW Skype   Вверх
mutex
Дата 1.6.2007, 03:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 56
Регистрация: 17.10.2004

Репутация: нет
Всего: 3



Gnusss.
Нашел код в книге Xavier Pacheco and Steve Teixeira "Delphi 5 Developer's Guide".
Он позволяет просматривать состав любого BPL-пакета. 
См. прикрепленный архив - PkgInfo.zip (4 КБ).


Это сообщение отредактировал(а) mutex - 1.6.2007, 03:28

Присоединённый файл ( Кол-во скачиваний: 17 )
Присоединённый файл  PkgInfo.zip 3,62 Kb
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0500 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.