Громко не смеяться - только начинаю программировать. Не до конца понимаю для чего нужны .lib Если не сложно расскажите более подробно что да как или подскажите где читать - только конкретно (книга, страница и т.д.) Из того что понимаю (возможно правильно): при написании под win32 для вызова API функций в начале кода подключаются инклуды и библиотеки (.inc .lib). В инклудах (.inc) описаны прототипы вида ExitProcess proto uExitCodeWORD. а библиотеки (.lib) это что-то компилированное. В начале кода вместо указания файла нужного инклуда можно написать нужный нам прототип содержащийся в определенном инклуде. Что содержится в библиотеках (.lib)?Первые уроки Iczelion'а просвещения не дали, а только образовали кучу вопросов. Есть ли другие способы обращения к API функциям? (не используя .inc .lib)
Честно говоря я это знал, но расчитывал на более раскрытый ответ Если можно, приведите простой пример.
Какой? Укажите степень простоты. Инки вы можете не использовать если опишете константы и структуры в основном файле, или не будете их использовать вообще. Для доступа к апи функциям можно, например, читать секцию импорта нужной длл-и, но для полного новичка лучше привыкать к либам - очень полезной штуке.
_basmp_ Они просто собраны в один архив, но никоим образом не пожаты. Shoorup Предположим, что речь идёт о библиотеках импорта. В них содержатся машинный код и определения символов, которые позволяют из экзешника обращаться к функциям, находящимся в других модулях (обычно в DLL). Чтобы лучше это всё понять, рекомендую почитать описание COFF формата (тут где-то на сайте лежит) и статьи по динамической линковке (первая часть "Упаковщиков", например).
Прошу прощения - не подумал. интересно, что ar-ные под линухом .о-шки прекрасно понимаются МС линком как софф библиотеки. То есть либы - это простые архивы (спец. формата) объектников. и совсем рискуя опозориться замечу, что тут речь идет скорее о статической линковке.
_basmp_ Точно? По-мойму ar-ные обьектники воспринимает только GNU LD, хоть и в COFF формате. Ну, я имел в виду динамическую, подразумевая импорт. COFF библиотеки формируют секцию импорта.
Только-что посмотрел. Вот живая строка: Код (Text): cl -Zi /Felua.exe -O1 -w *.obj hashit\hashit.lib em\libemk.a em\libmodule.a em\libem_mes.a *.lib - либа от MSVC6, *.а - cygwin-овская gcc-3.4.4 либа (ar cr). Все собирается и работает нормально.
Quantum _basmp_ Речь шла про win32 API, т.ч. именно динамическая. Shoorup Поэтому в kernel32.lib user32.lib и т.п. нет объектного кода - там только переходники в DLL. В этом смысле они похожи на инклюды и не нужно их использовать, если знать чем заменить. Вроде def-файл нужен?
В папке masm32lib - исходники соответствующей библиотеки. Можно и не подключаая всю библиотеку вставить в программу функцию, например : Код (Text): BmpBut proto :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD ;..... .data Bmp_But_Class db "Bmp_But_Class",0 cFlag dd 0 start: ;.......... invoke BmpBut,hWnd,...,...,...,...,... ;.......... BmpBut proc hParent:DWORD,topX:DWORD,topY:DWORD,wid:DWORD,hgt:DWORD,ID:DWORD LOCAL hButn :DWORD LOCAL hModule :DWORD LOCAL wc :WNDCLASSEX invoke GetModuleHandle,NULL mov hModule, eax mov wc.cbSize, sizeof WNDCLASSEX mov wc.style, CS_BYTEALIGNWINDOW mov wc.lpfnWndProc, offset BmpButProc mov wc.cbClsExtra, NULL mov wc.cbWndExtra, NULL push hModule pop wc.hInstance mov wc.hbrBackground, COLOR_BTNFACE+1 mov wc.lpszMenuName, NULL mov wc.lpszClassName, offset Bmp_But_Class mov wc.hIcon, NULL invoke LoadCursor,NULL,IDC_ARROW mov wc.hCursor, eax mov wc.hIconSm, NULL invoke RegisterClassEx, ADDR wc invoke CreateWindowEx, 0, ADDR Bmp_But_Class, NULL, WS_CHILD, topX,topY,wid,hgt,hParent,ID, hModule,NULL mov hButn, eax invoke SetWindowPos,hButn,HWND_TOP,0,0,wid,hgt,SWP_NOMOVE invoke ShowWindow,hButn,SW_SHOW mov eax, hButn ret BmpBut endp BmpButProc proc hWn :DWORD,uMsg :DWORD,wParam :DWORD,lParam :DWORD LOCAL hParent:DWORD LOCAL ID :DWORD .if uMsg==WM_ERASEBKGND invoke SelectObject,wParam,hBrush1 invoke PatBlt, wParam,0,0,W,H,PATCOPY return TRUE .elseif uMsg == WM_LBUTTONDOWN invoke SetCapture,hWn mov cFlag, 1 .elseif uMsg == WM_LBUTTONUP .if cFlag == 0 ret .else mov cFlag, 0 .endif invoke GetParent,hWn mov hParent, eax invoke GetDlgCtrlID,hWn mov ID, eax invoke SendMessage,hParent,WM_COMMAND,ID,hWn invoke ReleaseCapture .endif invoke DefWindowProc,hWn,uMsg,wParam,lParam ret BmpButProc endp end start Исходная функция BmpButton не совсем устраивает - там создаётся окошко 100х100. Появляются глюки, если кнопку нужно сделать в процессе выполнения программы.... Модифицировать можно под свои нужды...Например приведённая ф. - раскрашивает кнопку кистью сделанной из маленькой картинки и не нужно теперь загружать большую по размерам кнопки... Так же можно ( или нужно, иногда) издеваться и над функциями из системных библиотек, особенно когда есть подозрение, что они не одинаково работают в разных версиях форточек (а такое подозрение лично у меня есть) - и когда ты сможешь их выковырить и разобраться с ними.
Очень все понятно, особенно новичку А что за переходники? Честно говоря хотелось просто ухнать можно ли обратиться к API функциям не подключая чеголибо вообще и хотелось бы увидеть пример простой как. Например я понял, что можно обойтись без подключение .inc. Для этого смотрим в тот самый .inc и находим ему эквивалент и пишем например так: Код (Text): .386 .model flat,stdcall option casemap:none MessageBox equ <MessageBoxA> MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD ExitProcess PROTO :DWORD includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib .data MsgBoxCaption db "Iczelion Tutorial No.2",0 MsgBoxText db "Win32 Assembly is Great!",0 .code start: invoke MessageBox, 0, addr MsgBoxText, addr MsgBoxCaption, 0 invoke ExitProcess, 0 end start Можно ли в этом коде не подключать Код (Text): includelib \masm32\lib\kernel32.lib includelib \masm32\lib\user32.lib и вообще ничего не подключать? А именно заменить библиотеки кодом каким-либо.
Спасибоmasm32, ответил пока я писал вопрос а к моему коду как заменить библиотеки? И подскажите как я могу в будущем заменять библиотеку функцией, как посмотреть содержимое библиотеки?
valterg У чела затруднения с .lib-ами, те статическая. И с задллеными ф-ями без .lib-ов, те динамическая. И с полным неиспользованием никаких .lib-ов, те через экспорт кернела как минимум. И с описаниями в .inc-ах. И вообще новичку желательно сходить в ветку 'BOOKS' ('КНИГИ') и посмотреть, что там рекомендуют новичкам. Почитать. Многое станет значительно понятнее.
_basmp_ , никто и не спорит что читать книги полезно! Книг много, а ответ найти иногда очень сложно на поставленную задачу. Именно поэтому и задал вопрос на форуме и попросил если не ответить, то подсказать где читать.
Shoorup кернел вам подключать прийдется. Иначе жизнь ваша поначалу будет очень сложной. Все остальные длл-и и их ф-ции добываются через ф-ции kernel32.dll: HMODULE LoadLibrary(char* dll_path_name); FARPROC GetProcAddress( HMODULE hModule, // handle to DLL module char* proc_name // name of function ); Есть и другие методы, но простыми для новичка их не назовёшь.
Вы сильно сложную задачу ставите - обойти стандартные механизмы, причем просто и доступно для новичка. В ветке 'BOOKS' уже не раз обсуждалось, что и в какой последовательности читать новичкам по асму и инструментам. Лично я высказывался за зубкова, но люди говорили, что есть и лучше. Кроме того неизвестно насколько вы новичок. И еще, имхо если вы действительно новичок и хотите разобраться как-что работает, вам лучше поменьше пользоваться макросами. Они много чего скрывают.