Динамически подключаемые библиотеки (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
Я всецело против 4a геймс. Всегда был за GSC так что участия в письме форе не буду принимать, а с GSC лично отношения сложились хорошие так что к ним если что и обращусь.
Сообщение отредактировал kot_da_Vinci - Понедельник, 21.11.2011, 22:23
Amicron, я тоже думаю - всё возможно. kot_da_Vinci - ваше мнение...Незнаю как к нему относится, почему-то на форумах многие люди заставляют меня разочаровываться в своих кумирах, таких как Андрей Прохоров из 4а геймс, работающий раньше вплотную над сталкером. Однажды я даже на время потерял веру в Дезадора, который тоже мой кумир. Я долго на него копал, но потом подумал...Что все мои предположения выводы и зацепки касательно ла и дезовейв - бред...о чём этоя...а, если реально имеешь тёплые отношения с ГСК, то возможно они дадут тебе что-либо...Ну допустим, какбы тебе лично, при условии что ты не будешь это публиковать. Да и какого ж хрена! Они не дают нам рэй, мы что используем его в коммерческих целях?! Я лично готов птратить все бабки на модострой, нежели получить, ибо это алчность...какая может быть коммерция. Какой модмейкер даст плагиатору или коммерческому лицу исходники?! Пусть они будут у таких людей, как ты, я , Скай, Колмогор, Маландринус...если у тебя будут исходники, бампы или отладчики, неужели ты просто так кинешь их в общий форум - бирите все, кто хочет?
RETRIX, вы много не понимаете в этой жизни. Разработчики сталкера не будут ничего публиковать серьёзного из-за того, что им есть что скрыть в кодах движка. Вы уже отдалились от первоначальной темы. Сообщения такого содержания нужно скорее всего публиковать не на таких порталах а на форумах программистов и реверс-инженеров.
Хм...Это ещё более интересно, если вы говорите, всё же скрывают. Ранее я был уверен, что именно из-за простоты движка сталкер не стал таким широким, оказывается из-за лени пысов...а значит двигатель как и был широким, так и остался...
Хм...Это ещё более интересно, если вы говорите, всё же скрывают. Ранее я был уверен, что именно из-за простоты движка сталкер не стал таким широким, оказывается из-за лени пысов...а значит двигатель как и был широким, так и остался...
Не из-за лени ПЫСов а из- за издателя. Да и слишком уж много всего они напридумывали, а на допиливание времени уже не было.
а, если реально имеешь тёплые отношения с ГСК, то возможно они дадут тебе что-либо...Ну допустим, какбы тебе лично, при условии что ты не будешь это публиковать. Да и какого ж хрена! Они не дают нам рэй, мы что используем его в коммерческих целях?! Я лично готов птратить все бабки на модострой, нежели получить, ибо это алчность...какая может быть коммерция. Какой модмейкер даст плагиатору или коммерческому лицу исходники?! Пусть они будут у таких людей, как ты, я , Скай, Колмогор, Маландринус...если у тебя будут исходники, бампы или отладчики, неужели ты просто так кинешь их в общий форум - бирите все, кто хочет?
Ууу какие диалоги по двиглу ст. Я как программер на втором курсе промолчу в своих не ахти знаниях с++ А про двигло, редактирование x-ray без исходников - как искать иголку в стоге сена.
Скайлоадер нашёл по иголке в каждом из 5 стогов сена по возрастанию. Я трачу на это "казалось бы бесполезное занятие" многие часы в день и всё надеюсь, что хоть что-нибудь, хоть какая-нибудь мелочь удастся. И когда-нибудь, я добьюсь, чего хотел. А про ГСК Oblivion я считаю верно подметил, ноя на них просто зол...Интересно всё-же, что кроется в закромах движка ГСК, который стал для нас непреступым бетонным гробом Саркофага )
А насчёт "разговоров по движку" - это должно было когда-нибудь случится. как видите, тема стала давольно популярный за пару часов её существования, но ничего дельного ещё нет. лишь только разговоры и догадки и никто не хочет действовать или хотябы поддержать меня немного, кроме этой плюшевой собачки, пост который немного позади... =(
kot_da_Vinci, да уж, это точно. в моём случае и с тем и с другим! тк как вы понили уже, у меня ничего неполучается именно поэтому я обратился за поддержкой на этот сайт...решил собрать народ и показать непреступному движку кузькину мать...