С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.87/15: Рейтинг темы: голосов - 15, средняя оценка - 4.87
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
1

Какая dll содержит функцию itoa?

25.02.2015, 20:50. Показов 3005. Ответов 28
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
И "_itoa_s".
Интересует название динамической библиотеки dll для вызова LoadLibrary и в последствии самой ф-ии itoa через GetProcAddress.

Может сразу кто подскажет как узнавать в дальнейшем к какой библиотеке принадлежит функция. Функцию я нашол в stdlib.h, но вот указание на dll что то не вижу...
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
25.02.2015, 20:50
Ответы с готовыми решениями:

Реализовать функцию ItoA и сравнить со стандартной функцией
Здравствуйте, передо мной стоит задача реализовать функцию ItoA и сравнить со стандартной функцией ...

Как подключить функцию itoa (),atoi() в xcode
Здравствуйте, как подключить функцию itoa (),atoi() в xcode?

Написать функцию itoa (n,s) преобразования целого числа n в стринг s
Написать функцию itoa (n,s) преобразования целого числа n в стринг s

Можно ли использовать функцию itoa без записи результата в строку?
Доброго времени суток всем!:) Возник такой вот нубский вопрос, но тем не менее. Можно ли...

28
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
25.02.2015, 20:56 2
Цитата Сообщение от Izual Посмотреть сообщение
Интересует название динамической библиотеки dll для вызова LoadLibrary и в последствии самой ф-ии itoa через GetProcAddress.
Это зависит от используемой версии компилятора. В VS2013, например, это библиотека msvcr120.dll. В VS2012 - msvcr110.dll.
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
25.02.2015, 21:02  [ТС] 3
Цитата Сообщение от DrOffset Посмотреть сообщение
Это зависит от используемой версии компилятора
Как узнать зависимость/формулу зависимости?..
И доп. ифну, т.е. если я программу запущу на винде отличной от моей, то сработает ли, или надо определять по параметрам установленной системы?
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
25.02.2015, 21:09 4
Цитата Сообщение от Izual Посмотреть сообщение
для вызова LoadLibrary
Кстати, имей в виду, что msvcr***.dll (C\C++ - runtime) по-умолчанию уже загружена в адресное пространство твоей программы. Если конечно ты специально ее не отключал в настройках компилятора. Поэтому подгрузка второй версии через LoadLibrary (даже от того же самого компилятора) может привести к неожиданным спецэффектам.

Добавлено через 3 минуты
Цитата Сообщение от Izual Посмотреть сообщение
И доп. ифну, т.е. если я программу запущу на винде отличной от моей, то сработает ли, или надо определять по параметрам установленной системы?
На этой системе должны будут стоять пакеты ms redist соответствующей версии (наверняка сталкивался).
Цитата Сообщение от Izual Посмотреть сообщение
Как узнать зависимость/формулу зависимости?..
Ну вообще просто нужно запомнить, что все стандартные библиотечные функции (win api сюда не относится) расположены в С++ runtime (msvcr***.dll). Ну а вообще можно, например, вот этой программой смотреть всякое.
1
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
25.02.2015, 21:32  [ТС] 5
Цитата Сообщение от DrOffset Посмотреть сообщение
по-умолчанию уже загружена в адресное пространство твоей программы
А как же я могу использовать GetProcAddress, если у меня нет указателя на HMODULE, который берётся из LoadLibrary? (или можно HMODULE взять по другому как то?)
Цитата Сообщение от DrOffset Посмотреть сообщение
можно, например, вот этой программой смотреть всякое
Мне бы более стандартизированные средства, типа тех, которые может предложить код, командная строка или табличку чтоль) Если есть)
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
25.02.2015, 21:53 6
Цитата Сообщение от Izual Посмотреть сообщение
Интересует название динамической библиотеки dll для вызова LoadLibrary...
Может сразу кто подскажет как узнавать в дальнейшем к какой библиотеке принадлежит функция. Функцию я нашол в stdlib.h, но вот указание на dll что то не вижу...
смотри тут или тут
как видно, библиотека называется Kernel32.dll

Что касается itoa, или _itoa_s, то дабы искать, в какой они dll-ке есть, нужно быть уверен, что они там вообще есть в dll-ке, то есть что они являются API-функциями, в чём я далеко не уверен, ибо не нашёл об них инфы по указанным выше ресурсам. Наверное, плохо искал.

Как они тогда реализованы, не интересовался. Ладно если, например, функции itoa соотвествует какая-нибудь API-функция other_itoa, тогда можно найти. А если нет? Что будешь делать? Поэтому не советую исходить из предположения, что какой-нибудь функции обязательно соответствует API-функция. Незачем это. Хочешь выиграть время, вызывая API-функции напрямую? Выигрыш минимальный.

