Можно ли встраивать двоичные данные в DOS EXE, созданные на Turbo C?

Я настроил среду разработки DOSBox с Turbo C++, намереваясь сделать игру со своими друзьями.

Я использую код C, и мне интересно, как связать двоичные данные с EXE. (Весь мой предыдущий опыт работы с C связан с libGBA, извините, если это на самом деле не возможно так, как я думаю.)

Если это невозможно, то какой альтернативный вариант для встраивания двоичных данных? (Мне действительно не нужна куча бинарных файлов в папке с игрой...)

Не могу найти много сторонней документации для Turbo C, особенно учитывая, что я использую другой, поддерживаемый, но не основной язык для своей IDE, которая последний раз обновлялась в начале 2000-х годов после полного перехода на другую ОС.


person ScottBeebiWan    schedule 16.04.2019    source источник
comment
Вы всегда можете поместить все свои файлы данных в один глобальный файл с каталогом в начале, чтобы найти свои данные. Именно этим я и занимался, когда работал в GBA (а также в GBC/DMG и DS).   -  person Michael Dorgan    schedule 16.04.2019
comment
Почему вы не хотите использовать файлы? Почти все игры для DOS использовали файлы данных для своих данных. Какую реальную проблему вы пытаетесь решить, встраивая данные в исполняемый файл?   -  person Some programmer dude    schedule 16.04.2019
comment
Также помните, что в DOS есть довольно много ограничений по размеру (даже с расширителями и т.п.), поэтому ваша исполняемая программа не может быть произвольно большой. Если у вас много данных, вы должны использовать несколько файлов.   -  person Some programmer dude    schedule 16.04.2019
comment
@Someprogrammerdude idk, мне просто кажется грязным. Не могу объяснить, почему. Я чувствую, что это может быть связано с тем, что люди, кажется, имели и до сих пор имеют привычку делиться только исполняемым файлом без файлов данных, которые к нему прилагаются, или удалять некоторые из них, думая, что они ненужны или что-то в этом роде. edit: Мне потребовалось несколько минут, чтобы написать, поэтому я не видел вашего редактирования. Предполагалось, что двоичные данные не должны загружаться непосредственно в ОЗУ.   -  person ScottBeebiWan    schedule 16.04.2019
comment
Я не помню ни одной пиратской игры (для любой платформы, включая DOS), в которой не было бы всех необходимых для игры файлов. Иногда это были просто zip-архивы каталога, иногда они были скопированы с дискет. Не помню проблем ни тогда, ни сейчас (теперь о другом, уже не о пиратских играх ;)). Если кто-то копирует только экзешник, а не data-файлы, то это их проблемы, а не ваши (на мой совсем не скромный взгляд).   -  person Some programmer dude    schedule 16.04.2019
comment
Данные ресурсов, добавленные с помощью 'rc'?   -  person Martin James    schedule 16.04.2019
comment
Можно делать то, что вы хотите, просто добавьте свои двоичные данные в конец исполняемого файла. Например, вы можете просто выполнить copy /b foo.exe+foo.zip foo-zip.exe, а также запустить foo-zip как команду и использовать pkzip foo-zip.exe ... для добавления и удаления файлов из Zip-файла, добавленного в конец. Однако это все, что вы можете сделать с существующим кодом и утилитами. Вам нужно будет написать свой собственный код, чтобы ваш исполняемый файл мог получить доступ к добавленным данным, независимо от того, добавляете ли вы его в виде Zip-файла или в каком-либо другом формате.   -  person Ross Ridge    schedule 16.04.2019
comment
@ScottBeebiWan использует внешние файлы, но если ваши данные имеют управляемый размер, вы всегда можете использовать таблицы constant, см. программу мыши в Turbo CPP вы просто делаете что-то вроде этого const BYTE data[]={0,1,2,3,...}; вы также можете использовать директивы asm и db. Вы также можете написать программу, которая читает файл и выводит его код константной таблицы C/C++ с некоторым форматированием, например, максимум 128 символов в строке и т. д.   -  person Spektre    schedule 17.04.2019
comment
@Spektre Нет, это не запускает антивирусное программное обеспечение. Это довольно распространенный метод, используемый самораспаковывающимися архивами, некоторыми методами наложения и различными приложениями, которые хотят встраивать данные в свои исполняемые файлы. Это также то, как формат нового исполняемого файла (16-разрядная версия Windows), формат линейного исполняемого файла (32-разрядная версия OS/2 и VxD) и формат переносимого исполняемого файла (32-разрядная/64-разрядная версия Windows) расширяют формат MS-DOS MZ EXE. .   -  person Ross Ridge    schedule 17.04.2019
comment
@RossRidge приятно знать +1 за последний комментарий   -  person Spektre    schedule 17.04.2019
comment
@RossRidge Хорошая идея, но как мне узнать, где находится конец исполняемого файла (байт, который мне нужно искать, чтобы прочитать добавленные данные)?   -  person ScottBeebiWan    schedule 17.04.2019
comment
Вам нужно будет проанализировать заголовки MZ EXE. См. delorie.com/djgpp/doc/exe Проблема с этим методом заключается в том, что вам придется написать большую часть кода самостоятельно. Проще просто использовать отдельные файлы, как это делалось практически в каждой игре MS-DOS, включая условно-бесплатные и другие свободно распространяемые игры.   -  person Ross Ridge    schedule 17.04.2019


Ответы (1)


Должна быть возможность использовать утилиту BGIOBJ.EXE, входящую в состав Turbo C++, для достижения желаемого.

BGIOBJ может преобразовать двоичный файл в файл .obj, который затем может быть связан с файлом .exe. Его основная цель - включить драйверы и шрифты BGI в .exe, но он не должен накладывать никаких ограничений на файл (кроме размера).

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

person idspispopd    schedule 02.05.2019
comment
Это приводит к тому, что двоичные данные загружаются в память при загрузке программы, что не похоже на то, чего хочет исходный постер. Чтобы получить адрес памяти, все, что вам нужно сделать, это обратиться к общедоступному имени, за вычетом префикса подчеркивания, после его объявления. Например, если вы делаете bgiobj foo.bmp foo.obj _foo_bmp, вы должны объявить это с помощью extern char foo_bmp[]; и ссылаться на него как foo_bmp. - person Ross Ridge; 02.05.2019
comment
Трудно сказать, чего хочет ОП. Я бы сказал, пока есть достаточная загрузка памяти, все в порядке при запуске, но, конечно, есть предел тому, что вы можете сделать в 640k. По крайней мере, это буквально то, что мне интересно, как я свяжу двоичные данные с запросом EXE. - person idspispopd; 03.05.2019
comment
Комментарий предполагал, что двоичные данные не нужно загружать непосредственно в ОЗУ. делает довольно ясным, чего хочет оригинальный постер, но да, вопрос, который на самом деле задан, этого не делает. - person Ross Ridge; 03.05.2019
comment
Хорошо, я, вероятно, не видел этот комментарий, потому что он был скрыт. В любом случае, наверное, это не плохая идея. - person idspispopd; 06.05.2019