Динамически подключаемые библиотеки (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
И почему же Вам, Топик Стартер, не начать самому что-либо делать? Купить учебник по тому же Ассемблеру или скачать его? И взять дописать в сталкер теже дверки или рабочие на 100% Блудмарки? У СкайЛоадера хороший девиз "Хочешь работать нормально, работай один". GSC не хотят делать того самого сталкира - им нужна прибыль, по этому мы исходники не увидим.
Итак, есть один хороший человек из бывшей команды разработчиков сталкера. Это Андрей Прохоров с никнеймом Проф из 4А геймс, который ещё в игромании интервью давал. Так вот, вроде мужик он нормальный. Лично пообщаться не получилось. Но в принципе можно было бы попробывать. Ну так что?
Rolan, такое тоже вполне возможно.
Добавлено (21.11.2011, 20:20) --------------------------------------------- Этих ***** естественно интересует бабло и только бабло, но ведь у них делается новый движок, тем более опен соурес, да и движок как таковой им не принадлежит, его же сделали Алесь Шишковцов и Александр Максимчук. Врядли эти двое поделятся с работягами - модмейкерами, но возможно у Прохорова что либо осталось и возможно, что он поделится с нами.
Darkscape, это может быть. Тогда новость будет печальная.
Но мне сдаётся что Проф умнее чем кто либо думает...Можно попробывать.
Добавлено (21.11.2011, 20:50) --------------------------------------------- Панк, ну ты где? давай уже регайся и заходи сюда!
Добавлено (21.11.2011, 20:52) --------------------------------------------- Да, чувствую я что опять мы останимся ни счем...объединения не добиться...на форуме я уже дибил года с такими побуждениями.
Скай выучил ассемблер на уровне изменений команд перехода. Это не высокий уровень, но я уважаю Ская, потому что он смог разобраться в коде и что самое главное, он смог придумать идеи. Однако скай, как и я не умеет врезаться и самое главное писать свой код. Это очень сложно этим овладели только колмогор и маландринус.
Письмов в ПЫС - ухаха. Они вам ничего не дадут. Отлажочные бампы - это все что у нас есть
Сообщение отредактировал _Призрак_ - Понедельник, 21.11.2011, 21:18
Уморили ребятиишки, Прохоров что-то вам даст, ага, УК почитайте, X-Ray не opensource, так что это дело подсудное. Письмо пысам бред. Движок сталкер два не будет новым, мы увидим всё тот же X-Ray. И никогда он не будет с открытми исходниками, максимум умельцы сами раскроют двиг и всё.
Повода закрывать тему пока невижу. И вообще, даже если "дурацкая" идея с письмом Пысым провалится окончательно, то можно будет попробывать раскрыть его самим. Мне кажется, что это реально. Вот только очень сложно. Нужны умельцы, которые врядли забредут в эту тему. Скайлоадер доказал, что движок поддаётся редактированию. Я понимаю как он мог сделать круглый прицел для оружия (я сам это делал, и ЗЕН тоже сделал этот прицел, только разными способами - у Ская это получилось напорядок лучше, чем у всех, кто пытался этого добиться) но ведь то, что он сделал прицеливание ни по модели гг, а по прицелу в виде от 3 лица и отодвинул модельку влева, это же очень сложно. Сколько я ни копал, я ни то чтобы не нашёл способа изменить фичу, я вообще ничего подобного там не увидел. Значит ведь можно. Да и в НЛК тиме уже давно научиль создавать ещё один файл экзышник, с помощью которого можно запускать меню в виндоусе, как в КоД и тд, это тоже нелёгкая и давольно необычная по меркам работа. Так что то что нельзя добиться от иксрея максимума без исходников - не факт. Колмогор и Маландринус - это конечно же великие модостроители, но Скай лучше них. Он просто ещё не дошёл до этого уровня. Когда Скайлоадер получит больше знаний по редактированию движка, он добьётся огромных успехов. Кто считает, что у никогда в жизни не смог бы внести те нужные правки в движок, врезку в код? Стоит надеятся на развитие идеи работой...
Сообщение отредактировал RETRIX - Понедельник, 21.11.2011, 21:44
В NLC файл host не даёт новых возможностей движку, а запускает новые модули по верх его. host сделан в двух версиях, для ТЧ и ЧН,ЗП(одна версия). А давайте все возьмёмся за руки и поддержим Ская! Скай давай, твори!
Quote (RETRIX)
Скайлоадер доказал
Это было сделано давно и до него. Дело в том, что все эти фишки делаюся долго и длеать их без какого-либо мотиватора не интересно. Если бы был бы мотиватор в виде денег, к примеру сделал фишку и тебе денежка в размере её важности для сообщества, вот это было бы дело, а делать за так... Сами помниатете не интересно.
Я, конечно, нехочу никого обидеть, в частности вас, Rolan, но делать моды за гонорар...Я пока только трачу деньги на то и на это, когда приходится обращатся к толковым людям за написанием скриптовых функций непосильных мне...Получать деньги за модострой это глупо. А если вам без этого не интересно, то хочу вас обрадовать, если вы ещё конечно не видели объявление на сайте про неплохие денежные призы разработчикам толковых проектов. Я бы никогда не взял денег за подобные виды деятельности. Модострой - мой хлеб. Если не буду тратить часы и дни на тупое просиживание в хекс редакторе без результатно редактируя движок сталкера - то умру =). Тут большинство работы крепится на интузиазме и интересе. Сталкер - мой мир и моя жизнь и я хочу сделать её лучше, совершеннее...Многие рассуждают также, именно засчёт этого и живёт пока модострой и сам сталкер...
Добавлено (21.11.2011, 22:13) --------------------------------------------- Как видите начинает умирать...Люди не хотят класть часть своей жизни на модострой - и зря.
Да ладно вам. Забейте вы на этот двиг. Потому что во-первых пысы никогда не отдадут исходники не смотря ни на что, это я уж так с сарказмом пошутил, а во-вторых сталкер и этот дурацкий Х-рэй уже по крайней мере лично мне надоел порядком смотря на такие игры как бф3 и подобных. Вся моя надежда на С2 но вряд ли она оправдается... Вообще я очень хочу чтобы ГСК обанкротилась ну или распалась или еще чего, чтобы они все сдохли от радиации и тогда неприменно найдутся люди которые возьмут бренд сталкер на себя и сделают свою игру и скорее всего намного лучше чем делали ГСК... но этого не случится видимо никогда( сказки, просто сказки...
В общем забейте и все, забудьте про тот сталкер и конфигурацию движка.
Всё реально и без исходников движка. Есть хекс-редакторы и разные дебаггеры и дизассемблеры с их помощью можно сделать многое, но это очень долго и муторно. Недавно с помощью выше указанного host совместно с усилиями Dixaresa удалось реализовать в сталкере воспроизведение mp3-файлов. Вот тема разработчика на его сайте, ниже по теме есть версии перехватчика для ЧН и ЗП.