Ну а вообще вот тебе код. Подаёшь на вход имя dll-ки. Результат- имена API-функций, которые в этой dll-ке есть. Ищи среди них нужную тебе, itoa там или ещё что. Можешь пробежаться так по всем dll-кам на твоём компе. Как- это уже другая история. Компилятор g++

Кликните здесь для просмотра всего текста
/*
http://www.firststeps.ru/mfc/winapi/r.php?28
Вот здесь взял исходник. Результаты сохраняются в файл rez.txt

Изменения.

1) Закомментировал APIENTRY. Это в строке int APIENTRY WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
2) Заккоментировал #include "stdafx.h" Кстати, я у Брайана Оверленда прочёл, что #include "stdafx.h"
надо только если среда программирования Visual Studio
3) Добавил #include <windows.h>
4) Везде позаменял IMAGE_OPTIONAL_HEADER32 на IMAGE_OPTIONAL_HEADER
5) Добавил строчку в начало using namespace std;
6) Везде позаменял hUser32 на hima_bibl
7) Добавил вот это LoadLibrary ("wsock32.dll");
Странно, в исходнике почему-то нет
8) В двух местах проги пишем имя своего модуля dll
9) В файле fstream.h заккоментировал строку #include "backward_warning.h"
Иначе почему-то не рабтает
*/

//#include "stdafx.h"
#include <windows.h>
#include "fstream"
#include <iostream>
#include <vector>
#include <string>
#include <algorithm>

#define NTSIGNATURE(a) ((LPVOID)((BYTE *)a + ((PIMAGE_DOS_HEADER)a)->e_lfanew))
#define MakePtr(Type, Base, Offset) ((Type)(DWORD(Base) + (DWORD)(Offset)))



using namespace std;


//Это надо для сортировки
struct element {
long int adres;
string stroka;
element (){};
element (long int x, string& y): adres(x),stroka(y) {};
};

bool comparefun (element x, element y)
{
return x.adres < y.adres;
}



