|
|
| Посл.отвђт | Сообщенiе |
|
|
Дата: Янв 11, 2004 17:09:31 · Поправил: IceStudent Правка Вот проблема: имеется библиотека и к ней заголовочный файл (.h) + def-файл такого содержания: IMPORTS xxxLib.xxxFunc1 xxxLib.xxxFunc2 Как получить файл .lib для использования и в MASM, и в VC++? Я попробовал просто: lib.exe /DEF:xxx.def Получился файл, 22Кб, но он не подходит ни MASM'y, ни VC. Попробовал по статье с этого сайта, создать фэйковую (что бы это означало?) DLL и использовать её .lib-файл. Этот способ подходит только для MASM: внутри её функции объявлены как __imp__xxxFunc@4(1) и т.д. (8Кб), а VC++ требует __imp__xxxFunc@куча_разных_букв_и_цифр(2). И наоборот, при создании фэйковой DLL под VC++ я получаю lib (9,5Кб), не совместимую с MASM. Вопрос: 1)Как сделать стандартную lib, совместимую и с тем, и с другим компилятором? 2)Почему генерируются разные lib, ведь компоновщик-то (LINK.exe) один: и для МАSМ'a, и для VC? 3)Как скормить компилятору VC++ lib-файл с функциями вида (1)? Я не знаю формат файлов .lib, но где-то описывался формат функций (2). У Рихтера? 4)Где можно узнать подробную информацию касательно lib-файлов, чтобы разобраться с этим раз и навсегда? Заранее благодарен. P.S. IMPORTS уже не поддерживается, как сообщил мне компоновщик из VS 7.0. |
|
|
Дата: Янв 11, 2004 17:25:47 IceStudent Поиск по форуму касательно первого пункта. ЗЫ: Может EXPORTS, вместо IMPORTS? |
|
|
Дата: Янв 11, 2004 17:51:19 · Поправил: Grenader Я попробовал просто: lib.exe /DEF:xxx.def Получился файл, 22Кб, но он не подходит ни MASM'y, ни VC что значит "не подходит" ? у тебя на выходе должен получиться нормальный LIB мелкософтского формата. В DEF действительно нужно использовать EXPORTS. Я сам так делал, когда нужно было. Все работает. Другое дело, что с декорированием имен будут проблемы (вместо __imp_xxx и прочего барахла - нормальные имена) Выход - при описании функций в проге указывать язык "C". пример для MASM: ExitProcess proto C :dword |
|
|
Дата: Янв 11, 2004 21:16:22 Попробовал по статье с этого сайта, создать фэйковую (что бы это означало?) DLL и использовать её .lib-файл. Фэйковая - от слова fake подложный, подделка, подделывать. |
|
|
Дата: Янв 12, 2004 16:29:45 IceStudent Как получить файл .lib для использования и в MASM, и в VC++? Оформляй все функции по STDCALL Чтобы вызвать STDCALL в MASM нужно EXTERNDEF __imp__ИмяФункции@0:dword Есть и другие методы, смотри как я делал интерфейсы к Win32 WASM.RU/TOOLS/HI-TECH |
|
|
Дата: Янв 18, 2004 19:23:55 Правка Quantum Может EXPORTS, вместо IMPORTS? Если ты о директиве в файле .def, то я правильно написал. В P.S. тоже… Grenader что значит "не подходит" ? Компиляторы (и ml.exe, и cl.exe) сообщают об ошибках. Подробнее пока не могу сообщить… Edmond Оформлять при создании подложной библиотеки? Есть и другие методы А где именно посмотреть Ваши работы? |
|
|
Дата: Янв 18, 2004 22:35:32 IceStudent Если ты о директиве в файле .def, то я правильно написал. Не спорю, но это был намёк ;-) Объясняю более подробно. 1. Модифицируем DEF-файл следующим образом: LIBRARY имя_библиотеки EXPORTS xxxFunc1 xxxFunc2 2. Пишем программу для фэйковой DLL: .386 .model flat, stdcall option casemap :none EXPORT MACRO symbol:REQ _&symbol& PROC SYSCALL _&symbol& ENDP ENDM .code lib PROC p1:DWORD,p2:DWORD,p3:DWORD lib ENDP EXPORT xxxFunc1@X ; X - это кол-во параметров x4 EXPORT xxxFunc2@X ; (почти всегда :-) end lib 3. Компилим всё это вместе с DEF-файлом и получаем фэйковую DLL (её можно сразу удалить) и нормальный LIB. 4. Для использования в масме пишем INC по принципу изложенному Edmond'ом. 5. Для использования в VC, немного корректируем .h чтоб после @ линкер не требовал "куча_разных_букв_и_цифр". Для этого есть директива, которая уже приводилась в форуме (об этом пишет Dr. Golova) |
|
|
Дата: Янв 18, 2004 22:48:39 Правка Quantum Угу, я так и сделал. Проблема была в "замангливании" имён by VC++. Спасибо за ссылку, теперь и она решится. |