.lib - что это? Просветите новичка.

Тема в разделе "WASM.BEGINNERS", создана пользователем Shoorup, 6 май 2008.

  1. Shoorup

    Shoorup Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    109
    Громко не смеяться - только начинаю программировать.
    Не до конца понимаю для чего нужны .lib
    Если не сложно расскажите более подробно что да как или подскажите где читать - только конкретно (книга, страница и т.д.)

    Из того что понимаю (возможно правильно):
    при написании под win32 для вызова API функций в начале кода подключаются инклуды и библиотеки (.inc .lib). В инклудах (.inc) описаны прототипы вида ExitProcess proto uExitCode:lol: WORD. а библиотеки (.lib) это что-то компилированное.
    В начале кода вместо указания файла нужного инклуда можно написать нужный нам прототип содержащийся в определенном инклуде.

    Что содержится в библиотеках (.lib)?Первые уроки Iczelion'а просвещения не дали, а только образовали кучу вопросов. Есть ли другие способы обращения к API функциям? (не используя .inc .lib)
     
  2. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Пожатые скомпиленые объектники (кучками).
    Есть.
     
  3. Shoorup

    Shoorup Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    109
    Честно говоря я это знал, но расчитывал на более раскрытый ответ :)
    Если можно, приведите простой пример.
     
  4. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Какой?
    Укажите степень простоты. Инки вы можете не использовать если опишете константы и структуры в основном файле, или не будете их использовать вообще. Для доступа к апи функциям можно, например, читать секцию импорта нужной длл-и, но для полного новичка лучше привыкать к либам - очень полезной штуке.
     
  5. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    _basmp_
    Они просто собраны в один архив, но никоим образом не пожаты.

    Shoorup
    Предположим, что речь идёт о библиотеках импорта. В них содержатся машинный код и определения символов, которые позволяют из экзешника обращаться к функциям, находящимся в других модулях (обычно в DLL). Чтобы лучше это всё понять, рекомендую почитать описание COFF формата (тут где-то на сайте лежит) и статьи по динамической линковке (первая часть "Упаковщиков", например).
     
  6. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Прошу прощения - не подумал.
    интересно, что ar-ные под линухом .о-шки прекрасно понимаются МС линком как софф библиотеки. То есть либы - это простые архивы (спец. формата) объектников.
    и совсем рискуя опозориться замечу, что тут речь идет скорее о статической линковке.
     
  7. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    _basmp_
    Точно? По-мойму ar-ные обьектники воспринимает только GNU LD, хоть и в COFF формате.

    Ну, я имел в виду динамическую, подразумевая импорт. COFF библиотеки формируют секцию импорта.
     
  8. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Только-что посмотрел. Вот живая строка:
    Код (Text):
    1. 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).
    Все собирается и работает нормально.
     
  9. Quantum

    Quantum Паладин дзена

    Публикаций:
    0
    Регистрация:
    6 янв 2003
    Сообщения:
    3.143
    Адрес:
    Ukraine
    _basmp_
    Очень интересно. Видимо, МС зачем-то понадобилось сделать поддержку GNU AR.
     
  10. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    Quantum
    _basmp_
    Речь шла про win32 API, т.ч. именно динамическая.
    Shoorup
    Поэтому в kernel32.lib user32.lib и т.п. нет объектного кода - там только переходники в DLL.
    В этом смысле они похожи на инклюды и не нужно их использовать, если знать чем заменить.
    Вроде def-файл нужен?
     
  11. masm32

    masm32 New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2008
    Сообщения:
    147
    В папке masm32lib - исходники соответствующей библиотеки.
    Можно и не подключаая всю библиотеку вставить в программу функцию, например :
    Код (Text):
    1. BmpBut    proto :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
    2. ;.....
    3.  
    4. .data
    5. Bmp_But_Class    db "Bmp_But_Class",0
    6. cFlag            dd 0
    7.  
    8. start:
    9. ;..........
    10. invoke BmpBut,hWnd,...,...,...,...,...
    11. ;..........
    12. BmpBut proc hParent:DWORD,topX:DWORD,topY:DWORD,wid:DWORD,hgt:DWORD,ID:DWORD
    13.     LOCAL hButn  :DWORD
    14.     LOCAL hModule :DWORD
    15.     LOCAL wc      :WNDCLASSEX
    16.     invoke GetModuleHandle,NULL
    17.     mov hModule, eax   
    18.     mov wc.cbSize,         sizeof WNDCLASSEX
    19.     mov wc.style,          CS_BYTEALIGNWINDOW
    20.     mov wc.lpfnWndProc,    offset BmpButProc
    21.     mov wc.cbClsExtra,     NULL
    22.     mov wc.cbWndExtra,     NULL
    23.     push hModule
    24.     pop wc.hInstance
    25.     mov wc.hbrBackground,  COLOR_BTNFACE+1
    26.     mov wc.lpszMenuName,   NULL
    27.     mov wc.lpszClassName,  offset Bmp_But_Class
    28.     mov wc.hIcon,          NULL
    29.     invoke LoadCursor,NULL,IDC_ARROW
    30.     mov wc.hCursor,        eax
    31.     mov wc.hIconSm,        NULL
    32. invoke RegisterClassEx, ADDR wc
    33. invoke CreateWindowEx,
    34. 0,                  
    35. ADDR Bmp_But_Class,
    36. NULL,
    37. WS_CHILD,
    38. topX,topY,wid,hgt,hParent,ID,
    39. hModule,NULL
    40. mov hButn, eax 
    41. invoke SetWindowPos,hButn,HWND_TOP,0,0,wid,hgt,SWP_NOMOVE
    42. invoke ShowWindow,hButn,SW_SHOW
    43. mov eax, hButn
    44.    ret
    45. BmpBut endp
    46. BmpButProc proc hWn :DWORD,uMsg :DWORD,wParam :DWORD,lParam :DWORD
    47.     LOCAL hParent:DWORD
    48.     LOCAL ID     :DWORD        
    49.                           .if uMsg==WM_ERASEBKGND                                                                
    50. invoke SelectObject,wParam,hBrush1 
    51. invoke PatBlt, wParam,0,0,W,H,PATCOPY                        
    52.  return TRUE       
    53.                          .elseif uMsg == WM_LBUTTONDOWN
    54. invoke SetCapture,hWn
    55. mov cFlag, 1   
    56.                          .elseif uMsg == WM_LBUTTONUP
    57.                          .if cFlag == 0
    58.   ret
    59.         .else
    60. mov cFlag, 0
    61.         .endif  
    62. invoke GetParent,hWn
    63. mov hParent, eax
    64. invoke GetDlgCtrlID,hWn
    65. mov ID, eax
    66. invoke SendMessage,hParent,WM_COMMAND,ID,hWn
    67. invoke ReleaseCapture
    68.        .endif
    69. invoke DefWindowProc,hWn,uMsg,wParam,lParam
    70.     ret
    71. BmpButProc endp
    72.  
    73. end start
    Исходная функция BmpButton не совсем устраивает - там создаётся окошко 100х100. Появляются глюки, если кнопку нужно сделать в процессе выполнения программы....
    Модифицировать можно под свои нужды...Например приведённая ф. - раскрашивает кнопку кистью сделанной из маленькой картинки и не нужно теперь загружать большую по размерам кнопки...
    Так же можно ( или нужно, иногда) издеваться и над функциями из системных библиотек, особенно когда есть подозрение, что они не одинаково работают в разных версиях форточек (а такое подозрение лично у меня есть) - и когда ты сможешь их выковырить и разобраться с ними.
     
  12. Shoorup

    Shoorup Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    109
    Очень все понятно, особенно новичку;) А что за переходники?
    Честно говоря хотелось просто ухнать можно ли обратиться к API функциям не подключая чеголибо вообще и хотелось бы увидеть пример простой как. Например я понял, что можно обойтись без подключение .inc. Для этого смотрим в тот самый .inc и находим ему эквивалент и пишем например так:
    Код (Text):
    1. .386
    2. .model flat,stdcall
    3. option casemap:none
    4. MessageBox equ <MessageBoxA>
    5. MessageBoxA PROTO :DWORD,:DWORD,:DWORD,:DWORD
    6. ExitProcess PROTO :DWORD
    7. includelib \masm32\lib\kernel32.lib
    8. includelib \masm32\lib\user32.lib
    9. .data
    10. MsgBoxCaption  db "Iczelion Tutorial No.2",0
    11. MsgBoxText     db "Win32 Assembly is Great!",0
    12. .code
    13. start:
    14. invoke MessageBox, 0, addr MsgBoxText, addr MsgBoxCaption, 0
    15. invoke ExitProcess, 0
    16. end start
    Можно ли в этом коде не подключать
    Код (Text):
    1. includelib \masm32\lib\kernel32.lib
    2. includelib \masm32\lib\user32.lib
    и вообще ничего не подключать? А именно заменить библиотеки кодом каким-либо.
     
  13. Shoorup

    Shoorup Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    109
    Спасибоmasm32, ответил пока я писал вопрос:) а к моему коду как заменить библиотеки?
    И подскажите как я могу в будущем заменять библиотеку функцией, как посмотреть содержимое библиотеки?
     
  14. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    valterg
    У чела затруднения с .lib-ами, те статическая.
    И с задллеными ф-ями без .lib-ов, те динамическая.
    И с полным неиспользованием никаких .lib-ов, те через экспорт кернела как минимум.
    И с описаниями в .inc-ах.

    И вообще новичку желательно сходить в ветку 'BOOKS' ('КНИГИ') и посмотреть, что там рекомендуют новичкам. Почитать. Многое станет значительно понятнее.
     
  15. Shoorup

    Shoorup Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    109
    _basmp_ , никто и не спорит что читать книги полезно! Книг много, а ответ найти иногда очень сложно на поставленную задачу. Именно поэтому и задал вопрос на форуме и попросил если не ответить, то подсказать где читать.
     
  16. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Shoorup
    кернел вам подключать прийдется. Иначе жизнь ваша поначалу будет очень сложной.
    Все остальные длл-и и их ф-ции добываются через ф-ции kernel32.dll:
    HMODULE LoadLibrary(char* dll_path_name);
    FARPROC GetProcAddress(
    HMODULE hModule, // handle to DLL module
    char* proc_name // name of function
    );

    Есть и другие методы, но простыми для новичка их не назовёшь.
     
  17. masm32

    masm32 New Member

    Публикаций:
    0
    Регистрация:
    26 фев 2008
    Сообщения:
    147
    Попрограмируй - и постепенно станет понятно всё.
     
  18. _basmp_

    _basmp_ New Member

    Публикаций:
    0
    Регистрация:
    10 июл 2005
    Сообщения:
    2.939
    Вы сильно сложную задачу ставите - обойти стандартные механизмы, причем просто и доступно для новичка.
    В ветке 'BOOKS' уже не раз обсуждалось, что и в какой последовательности читать новичкам по асму и инструментам. Лично я высказывался за зубкова, но люди говорили, что есть и лучше. Кроме того неизвестно насколько вы новичок. И еще, имхо если вы действительно новичок и хотите разобраться как-что работает, вам лучше поменьше пользоваться макросами. Они много чего скрывают.
     
  19. Shoorup

    Shoorup Member

    Публикаций:
    0
    Регистрация:
    20 сен 2007
    Сообщения:
    109
    Всем большое спасибо! Все вышесказанное усёк:)