int /*APIENTRY*/ WinMain(HINSTANCE hInstance,HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
{
SetConsoleCP(1251);
SetConsoleOutputCP(1251);


printf ("Вводи через <Enter> имя модуля, ия файла, режим работы с файлом (\"w\"- запись, \"a\"- добавление или \"r\"- чтение)\
После этого получай файл с именами и адресами всех входящих в него API-функций и именем модуля против каждой функции\n");
//Вводим имя модуля
int i= 0;
char ima_modula [MAX_PATH];
char ima_faila [MAX_PATH];
char ima_rezhima [MAX_PATH];

string ima_modula_, ima_faila_, ima_rezhima_;
cin>> ima_modula_>> ima_faila_>> ima_rezhima_;

strcpy (ima_modula, ima_modula_.c_str ());
strcpy (ima_faila, ima_faila_.c_str ());
strcpy (ima_rezhima, ima_rezhima_.c_str());


/*Имя модуля сюда передаётся и двумя строчками ниже
Переменная deskriptor_modula пригодится нам, когда будем передвать её в качестве
параметра функции GetProcAddress
*/
HMODULE deskriptor_modula= LoadLibrary (ima_modula);
//LoadLibrary (ima_modula);


HMODULE hima_bibl=NULL;

//И вот здесь ещё
hima_bibl=GetModuleHandle(ima_modula);
if (hima_bibl==NULL)
{
MessageBox(NULL,"Error Load ima_bibl","Error",MB_OK);
return FALSE;
}

PIMAGE_DOS_HEADER pDOSHead;
pDOSHead = (PIMAGE_DOS_HEADER)hima_bibl;

if ( pDOSHead->e_magic != IMAGE_DOS_SIGNATURE )
{
MessageBox(NULL,"Error Dos Header signature MZ","Error",MB_OK);
return FALSE;
}

PIMAGE_NT_HEADERS pPEHeader;
pPEHeader=(PIMAGE_NT_HEADERS) NTSIGNATURE(pDOSHead);

if ( pPEHeader->Signature != IMAGE_NT_SIGNATURE )
{
MessageBox(NULL,"Error PE Header signature PE","Error",MB_OK);
return FALSE;
}

IMAGE_FILE_HEADER FileHeader;
FileHeader=(IMAGE_FILE_HEADER) pPEHeader->FileHeader;

if (FileHeader.Machine!=IMAGE_FILE_MACHINE_I386)
{
MessageBox(NULL,"Error Not 386 Proccesor","Error",MB_OK);
return FALSE;
}

IMAGE_OPTIONAL_HEADER OptionHeader;
OptionHeader=(IMAGE_OPTIONAL_HEADER) pPEHeader->OptionalHeader;

PIMAGE_EXPORT_DIRECTORY pImportDesc=NULL;
pImportDesc = MakePtr(PIMAGE_EXPORT_DIRECTORY,hima_bibl,
pPEHeader->OptionalHeader.DataDirectory[IMAGE_DIRECTORY_ENTRY_EXPORT].VirtualAddress);

PCSTR *l_ppszName = MakePtr(PCSTR*,pImportDesc->AddressOfNames, hima_bibl);
DWORD x=pImportDesc->NumberOfNames;


//А это адрес функции будет
long int adres_funktsii;

/*А fp будет указатель на файл, куда всё это дело я буду добавлять
(на это указывает "a")
*/
FILE* fp;
fp= fopen (ima_faila,ima_rezhima);


//Так, а тут теперь скропаем массив элементов типа <число и строка>;
//То есть нам надо сортирнуть строки вида; <адрес функции, имя функции, модуль>
//ПО критерию <адрес функции>, для этого скропаем вышеуказанный вектор, сортирнём
//по полю <адрес функции> и выведем куда нам надо
vector <element> vec;

for (DWORD i=0;i<x;i++)
{
char *p=MakePtr(char*,*l_ppszName,hima_bibl);

//Получаем адрес функции
adres_funktsii= (long int)GetProcAddress (LoadLibrary (ima_modula), p);

//И добавляем её в файл... какое там имя
fprintf (fp,"%x %-40s %s\n", adres_funktsii, /*30,*/ p, ima_modula);

l_ppszName++;

//Теперь так:
string t (string (p)+ string(" ")+ string (ima_modula));
vec.push_back (element(adres_funktsii, t));


}
//Теперь файл закроем
fclose (fp);

//Теперь сортирнём vec
sort (vec.begin(), vec.end(), comparefun);
//Теперь откроем нужный файл и перегоним туда чё надо:
string ima_faila_sort (string(ima_faila)+string("_sort.txt"));
ofstream of (ima_faila_sort.c_str());
of.flags(std::ios::hex);
for (int i= 0; i < vec.size(); i++) {
of<<vec[i].adres<< " "<<vec[i].stroka<< "\n";
}
of.close();

return TRUE;
}


Цитата Сообщение от DrOffset Посмотреть сообщение
Поэтому подгрузка второй версии через LoadLibrary (даже от того же самого компилятора) может привести к неожиданным спецэффектам.
где-то читал, что функция LoadLibrary вернёт в этом случае адрес загруженного модуля. Да так, собсно и происходит. И да, считаю необходимым сказать, что LoadLibrary не принадлежит ни к какому компилятору, она часть оси. Вернее сказать, сторонние разработчики ТАКЖЕ могут назвать какое-нибудь своё детище LoadLibrary, но ориентироваться на это- неблагодарное занятие. Есть kernel32, есть LoadLibrary в нём, всё.. Отсюда и пляшем.

Цитата Сообщение от Izual Посмотреть сообщение
И доп. ифну, т.е. если я программу запущу на винде отличной от моей, то сработает ли, или надо определять по параметрам установленной системы?
Я точно знаю, что набор API-функций отличается на windows XP и на windows 7 (то же и для других версий). Может быть в очень минимальной степени, но различается. В общем, тут надо предварительно всё узнавать и предварять свой код соответствующими пояснениями. Ну или можно на ходу кропать MessageBox типа: невозможно запустить программу потому-то и потому-то.
1
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
25.02.2015, 21:58 7
Цитата Сообщение от Izual Посмотреть сообщение
Мне бы более стандартизированные средства, типа тех, которые может предложить код, командная строка или табличку чтоль) Если есть)
Если в msdn не указано из какой dll функция, то скорее всего она находится в msvcrt**.dll. Если dll вообще сторонняя, то только программами наподобие этой. Типичная ситуация: есть готовый exe, нужно узнать какие функции и из каких библиотек он дергает.
Цитата Сообщение от Izual Посмотреть сообщение
А как же я могу использовать GetProcAddress, если у меня нет указателя на HMODULE, который берётся из LoadLibrary? (или можно HMODULE взять по другому как то?)
А зачем это нужно? Функцию ведь и так уже можно позвать. Без всяких GetProcAddress.
Вообще, я не говорил, что что-то можно будет делать или нельзя. Просто предупредил о последствиях. В конечном счете выбор все равно за тобой
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
25.02.2015, 22:01 8
А может, я поторопился с выводами о LoadLibrary тем более, что дескриптор УЖЕ загруженного модуля определяется GetModuleHandle, о чём явно написано здесь. В общем, мой код к изучению, там всё ясно.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
25.02.2015, 22:01 9
Цитата Сообщение от kravam Посмотреть сообщение
где-то читал, что функция LoadLibrary вернёт в этом случае адрес загруженного модуля. Да так, собсно и происходит. И да, считаю необходимым сказать, что LoadLibrary не принадлежит ни к какому компилятору, она часть оси. Вернее сказать, сторонние разработчики ТАКЖЕ могут назвать какое-нибудь своё детище LoadLibrary, но ориентироваться на это- неблагодарное занятие.
Вообще-то я не про LoadLibrary писал, а про C++ runtime. Так что ты что-то не в тему сейчас сказал.
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
25.02.2015, 22:06 10
Цитата Сообщение от DrOffset Посмотреть сообщение
Так что ты что-то не в тему сейчас сказал.
да я всегда не в тему говорю.
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
25.02.2015, 22:08 11
Цитата Сообщение от kravam Посмотреть сообщение
да я всегда не в тему говорю.
Не знаю. Просто прочитай еще раз сообщение. Там все понятно. По крайней мере, автор понял меня верно
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
25.02.2015, 22:11 12
Цитата Сообщение от DrOffset Посмотреть сообщение
Не знаю. Просто прочитай еще раз сообщение. Там все понятно. По крайней мере, автор понял меня верно
всё ты знаешь.
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
26.02.2015, 00:25  [ТС] 13
Цитата Сообщение от DrOffset Посмотреть сообщение
предупредил о последствиях
Цитата Сообщение от DrOffset Посмотреть сообщение
msvcr***.dll (C\C++ - runtime) по-умолчанию уже загружена в адресное пространство твоей программы
Я потому и спрашиваю, что не хочется на грабли наткнуться. Вопрос с поинтером HANDLE для *уже загруженного дефолтом остаётся.
Так, по порядку..
Цитата Сообщение от DrOffset Посмотреть сообщение
Это зависит от используемой версии компилятора. В VS2013, например, это библиотека msvcr120.dll. В VS2012 - msvcr110.dll.
В рантайме загружена автоматом дллка значит, та которая лежит в system32.. (про msvcr)
Так функционал этих msvcrXXX отличается..
Цитата Сообщение от kravam Посмотреть сообщение
Подаёшь на вход имя dll-ки
Вот тут вопрос...
Я подаю имя дллки которая у пользователя на компьютере, исходя из неё вытаскиваю функционал который предоставляет ПС? (т.е. у пользователя например есть vmvcr110, в ней 100 функций)
Через проверку ошибки функции я контролирую, действительно ли есть эта функция.
C++
1
2
3
//Получаем адрес функции
adres_funktsii= (long int)GetProcAddress (LoadLibrary (ima_modula), p);
//в *p указатель на имя функции
Если адрес функции не выдаст нулл, то функция найдена и может работать теоретически..

