Вопрос № 53791: Доброго времени суток. Хочу изучить С++, может кто-нибудь подскажет, какой - нибудь free компилятор, а также какие файлы качать. Нашел пару ссылок, но там список в сотню пунктов....Вопрос № 53805: Здравствуйте уважаемые эксперты.
Насколько реально в си сделать так:
1. Скомпилировать кусок кода из своей программы в машинный код (это можно)
2. Записать этот код в память
3. Заменить в нём некоторые обращения к оперативно...Вопрос № 53821: Здравствуйте уважаемы эксперты!
Есть следующая задача:
Некая программа создает свои логи в папках, имена которых формируются из текущей даты (например 30082006).
Необходимо написать такую программу, которая каждое утро при загрузке ...
Вопрос № 53.791
Доброго времени суток. Хочу изучить С++, может кто-нибудь подскажет, какой - нибудь free компилятор, а также какие файлы качать. Нашел пару ссылок, но там список в сотню пунктов.
Отправлен: 30.08.2006, 17:25
Вопрос задал: Elpher2006 (статус: Посетитель)
Всего ответов: 1 Мини-форум вопроса >>> (сообщений: 0)
Отвечает: Vaga
Здравствуйте, Elpher2006!
http://www.thefreecountry.com/compilers/cpp.shtml
http://www.bloodshed.net/devcpp.html
http://gcc.gnu.org/
http://www.compilers.net/Dir/Free/Compilers/CCpp.htm
http://community.borland.com/article/0,1410,20633,00.html
можно еще больше накопать если гуглом воспользоваться.
--------- Вольному - воля
Ответ отправил: Vaga (статус: 2-ой класс)
Ответ отправлен: 30.08.2006, 18:31
Вопрос № 53.805
Здравствуйте уважаемые эксперты.
Насколько реально в си сделать так:
1. Скомпилировать кусок кода из своей программы в машинный код (это можно)
2. Записать этот код в память
3. Заменить в нём некоторые обращения к оперативной памяти константами. (если переменная используется в коде только на чтение)
4. Выполнить и вернуться в основную программу
Выполнять это всё планируется под Windows
Отправлен: 30.08.2006, 19:33
Вопрос задал: C4tnt (статус: 2-ой класс)
Всего ответов: 3 Мини-форум вопроса >>> (сообщений: 1)
Отвечает: Mihasic
Здравствуйте, C4tnt!
Ну, есть 3 способа:
1. Рзаобраться в формате машинных команд, особенно учитывая положение в памяти (т.е. при загрузке скомпилированного кода в память - преобразовывать его относительно начального адреса, по которому загружается). - это довольно лсожный способ, но, возможно, наиболее эффективный.
2. Включить в свою программу исходники какого-то компилятора и пользоваться им для создания запускаемого файла либо библиотеки (dll) и далее работать с ней (забота о преобразовании адресов ложится на ОС).
3. Написать интерпретатор, где команды не будут преобразовываться в машинные коды, а будут интерпретироваться.
Третий способ хорош всем кроме производительности, но язык Java это не остановило ;)
Ответ отправил: Mihasic (статус: 6-ой класс)
Ответ отправлен: 30.08.2006, 20:08 Оценка за ответ: 4
Отвечает: Хватов Сергей
Здравствуйте, C4tnt!
Пункт 3 в общем случае невыполним.
Пункты 2 и 4 - это реально, но достаточно сложно.
Вы лучше расскажите ЧТО на самом деле вам надо сделать.
То, КАК вы это собираетесь делать, выглядит крайне странно.
Ответ отправил: Хватов Сергей (статус: 3-ий класс)
Ответ отправлен: 31.08.2006, 10:37
Отвечает: Www2
Здравствуйте, C4tnt!
1. Скомпилируйте в объектный код, а затем вытащите оттуда машинный код, например с помощью редактора hiew, pview или подобного им, который умеет дизассемблировать код.
2. Загрузите этот кусок в память.
3. Если переменная была описана в исходном тексте программы, снаружи программы никому не доступна, и ни разу не изменялась, то оптимизирующий компилятор должен был сам заменить все обращения к переменной на инструкции с непосредственными операндами. Все современные компиляторы - оптимизирующие, исключение разве что - отладочный режим компиляции, в нём компилятор не следит за качеством кода, а старается скомпилировать всё как можно быстрее, с контролем ошибок и без оптимизации.
4. Выполнить этот кусок под Windows просто так не получится, Windows (как и все операционные системы, работающие в защищённом режиме) запрещает выполнение кода в блоке памяти, выделенной для хранения данных. Необходимо изменить атрибуты выделенного куска оперативной памяти средствами операционной системы (сделать системный вызов), добавив возможность его исполнения.
Не совсем понятно зачем всё это нужно. Вполне возможно, что вам подойдёт и dll-библиотеки. Или вы пишете вирус? =D
--------- Нет правил без исключений, правило без исключения - это исключение из правил.
Ответ отправил: Www2 (статус: 7-ой класс)
Ответ отправлен: 01.09.2006, 06:22
Вопрос № 53.821
Здравствуйте уважаемы эксперты!
Есть следующая задача:
Некая программа создает свои логи в папках, имена которых формируются из текущей даты (например 30082006).
Необходимо написать такую программу, которая каждое утро при загрузке компа перемещала бы папку за прошлый день из исходного места в другое, которое я прописываю в ini или реестре.
У меня небольшие познания в C++Builder. Объясните, плиз, подробно как это все осуществить. Желательно примеры.
Отвечает: Яруллин Азат Рифкатович
Здравствуйте, Саморуков Дмитрий Владимирович!
Предположим что у Вас программа уж еавтоматичемки запускается... при каждом включении компбютера...
Для начала получим текущую дату...
объявим структуру SYSTEMTIME, получим информацию...
SYSTEMTIME sm;
GetLocalTime(&sm);
получили дынные, где sm.wYear - текущий год, sm.wMonth - порядковый номер месяца, sm.wDay - день.
далее проверяем на существование файла с соответствующим именем (день при этом уменьшаем на 1, если день == 1, то необходимо уменьшить месяц на 1 и т.д...).
составляем имя файла:
(смотрите приложение)
wsprintf(filename, "%s%s%s", day, month, sm.wYear);
получили имя файла (filename)...
далее смотрим, есть ли у нас файл с этим именем...
вот функция, определяющая, существует ли файл:
bool FileExists(LPCTSTR fname){
WIN32_FIND_DATA wfd;
HANDLE hFind = FindFirstFile(fname, &wfd);
if (INVALID_HANDLE_VALUE != hFind){
// Если этого не сделать то произойдет утечка ресурсов
FindClose(hFind);
return true;
}
return false;
}
другие способы определения существования файла на диске можете посмотреть здесь:
http://www.rsdn.ru/article/qna/baseserv/fileexist.xml
если же файл существует, то перемещаем его с помощью функции MoveFile(LPCTSTR fromName, LPCTSTR toName);
fromName - откуда, toName - куда переместить файл.
подробнее можете прочитать здесь:
http://www.rsdn.ru/article/qna/baseserv/fileop.xml
если же файла не существет (значит он уже был перемещен).
делаем выход из программы.
Работа с реестром:
http://www.firststeps.ru/mfc/steps/r.php?39
Работа с ini файлами:
http://www.firststeps.ru/mfc/ini/ini1.html
Удачи!
P.S. Приведенный код не проверял.
Приложение:
Ответ отправил: Яруллин Азат Рифкатович (статус: Студент)
Ответ отправлен: 31.08.2006, 04:01 Оценка за ответ: 5 Комментарий оценки: Большое спасибо! Буду разбираться!