Динамически подключаемые библиотеки (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
Cutting_heads, Doctor-Zombi, а оно вас волнует? Вы знаете,как вскрывали билды на гейиинаторе, всё начиналось с безобидной темы. Если на то пошло,вы администрация,что рвёте свою пятую точку?
Сообщение отредактировал PorShen - Четверг, 05.01.2012, 18:31
C этого момента я наполню тему полезными постами и статьями, а также ссылками и фалами по теме. Ну и придётся сделать что-то стоящее самому. Чтобы эти трое неандертальцев отвалили от меня. Doctor-Zombi, да нет...ничего. Каждый может высказывать своё мнение, просто Cutting_heads, deathdoor и grib просто хотят выжить меня...
PorShen, да делать лично мне больше нечего! ага! Я точно не знаю но когда впервые раскрывались фишки движка , было больше возможностей т к некоторые из них были просто заблокированы но они были. А сейчас БЕЗ ИСХОДНИКОВ ничего не сделать! Ну или какую нибудь только мелочевку. И вообще сначала бы хоть что то сделали прежде чем говорить что вы не просто болтаете а делом занимаетесть. У создателя темы даже опыта в модострое нету совсем. Да и потом зачем же быть такими амбициозными? в теме заинтересованы 3-4 человека а всем остальным она безразлична, так неужли нельзя по лс ну?
Добавлено (05.01.2012, 19:41) --------------------------------------------- Cutting_heads жирными буквами У кого там баттхерт то? :D RETRIX, вот сделай, тогда мы от тебя не отвалим а зауважаем - разные вещи
Добавлено (05.01.2012, 19:43) --------------------------------------------- просто Cutting_heads, deathdoor и grib просто хотят выжить меня... Ты слишком юный еще, все воспринимаешь близко к себе. Будь проще. Мы тебе дело говорим а ты только и сваливаешь на нас
Сообщение отредактировал Cutting_heads - Четверг, 05.01.2012, 19:44
Cutting_heads,послушайте эта тема посвящена обсуждению возможностей движка и его модификация.Да может не все мы является гуру c++ и движка...Эта тема интересна 3-4 людям,а хочется спросить чего вы добиваетесь,изначально она будет интересна 3-4 людям,а далее может и другим.Если на то пошло,то какого фига делаете вы в этой теме,если она вам не интересно.Не засоряйте тему,люди делятся алгоритами,обходами,идеями... И вдогонку,про ваш Skype,этот разговор рассчитан на аудиторию с определёнными знаниями. Откуда мы знаем,что тот или иной пользователь/гость умеет что-то делать с " , движковым аппаратом"
Doctor-Zombi Читай внимательно и разборчиво,чёрным-по-белому написано в шапке темы! В данной теме я хочу собрать внимания умных людей, чтобы поддержать любимую игру S.T.A.L.K.E.R. таким способом, как редактированием игрового движка. В "Сталкере" всё можно восстановить, и Вы это можите! Но почему-то ни рабочих на целые 100% "Блудмарок", ни открывающихся дверей у машин пока не существует, но Вы можите это сделать. Мы можем многое и почему-бы не попробывать этого добиться. Есть огромное колличество различных факторов, которые упростят работу модмейкеров и улучшат игру, которые можно внести или подвергнуть прямому редактированию через игровой двигатель. Таких факторов великое множество. Их исчисление начинается с коллизии и Блудмарок, и заканчивается в изменении путей к файлам текстур, например ui icon equipment для более быстрого и удобного нахождения в игровой директории, которые лежат опять-же в xrGame.dll. Сейчас существует масса программ и возможностей, чтобы сделать "Сталкер" Той Самой Игрой Нашей Мечты, а не просто мифом игро-легендой 2004 года. Надеюсь, что эта тема сподвигнет многих модостроителей к активным работам и общению на данную тему в этом разделе форума. Спасибо за внимание, всем удачи!
Quote (Doctor-Zombi)
Моя требует Действий!
А что твоя может.Прежде,чем что-то предъявлять-сделай сам или сделай предложение. Да,может я и не ковыряю c++,но наша команда восстанавливает "Энциклопедию в ПДА для ЗП".
P.S. Doctor-Zombi, Cutting_heads ребята,так же нельзя.Вы мне напоминаете школьников(может так оно и есть),которые чуть что бегут жаловаться.Мало того требую того,чему нужно время..
Cutting_heads, я сделаю чисто деловую тему для разработки, подключу матерьялы и разные статьи. Сейчас я это понял, что не хватает теме, (благодаря вам), но вы реально достали...
Добавлено (05.01.2012, 20:54) --------------------------------------------- Завтра всё будет готово, ждите.
Большое заблуждение. Заблокированных фунций до сих пор осталось конечно не много, но есть фунциии которые нужно заблокировать, или же функции, к которым изначально не было у скриптеров доступа. В ОГСЕ маландринус сделал такие изменения, что почти все, откровенно корявые и отровенно опасные конструкции в скриптах удалось исключить
Добавлено (07.01.2012, 01:54) --------------------------------------------- Не смотря ни на что, гуглом пользоваться вы не умеете и это очень прискорбно
_Призрак_, да, согласен. Я с самого начала придерживался мнения, что хексом и дизассемблером можно всё =) ------------------------------------------- Ну не так конечно конкретно, но стоило бы взглянуть на движковые работы Маландринуса, Колмогора, SkyLoader`a, Призрака, ЗЕНа. NLC team даже показала очень хороший пример в использовании динамически подключаемых библиотек на сталкере...Ну тут болше дело интерфейс клепать..., так вот тогда сомнения бы пропали про то что без исходников нет работы и результатов - блудмарки, круглый прицел, отключения функций курсора, решение ранга оружий, руки на руле, хост, улучшение производительности, новые экзешники, новые каталоги папки гемдата, коллизия, норм камера вида от 3 лица и фикс-прицел от свободного 3 лица, оружие класса бинокля стреляет, выделение целей в прицеле... сделанно очень много и это ещё не всё, что сделанно...стоило бы задуматься.
Сообщение отредактировал RETRIX - Суббота, 07.01.2012, 02:29