Динамически подключаемые библиотеки (dynamic link libraries, DLL) используются для уменьшения объема исполняемого файла, за счет выделения некоторых функций в отдельный файл. Более того, функции из DLL могут использовать разные загрузочные модули, что особенно важно для жизнедеятельности Windows (например в KERNEL32.DLL содержаться функции управления памятью процессами и потоками). Для создания DLL в среде C++ Builder необходимо выбрать File\New\Dll при этом автоматически генерируется проект, компиляция которого и дает искомый результат. Для написания экспортируемых функций используется следующий синтаксис: __declspec(dllexport) void nameFunc(); При компиляции, кроме прочих, создаются файлы с расширениями *.LIB и *.DLL, содержащие экспортируемые функции. Подключение DLL в C++ Builder возможно явным и неявным способом. При неявной компоновке в секцию директив необходимо добавить строку вида: #pragma link ”nameFile.lib” а, в секцию прототипов добавить описание прототипа функции: void nameFunc(); При неявной компоновке функция вызывается по имени, необходимы файлы с расширениями *.LIB и *.DLL. Библиотека подключается к процессу в момент загрузки процесса и выгружается вместе с процессом. Явная компоновка требует использования функций WINAPI LoadLibrary() и GetProcAddress(). В данном случае функция вызывается по номеру, который ей присвоен при создании DLL. C++ Builder упорядочивает экспортируемые функции DLL в алфавитном порядке их имен. Номер функции в DLL можно получить с помощью утилиты tdump с ключом -ee. Функция LoadLibrary() принимает в качестве параметра имя библиотеки, а возвращает переменную типа HINSTANCE. Функция GetProcAddress() имеет следующий прототип: void *GetProcAddress (HINSTANCE, const char *); она принимает переменную типа HINSTANCE и символическую константу, а возвращает указатель на функцию. В приведенных листингах демонстрируется создание, неявная и явная компоновки DLL. //Пример создания DLL #include <vcl.h> #pragma hdrstop int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) { return 1; } //Выше находится заголовок DLL, генерируется автоматически double dblValue(double); double halfValue(double); __declspec(dllexport) int AreturnValue(bool); __declspec(dllexport) int CreturnValue(bool); __declspec(dllexport) int BreturnValue(bool); int CreturnValue(bool i) { i= true; return(2); } int BreturnValue(bool i) { i= true; return(3); } int AreturnValue(bool i) { i= true; return(1); } double dblValue(double value) { return value * value; }; double halfValue(double value) { return value / 2.0; }
//Пример неявной компоновки DLL #ifndef useDllU1H #define useDllU1H #include <Classes.hpp> #include <Controls.hpp> #include <StdCtrls.hpp> #include <Forms.hpp> //-------------------------------------------------------- class TForm1 : public TForm { __published: // IDE-managed Components TLabel *Label1; TLabel *Label2; TLabel *Label3; TButton *Button1; void __fastcall Button1Click(TObject *Sender); private: // User declarations public: // User declarations __fastcall TForm1(TComponent* Owner); }; //-------------------------------------------------------- extern PACKAGE TForm1 *Form1; //-------------------------------------------------------- int AreturnValue(bool); int CreturnValue(bool); int BreturnValue(bool); #endif
int (*returnVa1)(bool); int (*returnVa2)(bool); int (*returnVa3)(bool); //-------------------------------------------------------- __fastcall TForm1::TForm1(TComponent* Owner):TForm(Owner) {//Создание формы hinst=LoadLibrary("dll_cb_c.dll"); returnVa1=(int (*)(bool))GetProcAddress(hinst, MAKEINTRESOURCE(1)); returnVa2=(int (*)(bool))GetProcAddress(hinst, MAKEINTRESOURCE(2)); returnVa3=(int (*)(bool))GetProcAddress(hinst, MAKEINTRESOURCE(3)); } //На форме имеется одна кнопка и три метки void __fastcall TForm1::Button1Click(TObject *Sender) { bool buf_b; int j; buf_b=false; if(returnVa1==NULL) Label1->Caption=AnsiString("Error"); else { j=returnVa1(buf_b); Label1->Caption=AnsiString(j); } Label2->Caption=AnsiString(returnVa2(buf_b)); Label3->Caption=AnsiString(returnVa3(buf_b)); } MAKEINTRESOURCE — макрос для создания символической константы. Переменная типа HINSTANCE создается глобально. Загрузка библиотеки и присвоение указателей на функции производится в момент создания формы. Количество и тип параметров в описании функций (сигнатура функции) в DLL и указателя на функцию, в вызывающем модуле должны совпадать, совпадение имен не обязательно. DLL выгружается из памяти при завершении работы вызывающего модуля. Принудительная выгрузка DLL осуществляется функцией FreeLibrary(HINSTANCE).
Чтобы убрать "тормоза в игре" или одним словом улучшить производительность необходимо открыть в ХЕКС-редакторе (см. ссылку сверху) XR_3DA.exe, там в коде с помощью поиска найти цифры 45 78, найти их просто - ввести в поиске GlobalMemoryStatusEx . Далее изменить их на 00 00 и сохранить изменения. Всё. Теперь всё будет работать нормально. Способ нашёл не я - Rolan.
(С) _Призрак_ Инструкция по изменению плотности травы. Параметр меньше 0.02 не ставить - Колмогор писал что начинает лагать 1. Открываем айда 2. Открываем айда_виев 3. Теперь ищем что нам нужно найти. Нам сейчас нужно найти r__detail_density? Тогда жмем ctrl+t и вводим r__detail_density 4. Находим функцию и тщательно ее разбираем (я ее полностью разбирать не буду, а только укажу где задаются параметры: fld ds:flt_10064400 --нижнее ограничение равное 0.6 or dword_1007CACC, 8 sub esp, 8 fstp [esp+30h+var_2C] mov ecx, offset unk_1007CA9C fld ds:flt_10064380 --верхнее ограничение равное 0.2 fstp [esp+30h+var_30] push offset aSs; "ЪЩЩ>" push offset aR__detail_dens; "r__detail_density" call ds:??0CCC_Float@@QAE@PBDPAMMM@Z; CCC_Float::CCC_Float(char const *,float *,float,float) push offset sub_1005E080; void (__cdecl *)() call _atexit add esp, 4 Если вы заметили, то что бы трава стала плотней нужно уменьшить параметр, а что-бы травы стало меньше нужно параметр увеличить 5. Нам нужно увеличить плотность травы: следовательно нужно изменить верхнее ограничение. Как это сделать? Есть 3 варианта:
Первый и самый логичный вариант: изменить переменную которая задает. Но тут есть небольшой подвох на котором я попался. Этой переменной может пользоваться не одна функция, а несколько. И не ясно что вы можете сломать, поменяв одну циферку в переменной...
Второй: взять другую уже существующую переменную. Хороший вариант которым я и воспользовался. Но и тут есть недочет - переменных в ддлке не так уж и много и можно просто не найти нужную
Третий: создать переменную. Отличный вариант. Единственный минус - я не знаю как это сделать
Я пошел по второму пути. Два раза шелкнув на ds:flt_10064380 айда отправила меня в дебри под названием .rdata. Там я нашел переменную которая называлась - flt_1006452C и которая имела значение 0.0720999 Вообще-то, как я понял, flt_1006452C - не является названием переменной. Это так сказать сборка из 2 показателей - (тип числа)_(оффсет) В нашем случае это число типа float которое находится в 1006452C. Ну чтож приступим к редактированию! 6. Отправляем в самое начало файла. Как? Сверху есть что-то типа статус бара - строка состоящая из синего,серого,черного цвета. Нажимаем там в любом месте мышкой и ведем влево до конца 7. Опять ищем r__detail_density. Находим в этой функции fld ds:flt_10064338. Дальше самое интересное. Жмем на ХЕКС_ВИЕВ и там у нас выделяются какие-то цифры. Это наше 10064338 только написано наоборот. Сравните: 38 43 06 10 10 06 43 38 Похоже, не правда? Начинаем редактировать. нам нужно поменять 4338 на 452C т.к. в этом и есть различие. Жмем правой кнопкой мыши на этих цифрах и выбираем пункт Edit. Меняем 38 43 на 2С 45. Дальше жмем где нибудь в коде. Это нужно сделать обязательно. После этого жмем правой кнопкой мыши и выбираем commit changes. Но айда не меняет исходный файл. В нашем случае мы можем только создать файл изменений. Делается это так - Файл - Produce file - Create DIF file. Назовем его test. DIF файл можно открыть при помощи блокнота и посмотреть что вы сделали. Теперь так сказать соединит этот файл и дллку. Это можно сделать при помощи bpatch. Качаем и смотрим и запускаем bpatch.cmd. Я думаю что вы сможете его изменить сами если нужно будет. Там все элементарно.
Сообщение отредактировал RETRIX - Воскресенье, 04.03.2012, 23:11
1. Вы из их числа? 2. Который день они собираются? 3. Потом в обязательном порядке доложите об успехах...ну если таковые вообще намечаются.
Quote (kot_da_Vinci)
вместо того чтобы вникнуть в тонкости опять наступайте на все те же грабли
О каких граблях речь? Я всё правильно написал. Подавляющее большинство тех, кто здесь с умной рожей много говорит о восстановлении движковых фич, так ничего и не добьётся(хотя вопрос скорее в том, будет ли оно вообще пытаться чего-либо добиться окромя набивания постов и... "моральной поддержки" действующих участников). И никакой волшебный быдлокодер 80 левела, который внезапно набежит и раздаст все плюшки за спасибо, эту тему не посетит, будьте уверены.
butcher_512, Еще раз повторюсь, не грубите! Что касается моих успехов то думаю я праве не оповещать вас о них. Я же не обязан перед вами отчитываться? И поосторожней со словами, так не хорошо.
В жопу вас таких. Deathdoor, вам что, религия не позволяет мимо пройти? butcher_512, Ну делает человек и делает, вам какое до этого? Люди только учатся, пускай тема для новичков будет мотиватором. Вы что сделали? Может продемонстрируете?
Amicron, RETRIX, Увы эта тема обречена на постоянные атаки причем порой от вполне уважаемых мной ранее людей. Думаю есть смысл ее поддерживать, Но на всякий случаю предлагаю обменяться контактами (аська,скайп )
Amicron Когда вам не хватало стандартных методов воспроизведения музыки? Почему вам не нравится .ogg? Ладно в ТЧ там моно, но в ЗП нет такого. Зачем нужно было делать бесполезную реализацию? Да еще и притом что путь к файлу пишется не относительно папки с игрой, а абсолютный
Добавлено (26.11.2011, 22:22) --------------------------------------------- Кстати, пока вы тут собачитесь, люди делом занимаются. Причем очень успешно: http://www.youtube.com/user/soProjectdev
_Призрак_, такое очень полезно, к примеру, при реализации внутриигрового плеера. Пользователь просто скинет свою любимую музыку в специальную папочку и будет наслаждаться ей в игре. Все. Никаких морок, никаких переконвертирований в OGG. Это удобно.
Quote (_Призрак_)
Кстати, пока вы тут собачитесь, люди делом занимаются.
Amicron А идея хорошая. Только вот нужно сделать чтобы путь можно было указывать относительно игры
Добавлено (26.11.2011, 23:09) --------------------------------------------- Amicron Раз ты поддерживаешь эту тему, то может быть выложишь тутор по созданию длл, подключению ее в игре и ее дальнейшем использованием в игре?
Кстати, товарищи, вы так за все эти 10 страниц не предложили ни одной дельной идеи, которая не звучала бы ранее
_Призрак_, Как раз этим и занимаюсь, путь берётся из fsgame, в нём пункт пользовательской музыки, в эту папку кидается музыка и модуль считывает все файлы и строит из них список, который в дальнейшем проигрывается.
Добавлено (26.11.2011, 23:14) --------------------------------------------- _Призрак_, dll пишеться на С++ с использованием LUA jit последней версии, в основном С++ знать надо, а вообще любой язык программиирования.
Да, _Призрак_, идея давольно свежая и нужная. Надеюсь, могу чем-нибудь помочь? butcher_512, Deathdoor, извените за оффтоп, но сколько же можно грубить и флудить в этой теме?! Вам не нравится, вам не интересно, проходите пожайлуста мимо. Создайте свою тему и флудите там сколько хотите, обсирайте друг друга с головы до ног, поливайте грязью...
Добавлено (27.11.2011, 00:36) --------------------------------------------- ЗЫ: Может я и перегибаю палку, но я теперь догадываюсь, почему Москвин заслал в ОГСЕ вора. Может он тему создал, чтобы людям помочь, а ему взяли и самооценку до 0 понизили, как некоторые тут...кое-кому...
Видимо ты не застал тех времен когда Москвин воровал у все, без палева. Тогда еще парни из команды АМК подняли шум на форуме москвина, после этого он стал тырить тихо. А Deathdoor имеет полное право разговаривать как хочет. Он смог собрать лучшую команду за всю историю модостроя, именно в ОГСЕ распилили двигатель так, что теперь его уже не узнать.
_Призрак_, Эти его подвиги НЕ позволяют ему писать то что он пишет так как он пишет. Мне глубоко и даже очень глубоко "совершить акт дефикации" в грубой жаргонной форме на наработки огсе ибо я не люблю этот мод, а вот разговаривать так никто права не имеет.
Сообщение отредактировал kot_da_Vinci - Воскресенье, 27.11.2011, 01:13