Цитата Сообщение от DrOffset Посмотреть сообщение
Функцию ведь и так уже можно позвать
Вот я её и зову через *pstr. Оптимизация..
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
26.02.2015, 09:11 14
Цитата Сообщение от Izual Посмотреть сообщение
Так функционал этих msvcrXXX отличается..
Незначительно. Здесь важен не функционал, а имена функций. А они одинаковые везде. Возьми разные версии msvcr и посмотри что они экспортируют, совпадение будет на 95%. Смотреть можно прогой, которую я дал выше, или есть еще плагин для total commander, который по F3 это показывает.

Цитата Сообщение от Izual Посмотреть сообщение
Вот я её и зову через *pstr. Оптимизация..
Не, оптимизация - это когда компилятор может вместо косвенного вызова сделать прямой или вообще встроить функцию. Этого точно не будет при вызове через указатель полученный от GetProcAddress. Но это еще ладно.

Цитата Сообщение от Izual Посмотреть сообщение
Если адрес функции не выдаст нулл, то функция найдена и может работать теоретически..
В случае с runtime эту проверку за тебя сделает линкер. Я бы на твоем месте оставил runtime в покое. Он же итак всегда с тобой, причем правильной версии и функции из него априори доступны для вызова.
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
26.02.2015, 15:05  [ТС] 15
С вопросом о использовании LoadLibrary нарыл вот что:
C++
1
2
3
4
5
6
7
8
HMODULE hKernel32=NULL;
hKernel32=GetModuleHandle("Kernel32");
if (hKernel32==NULL)
{
MessageBox(NULL,"Error Load Kernel32","Error",MB_OK);
return FALSE;
}
hDelete=(hDeleteFunc)GetProcAddress(Эта функция возврашает указатель на модуль, если он загружен. Но Kernel32.Dll - это системная библиотека Windows и она находится в памяти всегда. Если это не так, то нужно использовать LoadLibraryernel32,"DeleteFileA");
Полезно, топик был создан явно не зря)
0
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
26.02.2015, 16:55 16
Цитата Сообщение от Izual Посмотреть сообщение
Вот тут вопрос...
какой вопрос-то?
Цитата Сообщение от Izual Посмотреть сообщение
Если адрес функции не выдаст нулл, то функция найдена и может работать теоретически..
ну
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
26.02.2015, 17:52  [ТС] 17
Цитата Сообщение от kravam Посмотреть сообщение
какой вопрос-то?
1. itoa я так и не нашёл))) Хотя пока что изучением глубже темы немного занялся, наверно потому не тестил больше.
2. Стоит ли носить с собой набор dll библиотек?(т.е. если я только лишь dllки пихну в папку, то без доп. файлов они будут работать?, подразумеваю что к примеру
Цитата Сообщение от DrOffset Посмотреть сообщение
ms redist
в этом пакете куча файлов поидее, и dll и libы и ещё куча всего, но если redist не установлен, а с собой (моя)программа носит голые дллки, то будут ли они работать при их загрузке программой?)
В общем то пока что всё ясно... кроме того где эта itoa лежит)))
0
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
26.02.2015, 18:42 18
Цитата Сообщение от Izual Посмотреть сообщение
В общем то пока что всё ясно... кроме того где эта itoa лежит)))
Так я же сказал где. Пруф в прикрепленной картинке.

