Cозданиe DLL для Windows с помощью MinGW

Пытаюсь создать простенькое приложение на COM, всё сделал по учебнику.
Программирую в Netbeans с помощью MinGW. И клиент, и собственно сервер(dll) отлично компилятся. После неких мук с __stdcall, __cdecl и .def файлами удалось даже зарегестрировать dll в реестре. Собирал тот же код в VS2008, всё тоже компилится, регестрируется и даже корректно работает.
Сначала проверил дамп экспортируемых функций с помощью objdump — всё ок. Потом с помощью инструмента gendef автоматически генерировал .def файл для созданной dll. Вышло вот такое:
LIBRARY "libCOMdll2.dll"
EXPORTS
CLSID_Component2 DATA
DllCanUnloadNow
DllGetClassObject@8
DllMain@12
DllRegisterServer
DllUnregisterServer

Сначала думал что проблема в постфиксах,
"@"
причём один из них стоит после имени DllMain, откуда dll начинает свою работу. После генерации .def файла с другой dll, сделанной в VS, получил точно такой же результат — но ведь всё работает!
В VS в настройках проэкта увидел что в настройках calling convention стоит __cdecl, но всё равно функции используют свои вызовы.
Подскажите, пожалуйста, как корректно скомпилировать dll в MinGW. Буду рад помощи.
  • Вопрос задан
  • 7043 просмотра
Пригласить эксперта
Ответы на вопрос 5
zeksa
@zeksa Автор вопроса
Созданный на MinGW клиент не может подсоединиться к dll.
Причём коннектится к дллке, созданной на VisualStudio. Тобишь клиент работает корректно.
Просто сильно хочется разобраться, в чём «собака зарыта».
Ответ написан
@Veliant
GNU ld has many options regarding DLLs, but we shall only focus on four (help information follows):
--add-stdcall-alias Export symbols with and without @nn
--kill-at Remove @nn from exported symbols
--out-implib Generate import library
--output-def Generate a .DEF file for the built DLL
Ответ написан
OCTAGRAM
@OCTAGRAM
Кроме __cdecl, возможно, надо оборачивать прототипы в extern «C» { }
Ответ написан
@MikhailEdoshin
Насколько я понимаю, суффиксы @8 и т. п. добавляются к функциям, для которых указан формат вызовов stdcall и означают размер стека. Это зависит от компилятора вообще-то, но и MSVC, и mingw тут совпадают. Если такую функцию предполагается экспортировать из получившейся DLL, дополнительно создается алиас без суффикса, что мы, собственно, тут и видим:

DllCanUnloadNow = @ILT+450(_DllCanUnloadNow@0)

Мне не нравится различие в DllMain@8 и @12, правильное, судя по спецификации, @12 — передаются три указателя, но тут один куда-то девается. У вас DllMain точно три параметра принимает?
Ответ написан
zeksa
@zeksa Автор вопроса
нет, показывает @12 после DllMain и @12 после DllGetClassObject
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы