|
|
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
Ну, собственно, всю проблему в заголовке написал! Есть Борландовая ДЛЛ-ка - надо ее статически прилинковать в проект VC6. Пробовал через билдеровскую impdef сделать DEF, а из него уже мокрософтовской LIB /DEF:filename.def - получить LIB. Все бы хорошо - даже линкуется, а вот в момент вызова функции вываливается. Есть мысль, что из-за различной структуры COFF и OMF библиотек. Исходные данные: DLL (Builder6) + *.h к ней. Задача: использовать эту библиотеку (без перекомпиляции самой dll) в проекте VisualC++ (6), подключая ее статически. Подскажите, плз!, как быть? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2005, 23:06 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
ээээ... во первых, COFF-OMF это различие на уровне объектников и библиотек. Dll собранные из разных библиотек не различаются, вернее не должны различаться :) На практике разница есть потому что разные линкеры работают по разному. Чтобы подключить статически dll надо дать на вход линкеру специальную библиотеку. Которая будет состоять из заглушек для всех импортируемых из dll функций. Такая библиотека делается утилитой implib.exe. А не impdef! :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.09.2005, 23:55 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
implib-овские lib-ы компилятор VisualC++ не ест вообще. Может и есть возможность средствами MS сделать корректный lib из любой библиотеки, но если б я нашел - не спрашивал бы. А вот различия OMF и COFF сводятся к работе с памятью, в связи с чем при динамической линковке - получил конкретный адрес функции и все ОК, а статически - смещения не бьют. А OMF оказывается еще и разные бывают - Intel и Borland. Есть у Borland-а утилита coff2omf.exe - так вот мне бы как раз обратно надо! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2005, 07:22 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
Гмм как и в ветке про DLL в Linux-е что-то не так с формулировками в вопросах ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2005, 08:56 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
MustDieimplib-овские lib-ы компилятор VisualC++ не ест вообще. implib разный бывает. Бывает от Борланда, бывает от Микрософта.... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2005, 17:48 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
MustDie Есть Борландовая ДЛЛ-ка - надо ее статически прилинковать в проект VC6. Пробовал через билдеровскую impdef сделать DEF, а из него уже мокрософтовской LIB /DEF:filename.def - получить LIB. Все бы хорошо - даже линкуется, а вот в момент вызова функции вываливается. Есть мысль, что из-за различной структуры COFF и OMF библиотек. Нет. Библиотеки уже отработали и .dll и .exe уже собраны. Значит не в этом дело. Дело видимо в разных соглашениях о вызовах, используемых в борланде и у MS. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2005, 20:41 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
MasterZivДело видимо в разных соглашениях о вызовах, используемых в борланде и у MS. Разные соглашения о вызовах DLL??? Что ты курил? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 20.09.2005, 21:41 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
White Owl MasterZivДело видимо в разных соглашениях о вызовах, используемых в борланде и у MS. Разные соглашения о вызовах DLL??? Что ты курил? :) он прав , только не DLL а функций ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2005, 08:42 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
JibSkeart White Owl MasterZivДело видимо в разных соглашениях о вызовах, используемых в борланде и у MS. Разные соглашения о вызовах DLL??? Что ты курил? :) он прав , только не DLL а функций ... А что ты курил? Я тоже хочу такую траву :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2005, 19:17 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
Где-то на rsdn.ru это было хорошо описано .... http://www.rsdn.ru/article/devtools/bcbdll.xml вот кажется здесь ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 21.09.2005, 23:41 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
MasterZivГде-то на rsdn.ru это было хорошо описано .... http://www.rsdn.ru/article/devtools/bcbdll.xml вот кажется здесь ... ХА! Так ты не путай директивы компилятору которые управляют naming convention и вызов функций из dll. Разные принципы именования процедур, классов и методов это всегда существовавшее различие между компиляторами. И оно обычно никуда далее объектников и библиотек не идет. А приниципы именования и вызова функций из dll это часть операционной системы. Любой компилятор может следовать этим правилам именования. При помощи разных ключевых слов, хоть часто и похожих - о чем в данной статье и написано. В любом случае, dll подготовленная при помощи одного транслятора, может статически линковаться в программу подготовленную другим транслятором. Иногда прийдется повозится, но можно. Разница будет как раз на уровне директив компилятора и соотвественно библиотек. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2005, 02:09 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
авторХА! Так ты не путай директивы компилятору которые управляют naming convention и вызов функций из dll. Разные принципы именования процедур Дело не столько в принципах наименования функций aka декорировании, сколько в способе размещения параметров в стеке и регистрах, а также в том кто чистит стек вызывающий или вызываемый. Я конечно понимаю, .NET !!! Значит калоши не нужны (с) но стыдно не знать этого. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2005, 08:59 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
Что касается классов, тут все еще печальнее. Попробуйте экспортировать множественно наследованный класс C++ в DLL из Delphi. Вряд-ли у Вас получиться что-нибудь вменяемое :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2005, 09:04 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
White Owl JibSkeart White Owl MasterZivДело видимо в разных соглашениях о вызовах, используемых в борланде и у MS. Разные соглашения о вызовах DLL??? Что ты курил? :) он прав , только не DLL а функций ... А что ты курил? Я тоже хочу такую траву :) ты что у Си и у паскаля разные соглашения о вызовах процедур. а травку пока еще не курил :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2005, 10:02 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
тфу , не паскаль, а у борланцких кампиляторов. ш (';') (V),(V),, Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2005, 10:03 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
Вот кстати одно из тех, за что я не люблю борландов - всегда все по-своему сделают. Это у них уже традиция. Как ширина железнодорожного полотна в России -- зачем - не понятно, но чтобы не как у всех. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2005, 19:09 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
MasterZivВот кстати одно из тех, за что я не люблю борландов - всегда все по-своему сделают. Это у них уже традиция. Как ширина железнодорожного полотна в России -- зачем - не понятно, но чтобы не как у всех. Почему? OMF это ж не Борландовская разработка. А вовсе даже Intel'евская. Причем Микрософт тоже когда-то OMF поддерживали, а потом отказались от нее в пользу COFF. Когда делали Windows NT изобрели новый формат для исполнимых файлов (PE). Основалие его на ДЭКовском COFF, ну и для упрощения линковки сменили формат и для объектников и библиотек в своих компиляторах. Так что в данном случае Борланды как раз не виноваты. Это Микрософты как всегда выпендрились :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 22.09.2005, 19:34 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
Я про СОГЛАШЕНИЯХ НА ВЫЗОВЫ, а не про библиотеки. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2005, 15:20 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
А соглашения на вызовы из dll всегда одинаковы между всеми компиляторами. Потому что dll это сущность операционной системы а не транслятора. Хотя конечно можно сделать такую уникальную dll которая не будет читаться никем кроме автора :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.09.2005, 19:36 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
Почему некоторым людям так нравится выставлять себя на посмешище ? Не знаешь - ПРОВЕРЬ, не можешь проверить не венькай и верь тем кто ЗНАЕТ. Для DLL соглашения о вызовах ИМЕЮТ ЗНАЧЕНИЕ. Разумеется зная интерфейс можно использовать любую DLL, но при этом необходимо знать используемые ей соглашения о вызовах. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2005, 08:49 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
White Owlimplib разный бывает. Бывает от Борланда, бывает от Микрософта.... Первый раз слышу. Есть lib.exe, но как ему впихнуть Борландовскую dll? Вот к чему я пришел. Разница между стандартами библиотек в работе со стеком (где-то вычитал). При динамической компоновке, функция GetProcedureAdress возвращает реальный адрес нужной функции, а при статическом подключении, насколько я понимаю, используется смещение на каждую функцию. Вот тут и загвоздка - COFF по своему заполняет память, а OMF - по-своему. У Борланда есть утилита coff2omf.exe, так вот мне надо как раз наоборот! При этом "implib.exe -a" не прокатывает... Неужели никто не знает как это сделать? У меня в библиотеке более 1200 функций - я свихнусь их динамически подключать! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2005, 13:36 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
заюзай impdef.exe получишь файл с расширением def если в этом файле в разделе EXPORTS _myfuncn@Х = _myfuncn @1 то надо переделать так EXPORTS myfuncn = _myfuncn@Х вот так а дальше тузлой implib Mydll.lib mydll.def насколько я помню . ш (';') (V),(V),, Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.09.2005, 22:32 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
Вот это уже больше похоже на дельный совет! Однако, вот что выдает мне impdef: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Если impdef использовать с опцией -а, то получается вот так: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. Отсюда вопрос - что как править и как использовать impdef (c -a или без)? И откуда такая разница в описании функций в def-файле - то с собаками, то без, а то еще и с "баксами" - чтобы все это значило? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2005, 14:06 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
http://www.rxlib.ru/faqs/faqc_en/16809.html А если как тут сказанно . ш (';') (V),(V),, Код: plaintext ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2005, 15:35 |
|
||
|
Сделать lib (COFF) из dll (OMF)
|
|||
|---|---|---|---|
|
#18+
Попробовал. Не катит. Кроме того, все что там описано можно получить просто используя impdef с опцией -а. При этом в Билдере есть еще и утилита для преобразования lib-ов из COFF в OMF. Поэтому проблем-то никаких при использовании MSVC-библиотеки в Builder, надо-то как раз НАОБОРОТ! Если бы все так просто было - там черточку убрал, сюда поставил, то уж написал бы кто-то парсер для DEF-файлов, однако я ничего не нашел в Интернете. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2005, 18:28 |
|
||
|
|

start [/forum/topic.php?fid=57&msg=33282766&tid=2032571]: |
0ms |
get settings: |
8ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
54ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 237ms |
| total: | 386ms |

| 0 / 0 |