Цитата Сообщение от Izual Посмотреть сообщение
но если redist не установлен, а с собой (моя)программа носит голые дллки, то будут ли они работать при их загрузке программой?)
Будут. Но с оговорками на спецэффекты при загрузке двух msvcr** одновременно. Впрочем зависит от того, что конкретно ты будешь делать. Может и не проявиться никак
Миниатюры
Какая dll содержит функцию itoa?  
0
Ушел с форума
Эксперт С++
16478 / 7441 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
26.02.2015, 20:03 19
1. itoa я так и не нашёл)))
Реализация itoa находится в библиотеке Visual C/C++ Runtime.
Эта библиотека может подключаться как статически (.lib), так и
динамически (.dll, по умолчанию), в зависимости от настроек
проекта (см. раздел C++, Runtime Library). Вопрос обсуждался
бесчисленное количество раз...

2. Стоит ли носить с собой набор dll библиотек?(т.е. если я
только лишь dllки пихну в папку, то без доп. файлов они будут работать?
Будут. Для этого достаточно лишь распостранять вместе с программой парочку dll,
взятых из папки VC\redist\x86\Microsoft.VCXX.CRT от установленной "Студии" (это я
сейчас не рассматриваю ситуации, где также используются MFC, ATL или OpenMP).

подразумеваю что к примеру ms redist в этом пакете куча файлов поидее, и
dll и libы и ещё куча всего, но если redist не установлен, а с собой (моя)программа
носит голые дллки, то будут ли они работать при их загрузке программой?)
Vcredist всего лишь распаковывает dll-ки из Visual C/C++ Runtime в
системные папки, никаких .lib и "кучи всего" там нет.
0
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
26.02.2015, 20:23  [ТС] 20
Цитата Сообщение от Убежденный Посмотреть сообщение
из папки VC\redist\x86\Microsoft.VCXX.CRT от установленной "Студии"
А в папке system32 тоже есть dll'ки, они соответствуют тем что от студии? (ну если мне не захочется с собой dll'ки лишние носить, а скажем использовать только стандарт, предусмотренный заранее виндой, типа там user32, kernel32, msvcr...)
0
26.02.2015, 20:23
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
26.02.2015, 20:23
Помогаю со студенческими работами здесь

itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию)))
доброе утор, день, вечер. нужна реализация itoa, у меня получилось следующее char ito(int value)...

Разработать программу, которая содержит функцию замены местами первого и последнего столбцов матрицы и функцию
Разработать программу, которая содержит функцию замены местами первого и последнего столбцов...

Определить, какая функция в программе вызывает экспортируемую функцию моей dll
Как определить, какая функция в программе вызывает экспортируемую функцию моей длл?

За какую функцию отвечают user32.dll,kernel32,winmm.dll
Помогите мне пожалуйста,разобратся с этими DLLками. Если есть где можно скачать матерьял,буду...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru