Я могу перекомпилировать.PAS файлы, используемые Delphi IDE?

Вот отрывок того, как получить Криографически безопасные случайные числа: Это заполнит 8 байтов с crytographically сильной последовательностью случайных значений.

byte[] salt = new byte[8];
RNGCryptoServiceProvider rng = new RNGCryptoServiceProvider();
rng.GetBytes(salt);

для получения дополнительной информации видят , Насколько Случайный Ваше Случайное??" (вдохновленный статьей CodingHorror о перестановке деки)

5
задан Rob Kennedy 8 October 2009 в 03:47
поделиться

5 ответов

Вы, вероятно, можете поместить dbcommon.pas в каталог вашего проекта. Затем он будет скомпилирован вместе с остальной частью проекта.

12
ответ дан 18 December 2019 в 06:12
поделиться

Можно, но часто это не обязательно. Перекомпиляция модуля VCL иногда означает перекомпиляцию всех остальных модулей VCL либо потому, что вы изменили интерфейс модуля, либо потому, что компилятор запутался и считает , что вы изменили интерфейс. Перекомпиляция модуля VCL также исключает возможность использования большинства пакетов времени выполнения, потому что вы не можете перекомпилировать пакеты времени выполнения Delphi.

Вместо перекомпиляции вы можете использовать исправления во время выполнения. Я использовал этот метод в элементах управления TNT Unicode , но Madshi также предоставляет способ заменить функцию вашей собственной реализацией. Если вы скопируете реализацию DBCommon.GetIndexForOrderBy в свой собственный модуль и внесете исправления, вы можете использовать эту команду для исправления версии VCL своей собственной:

var
  Old_GetIndexForOrderBy: Pointer;

HookCode(@DBCommon.GetIndexForOrderBy,
         @Fixed_GetIndexForOrderBy,
         Old_GetIndexForOrderBy,
         0);

С помощью библиотеки Tnt Unicode найдите OverwriteProcedure в модуле TntSystem. Он не публичный, поэтому вам нужно либо объявить его в интерфейсе модуля, либо скопировать в свой собственный модуль. Тогда вы можете назвать это так же, как код Мадши выше:

var
  Old_GetIndexForOrderBy_Data: TOverwrittenData;

OverwriteProcedure(@DBCommon.GetIndexForOrderBy,
                   @Fixed_GetIndexForOrderBy,
                   @Old_GetIndexForOrderBy_Data);
4
ответ дан 18 December 2019 в 06:12
поделиться

См. Предыдущие ответы, чтобы узнать, как создать ситуацию, когда вы можете перекомпилировать измененный исходный код VCL. Однако я бы добавил, что вы серьезно подумываете об управлении своими изменениями в своей системе управления изменениями, используя шаблон SCM "Vendor Branch".

Проще говоря (используя SVN в качестве ссылки):

  • Создайте копию «источника поставщика» исходных файлов, предоставленных поставщиком. Это ваша «нетронутая» справочная копия.

  • Создайте ветвь, представляющую эту нетронутую копию (например, «2009» для версии Delphi 2009 VCL)

  • создайте дополнительную ветвь в отдельной папке «библиотеки поставщиков». ЭТО копия библиотеки, на которую вы должны ссылаться в своих проектах

  • , любые изменения в исходном коде поставщика производятся в ветви «библиотека поставщика».

  • когда поставщик предоставляет новую версию библиотеки, вы проверяете новую версию в проекте «источник поставщика» и создаете новую ветвь для новой версии.

вы можете легко различать версии поставщика. Но что более важно (с SubVersion и, возможно, другими системами SCM), вы также должны иметь возможность просто объединить (то есть автоматически) новый исходный код поставщика с вашей веткой «библиотека поставщика», чтобы легко включить изменения поставщика с вашими собственными изменениями.

Это все описано намного лучше, чем я только что описал в прекрасной книге О'Рейли: «Управление версиями с помощью SubVersion»

. ПРИМЕЧАНИЕ, однако, утилита «loaddirs», упомянутая в этой книге, больше не поддерживается из-за проблем с авторским правом, поэтому обновление " продавец прекращает "в настоящее время выполняется вручную, но это происходит нечасто и не является серьезным бременем.

Мы используем этот шаблон сами, хотя в случае VCL мы не храним полную копию всего исходного дерева VCL в нашем «исходном коде поставщика» или библиотека поставщика ", но вместо этого отслеживает только измененные и зависимые объекты. Для других библиотек, управляемых веткой поставщика, мы, как правило, поддерживаем полные копии, но решили, что это не обязательно для VCL.

Однако мы только что реализовали этот шаблон, поэтому мы можем решить, что нам нужно взять больше комплексный подход и с VCL.

ymmv

но вместо этого отслеживают только измененные и зависимые единицы. Для других библиотек, управляемых ветвью поставщика, мы, как правило, поддерживаем полные копии, но решили, что это не обязательно для VCL.

Однако мы только что реализовали этот шаблон, поэтому мы еще можем решить, что нам нужно взять больше комплексный подход и с VCL.

ymmv

но вместо этого отслеживают только измененные и зависимые единицы. Для других библиотек, управляемых ветвью поставщика, мы, как правило, поддерживаем полные копии, но решили, что это не обязательно для VCL.

Однако мы только что реализовали этот шаблон, поэтому мы еще можем решить, что нам нужно взять больше комплексный подход и с VCL.

ymmv

4
ответ дан 18 December 2019 в 06:12
поделиться

Просто - Да. Используя один из приведенных выше ответов [от Тома или Коннора]. Скопируйте DBCommon.pas в папку своего проекта, а не редактируйте оригинал. Это не влияет на другие проекты и компиляции, потому что они не будут в пути.

1
ответ дан 18 December 2019 в 06:12
поделиться

У нас есть папка в дереве исходных текстов нашего проекта под названием VCL, в которую мы помещаем копии исходного кода VCL, которые мы хотим немного изменить. Ваш пример - хороший кандидат на то же самое. Вам нужно будет изменить путь поиска для вашего проекта, чтобы «ваша» папка VCL располагалась на вашем пути раньше, чем папки «Source» в вашей установке Delphi. Вы также можете обнаружить, что если вы скопируете один исходный модуль VCL и измените его, вам также придется скопировать другие исходные модули VCL в «вашу» папку, которые могут быть зависимостями.

Наша причина для этого в том, что мы хотим наши сборки не содержат подсказок и предупреждений компилятора. Некоторые части исходного кода VCL не свободны от подсказок / предупреждений.

2
ответ дан 18 December 2019 в 06:12
поделиться
Другие вопросы по тегам:

Похожие вопросы: