Доброго времени суток ! у меня пара вопросов: можно ли заглянуть в файлы *.lib, т.е. увидеть их исходники ? при дебаге их функций ассемблер я вижу, а можно увидеть еще и С++ ? и еще: по какому принципу подключаются "плагины"? просто выбираются все длл-ки из заданной директории и вызываются их main-процедуры - или как-то по-другому? ну и еще один глупый вопрос: а чем lib-файлы отличаются от dll-файлов ? спасибо
Доброе время суток, vova! Вообще, в понимании компиляторов VC++ и C++ Builder lib-файл попросту содержит заголовки функций а не сам их код. Lib нужен для СТАТИЧЕСКОЙ линковки dll к твоей программе, т.е. если на этапе компиляции достаточно header'ов, то в процессе линковки линкер должен откуда-то брать информацию откуда (по какому адресу) ему вызвывать соотвествующую функцию. В VC++ и в C++ Builder форматы Lib - разые: coff и omf (в Builder't есть утилитка для преобразования - coff2omf)
Ответ отправлен: 19.05.2003, 17:27 Отправитель: Knignick Отвечает Ramzes
Добрый день, vova! Что значит "При дебаге их функций" ? *.lib файл содержит только информацию об экспортируемых функциях. А насчет того, чтобы увидеть код С++ - ты его не увидишь, если у тебя нет исходников. Ну в принципе да, Программа пытается подключить все длл-ки из данной директории, имя которой если не ошибаюсь должно записываться в реестре. Ответ отправлен: 19.05.2003, 12:25 Отправитель: Ramzes Отвечает BOLT
Доброе время суток, vova! 1)lib-файлы нельзя декомпелировать в код C/C++, если там нет отладочной информации(хотя и так вроде бы тоже нельзя), т.к. эти файлы посуте уже набор машинных кодов.А машинные коды, ка ты сам прекрасно знаешь можно только дезассемблировать(в мнемокод ассемблера); 2)Плагины это DLL-файлы, которые используют специальный интерфейс, разработанный программистом той программы, к которой они подсоеденяются;В них нет main-функции, есть только список функций/классов и собственно их реализация, которые использует вызывающий модуль(программа/другая библиотека). 3)DLL - это абривиатура Dinamic Linked Library(переводится: динамически подсоединяемая билиотека);Lib(сокращенно - library)- это статистичечкая библиотека(также к ней идет заголовочный файл - интерфейс) и присоеденяется она с главной программой только при линковке.Надеюсь теперь тебе
все понятно! Счаcтливо!Best compilation&link! Ответ отправлен: 19.05.2003, 13:14 Отправитель: BOLT Отвечает Gibbel
Приветствую Вас, vova! 1. *.lib - это уже откомпилированный файл, и увидеть его исходники невозможно (если, конечно, его не на асме писали ;-). 2. Плагины подключаются так, как хочется автору программы. Можно просто тупо перебирать все файлы соответствующего типа в подкаталоге, а можно где-нить хранить список установленных плагинов с путями к ним. 3. *.lib - это библиотека, которая может содержать откомпилированный код какого-либо отдельного самостоятельного модуля, либо же ссылки на другие модули. В чем-то она похожа на файлы *.obj. *.dll - это уже окончательно откомпилированный готовый модуль. Ответ отправлен: 19.05.2003, 12:20 Отправитель: Gibbel Отвечает vitya
Добрый день, vova! Либ файл (грубо говоря) - это список функций и переменных экспортируемых из библиотеки и их адреса. Исходного кода там нет. Вызываеытся не main функция, а скорее всего несколько функций. 1. LoadPlugin(...); 2. Run(...); 3. Unload(...); первая его инициализирует, вторая запускает с данными параметрами, третья выгружает плагин. Ответ отправлен: 19.05.2003, 13:29 Отправитель: vitya Отвечает Pin
Доброе время суток, vova! Вообщето lib-файлы содеражат описание функций из DLL. Ответ отправлен: 21.05.2003, 00:08 Отправитель: Pin
Вопрос № 784
Здравствуйте ув. эксперты! 1.Возникла проблема с обработкой нажатия клавиш клавиатуры Когда чистая форма без дополнительних элементов OnKeyUp отрабатывает, а когда добавляеш на форму еще один элемент обработка не происходит. В чем проблема?(скорее всего форма теряет фокус ) 2.Как преобразовать код нажатой клавиши в символ?(для алфавитно цифровых клавиш)
Добрый день, m0v8lack! 1)Да ты прав - форма теряет фокус.Как бороться: пишишь: void __fastcall TForm1::FormCreate(TObject *Sender) { KeyPreview = true; } тогда после этого сначала будет обрабатываться нажатие клавиш для формы, а если еще есть обработчики для других компонентов, то даже если фокус на них, то все равно первым делом нажатие клавиши обрабатывается для формы. 2)Легко и просто: void __fastcall TForm1::FormKeyUp(TObject *Sender, WORD &Key, TShiftState Shift) { char KeyString[25]; strcpy(&KeyString[0], "Я нажал "); KeyString[8] = Key; KeyString[11] = ''; Application->MessageBox(KeyString , "Что я нажал?", MB_OK); } Счастливо!Best compilation&link! Ответ отправлен: 19.05.2003, 12:56 Отправитель: BOLT Отвечает Ramzes
Здравствуйте, m0v8lack! 1. Да, скорей всего так оно и есть... Проверь, не стоит ли у тебя на ентом элементе акселератор. 2. Используй функцию int ToAscii( UINT uVirtKey, // virtual-key code UINT uScanCode, // scan code CONST PBYTE lpKeyState, // key-state array LPWORD lpChar, // buffer for translated key UINT uFlags // active-menu option ); Ответ отправлен: 19.05.2003, 12:30 Отправитель: Ramzes Отвечает Avl2k
Приветствую Вас, m0v8lack! 2. Символ нажатой клавиши можно получить, обрабатывая не WM_KEYDOWN/WM_KEYUP, а WM_CHAR, куда символ и приходит параметром. Либо можно использовать функции ToAscii, ToUnicode, MapVirtualKey... Пример: ... // в обработке WM_KEYDOWN, WM_KEYUP UINT vCode = wParam; // виртуальный код клавиши UINT scanCode = (lParam >> 16) & 0xff; // скэн-код BYTE state[256]; GetKeyboardState( state ); WORD rslt; if( ToAscii(vCode, scanCode, state, &rslt, 0) == 1 ) { char ch = (rslt & 0xff); ... } С уважением, Avl2k. Ответ отправлен: 19.05.2003, 11:29 Отправитель: Avl2k
Форма отправки вопроса
Внимание!
Мы рекомендуем открывать рассылку в программе Internet Explorer 5.0+
или отправлять вопросы с сайта по адресу:
http://rusfaq.ru/cgi-bin/Message.cgi.