Re: импорт из dll в VC6

From
Andrey Voitenkov ()
To
Boris Rudakov ()
Date
2003-10-21T16:56:42Z
Area
CARBON.COPY
 * Forwarded from area 'SU.WINDOWS.PROG'
From: Andrey Voitenkov <mccloud@vimas.com>

Boris Rudakov wrote:

[...]

>  AV> Нет, я про Powersoft Watcom 11.0B. Вышел он где-то в 98-99 годах, если
>  AV> мне память не изменяет.
> 
> Ааааа, тооот...
> Не, тот мне как-то не особо понравился. Чувствовалось что пакет подыхает, все
> какое-то неопрятное, странное, устаревшее...

Ага, похоже было, что они из последних сил склепали оболочку для Win32,
сами компиляторы там очень даже ничего, хотя тоже были глюки, даже
скорее недоделки, нежели глюки.
Но в сочетании с MultiEdit 8 получалась вполне комфортная среда
разработки (IMO) :)

> 
> А вот на OpenWatcom я хочу посмотреть сильно.

Поставил качаться, через пару дней сольется, гляну что оно такое.

[...]

>  AV> У них(ватком), в их конвенции register использовалось больше
>  AV> регистров, чем у микрософта и использовались они не совсем совместимо
>  AV> в __fastall.
> 
> Давай не будем забывать что порядок использования регистров у компайлеров
> разный ? У Борланда с мелкософтом они тоже отличаются, хотя декларация одна -
> __stdcall. Я же не зря упомянул что Борланд ввел еще одну модель - __msfastcall
> которая полностью эквивалентна мелкософтовскому __fastcall. Так что не надо
> удивляться что у Ваткома их __fastcall с Мелкософтом тоже несовместим.
> 
> Кстати, нисколько не удивлюсь если узнаю что борландовский и ваткомовский
> __fastcall между собой совместимы.
> 

Вот этого не знаю, врать не буду.
Я весьма слабо знаком с Борландом, работал только в 3.1 для ДОСа.
Когда вышел 5.0, я был в ужасе и перелез на Ватком :)

[...]

>  AV> Там можно было извратиться сделать такой трюк: указать конвенцию
>  AV> register для проекта и проэкспортировать функцию без указания
>  AV> конвенции в декларации.
> Это грубая ошибка - не указывать модель вызова.
> 

К сожалению, не только грубая, но и очень распространенная :/
Потому я и проверяю вызовы функций библиотек сторонних производителей,
которых я не знаю.

[...]

> 
> Угу. Достаточно грубая и распространенная ошибка - не указывать модель вызова.
> Точно такая же ошибка - забывать про pragma pack. Этим грешит огорчительно
> много разработчиков и именно по вниманию к этим деталям оформления можно
> отличить опытного профессионала от среднего программера.
> 

Ага, я как раз о том же :)

>  AV> Ну так в том и дело, что я не считаю наличие .h полным описанием
>  AV> интерфейса.
> 
> И делаешь ошибку :)
> 
> Инклуд содержит ПОЛНОЕ и ИСЧЕРПЫВАЮЩЕЕ описание интерфейса функций. Если этого
> описания достаточно компайлеру чтобы создать их, то о чем вообще можно говорить
> ?! :):):)
> 
> Даже если в связи с неопрятностью программера забыты модели вызова и
> определение выравнивания - есть дефолты.
> 
> .h - совершенно исчерпывающее определение.
> 

Так должно быть, не спорю, но вот на практике приходится иметь дело с
людьми, и пресловутым человеческим фактором.
И даже не с "забыл", а с "не знал"; вот это и есть основания для моей
паранойи, о которой я и говорил тут:

>  AV> В большинстве случаев хедера достаточно, но у меня уже есть паранойя,
>  AV> потому и проверяю, если речь идет не об академических экспериментах.
> 
> Это именно паранойя, причем - не имеющая под собой никаких оснований :)
> 

Основания чуть выше описаны. Я с надеждой смотрю на C#, там микрософт
очень жестко рамки расставил, компилятор не позволит экспортировать
что либо, если это что-либо не соответствует стандарту платформы CLR.

[...]
>  AV> Инициатору треда можно предложить создать в VC пустую dll с тем же
>  AV> именем, и с теми же экспортами, что описаны в имеющемся хедере и
>  AV> получить библиотеку импорта непосредственно от линкера.
> 
> Совершенно нормальный вариант :)
> 
> Я так поступаю иногда, когда лом с impdef/lib возиться :)
> Это бывает когда либа большая и вусмерть лениво править def под сраный
> мелкософтовский мэнглинг. Тогда и вправду быстрее сделать .c, определить в нем
> болванки функций и компилльнуть с целью получить .lib :)
> 

Я извращался в Perl'ом в таких ситуациях... и похоже, что таки быстрее
действительно написать .c

> Что, кстати, еще раз демонстрирует что мелкософт - сволочи и уроды: вынуждать
> устраивать на ровном месте из-за совершенно несущественной мелкой задачки такой
> геморрой !
> 
Ну с этим я никогда не спорил :)))

>  AV> По моему это самый удачный вариант будет.
> 
> Увы, этот вариант - ровно настолько же неудачный и кривой как и все остальные
> :( И ровно настолько же "надежный", в плане твоей необоснованной паранои. Чтобы
> сбацать dummy-dll (с целью получить лишь ее .lib) тебе все-равно нужен .h
> который у тебя или есть, или все о чем мы говорим - отменяется даже не
> начинаясь :) Этот .h либо правильный, либо опять все отменяется. А в таком
> разе, глубоко пофигу будешь ли ты создавать .lib с помощью левой .dll или же
> через .def
> 

Ну это по крайней мере генерация .lib штатными средствами, хоть и через
задницу. В остальном же - да, те же яйца, только в профиль.

> Все эти варианты одинаково кривы и геморройны. За всех за них - огромное
> "спасибо" драному мелкософту.
> 
> Идинственно-прямой вариант - утилита implib:
> 
> implib libname.lib libname.dll
> 
> Бо нехер устраивать гемор там, где его быть не должно.
> 
Зато они теперь громогласно заявляют, что решили эту проблему .NET,
правда скромно молчат о том, кто ее создал.

-- 
mccloud@

--- ifmail v.2.15dev5
 * Origin: Datacom (2:5020/400)