Сохранение дополнительных данных в dll, как они это сделали? - PullRequest
0 голосов
/ 14 ноября 2008

позвольте мне немного рассказать вам, откуда возник этот вопрос. Я играл с SDK Serious Sam 2, шутера от первого лица, который работает на Serious Engine 2. Этот движок вводит нечто, называемое MetaData. Метаданные используются в движке для сериализации классов и возможности их редактирования в среде редактора (Serious Editor 2). Так, например, вместо:

class CSomeGameItem : CEntity
{
    public:
    int iHealthToGive;
}

Что не будет отображаться в редакторе, вы бы сделали:

meta ver(1) class CSomeGameItem : CEntity _("Some game item")
{
public:
    meta int iHealthToGive; _("Amount of health to give")
}

Теперь, когда вы создаете уровень, вы можете вставить в свой уровень сущность «Некоторые игровые предметы» и отредактировать одно имеющееся у него свойство. Теперь я знаю, что Croteam (разработчики упомянутой игры и движка) используют дополнительный компилятор (Mdc, компилятор метаданных), чтобы вводить дополнительную информацию о классах и их переменных в файлы dll, чтобы сделать возможной эту систему метаданных. Кто-нибудь знает, как они это сделали?

Да, кстати, ключевые слова meta, ver () и _ () в своем коде # define'd to none, поэтому «нормальный» компилятор их игнорирует.

Ответы [ 4 ]

1 голос
/ 14 ноября 2008

Чтобы получить точный ответ, изучите Формат файла PE . Это низкоуровневый формат файла для двоичных файлов на Win32. то есть. DLL, EXE, COM и т. Д.

Есть много книг, которые описывают структуру и возможности PE-файлов. И множество инструментов, которые позволят вам изучить его.

Краткий ответ: на самом низком уровне формат PE-файла позволяет встраивать данные в двоичный файл, который можно извлечь во время выполнения. DLL и Exe часто будут вставлять свои иконки и текст локализации. Их часто называют ресурсами.

Хорошее место для начала - раздел Файл ресурсов в MSDN. Также исследуйте «Сценарии ресурсов (файлы * .rc)» и «Компилятор ресурсов (rc.exe)».

1 голос
/ 14 ноября 2008

Если этот движок работает в Windows, одна идея, которая приходит на ум, - это ресурсы. Существуют API-интерфейсы Windows для изменения содержимого ресурсов exe или dll. Также API позволяет читать ресурсы из «внешнего» exe / dll. Таким образом, дополнительный компилятор будет хранить метаданные как ресурсы в скомпилированном exe-файле. И комплект разработки будет читать эти метаданные из «базы» exe / dll.

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

0 голосов
/ 14 ноября 2008

Просто удар в темноте, так как я никогда не смотрел на sdk, но я предполагаю, что происходит двухпроцессорная система - одна с компилятором C ++, а другая с пользовательским процессором метаданных, который может найдите метатеги и обработайте связанные имена классов, имена членов экземпляров и тэги _ (). Скорее всего, создается какой-то файл конфигурации, который либо остается на стороне, либо внедряется как файл ресурсов. Пользовательский проход метаданных также может быть просто генератором кода C ++, который создает код для включения псевдоотражения для каждого класса.

0 голосов
/ 14 ноября 2008

Это похоже на moc (компилятор мета-объектов) в Qt. В случае Qt он генерирует дополнительные исходные файлы C ++, которые затем компилируются и связываются вместе с исходными исходными файлами.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...