143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
1 | |
Какая dll содержит функцию itoa?25.02.2015, 20:50. Показов 3005. Ответов 28
Метки нет (Все метки)
И "_itoa_s".
Интересует название динамической библиотеки dll для вызова LoadLibrary и в последствии самой ф-ии itoa через GetProcAddress. Может сразу кто подскажет как узнавать в дальнейшем к какой библиотеке принадлежит функция. Функцию я нашол в stdlib.h, но вот указание на dll что то не вижу...
0
|
25.02.2015, 20:50 | |
Ответы с готовыми решениями:
28
Реализовать функцию ItoA и сравнить со стандартной функцией Как подключить функцию itoa (),atoi() в xcode Написать функцию itoa (n,s) преобразования целого числа n в стринг s Можно ли использовать функцию itoa без записи результата в строку? |
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
25.02.2015, 20:56 | 2 |
Это зависит от используемой версии компилятора. В VS2013, например, это библиотека msvcr120.dll. В VS2012 - msvcr110.dll.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
25.02.2015, 21:02 [ТС] | 3 |
Как узнать зависимость/формулу зависимости?..
И доп. ифну, т.е. если я программу запущу на винде отличной от моей, то сработает ли, или надо определять по параметрам установленной системы?
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
25.02.2015, 21:09 | 4 |
Кстати, имей в виду, что msvcr***.dll (C\C++ - runtime) по-умолчанию уже загружена в адресное пространство твоей программы. Если конечно ты специально ее не отключал в настройках компилятора. Поэтому подгрузка второй версии через LoadLibrary (даже от того же самого компилятора) может привести к неожиданным спецэффектам.
Добавлено через 3 минуты На этой системе должны будут стоять пакеты ms redist соответствующей версии (наверняка сталкивался). Ну вообще просто нужно запомнить, что все стандартные библиотечные функции (win api сюда не относится) расположены в С++ runtime (msvcr***.dll). Ну а вообще можно, например, вот этой программой смотреть всякое.
1
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
25.02.2015, 21:32 [ТС] | 5 |
А как же я могу использовать GetProcAddress, если у меня нет указателя на HMODULE, который берётся из LoadLibrary? (или можно HMODULE взять по другому как то?)
Мне бы более стандартизированные средства, типа тех, которые может предложить код, командная строка или табличку чтоль) Если есть)
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
|
|
25.02.2015, 21:53 | 6 |
смотри тут или тут
как видно, библиотека называется 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; } где-то читал, что функция LoadLibrary вернёт в этом случае адрес загруженного модуля. Да так, собсно и происходит. И да, считаю необходимым сказать, что LoadLibrary не принадлежит ни к какому компилятору, она часть оси. Вернее сказать, сторонние разработчики ТАКЖЕ могут назвать какое-нибудь своё детище LoadLibrary, но ориентироваться на это- неблагодарное занятие. Есть kernel32, есть LoadLibrary в нём, всё.. Отсюда и пляшем. Я точно знаю, что набор API-функций отличается на windows XP и на windows 7 (то же и для других версий). Может быть в очень минимальной степени, но различается. В общем, тут надо предварительно всё узнавать и предварять свой код соответствующими пояснениями. Ну или можно на ходу кропать MessageBox типа: невозможно запустить программу потому-то и потому-то.
1
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
25.02.2015, 21:58 | 7 |
Если в msdn не указано из какой dll функция, то скорее всего она находится в msvcrt**.dll. Если dll вообще сторонняя, то только программами наподобие этой. Типичная ситуация: есть готовый exe, нужно узнать какие функции и из каких библиотек он дергает.
А зачем это нужно? Функцию ведь и так уже можно позвать. Без всяких GetProcAddress. Вообще, я не говорил, что что-то можно будет делать или нельзя. Просто предупредил о последствиях. В конечном счете выбор все равно за тобой
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
25.02.2015, 22:01 | 9 |
Вообще-то я не про LoadLibrary писал, а про C++ runtime. Так что ты что-то не в тему сейчас сказал.
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
|
|
25.02.2015, 22:06 | 10 |
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
25.02.2015, 22:08 | 11 |
Не знаю. Просто прочитай еще раз сообщение. Там все понятно. По крайней мере, автор понял меня верно
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
|
|
25.02.2015, 22:11 | 12 |
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||||||
26.02.2015, 00:25 [ТС] | 13 | |||||
Я потому и спрашиваю, что не хочется на грабли наткнуться. Вопрос с поинтером HANDLE для *уже загруженного дефолтом остаётся.
Так, по порядку.. В рантайме загружена автоматом дллка значит, та которая лежит в system32.. (про msvcr) Так функционал этих msvcrXXX отличается.. Вот тут вопрос... Я подаю имя дллки которая у пользователя на компьютере, исходя из неё вытаскиваю функционал который предоставляет ПС? (т.е. у пользователя например есть vmvcr110, в ней 100 функций) Через проверку ошибки функции я контролирую, действительно ли есть эта функция.
Вот я её и зову через *pstr. Оптимизация..
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
26.02.2015, 09:11 | 14 |
Незначительно. Здесь важен не функционал, а имена функций. А они одинаковые везде. Возьми разные версии msvcr и посмотри что они экспортируют, совпадение будет на 95%. Смотреть можно прогой, которую я дал выше, или есть еще плагин для total commander, который по F3 это показывает.
Не, оптимизация - это когда компилятор может вместо косвенного вызова сделать прямой или вообще встроить функцию. Этого точно не будет при вызове через указатель полученный от GetProcAddress. Но это еще ладно. В случае с runtime эту проверку за тебя сделает линкер. Я бы на твоем месте оставил runtime в покое. Он же итак всегда с тобой, причем правильной версии и функции из него априори доступны для вызова.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
||||||
26.02.2015, 15:05 [ТС] | 15 | |||||
С вопросом о использовании LoadLibrary нарыл вот что:
0
|
быдлокодер
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,686
|
|
26.02.2015, 16:55 | 16 |
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
26.02.2015, 17:52 [ТС] | 17 |
1. itoa я так и не нашёл))) Хотя пока что изучением глубже темы немного занялся, наверно потому не тестил больше.
2. Стоит ли носить с собой набор dll библиотек?(т.е. если я только лишь dllки пихну в папку, то без доп. файлов они будут работать?, подразумеваю что к примеру в этом пакете куча файлов поидее, и dll и libы и ещё куча всего, но если redist не установлен, а с собой (моя)программа носит голые дллки, то будут ли они работать при их загрузке программой?) В общем то пока что всё ясно... кроме того где эта itoa лежит)))
0
|
19409 / 10028 / 2443
Регистрация: 30.01.2014
Сообщений: 17,678
|
|
26.02.2015, 18:42 | 18 |
Так я же сказал где. Пруф в прикрепленной картинке.
Будут. Но с оговорками на спецэффекты при загрузке двух msvcr** одновременно. Впрочем зависит от того, что конкретно ты будешь делать. Может и не проявиться никак
0
|
Ушел с форума
|
|
26.02.2015, 20:03 | 19 |
Эта библиотека может подключаться как статически (.lib), так и динамически (.dll, по умолчанию), в зависимости от настроек проекта (см. раздел C++, Runtime Library). Вопрос обсуждался бесчисленное количество раз... взятых из папки VC\redist\x86\Microsoft.VCXX.CRT от установленной "Студии" (это я сейчас не рассматриваю ситуации, где также используются MFC, ATL или OpenMP). системные папки, никаких .lib и "кучи всего" там нет.
0
|
143 / 122 / 21
Регистрация: 13.11.2012
Сообщений: 1,564
|
|
26.02.2015, 20:23 [ТС] | 20 |
А в папке system32 тоже есть dll'ки, они соответствуют тем что от студии? (ну если мне не захочется с собой dll'ки лишние носить, а скажем использовать только стандарт, предусмотренный заранее виндой, типа там user32, kernel32, msvcr...)
0
|
26.02.2015, 20:23 | |
26.02.2015, 20:23 | |
Помогаю со студенческими работами здесь
20
itoa. перевод числа в строку. реализуем вырезанную из стандарта функцию))) Разработать программу, которая содержит функцию замены местами первого и последнего столбцов матрицы и функцию Определить, какая функция в программе вызывает экспортируемую функцию моей dll За какую функцию отвечают user32.dll,kernel32,winmm.dll Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |