[solved] Кто рюхает managed+unmanaged C++

Serpent555

Да не затруднит вас обратить внимание на сей вопрос.

Serab

я, кстати, не шарю, просто была как-то проблема с самоотладкой проги (она что-то делала с буфером обмена, так вот если он был связан со студией, которая отлаживала эту прогу, то там тоже какая-то жесть начиналась подумал, может у тебя тот же случай :)

Serpent555

я, кстати, не шарю, просто была как-то проблема с самоотладкой проги (она что-то делала с буфером обмена, так вот если он был связан со студией, которая отлаживала эту прогу, то там тоже какая-то жесть начиналась подумал, может у тебя тот же случай
Спасибо.

rosali

Я может глупость скажу, но ты не должен там WINAPI написать разве?

Serab

во, как раз написал этот ответ :)

Serab

просто вот меня глючило: почему unmanaged работает-то? может там в настройках проекта что странное и по умолчанию там stdcall поставился как-то?

Serpent555

Я написал ответ в треде. Если поставить __stdcall (или WINAPI то тогда в эту функцию вообще не передаётся управление и код не вызывается из VS, в которой я отлаживаю приложение. Что интересно, в unmanaged-варианте я ставил WINAPI и он соответствовал __cdecl, а здесь - __stdcall. Так что там явно должен быть __cdecl (по умолчанию).
Ещё момент: после выполнения return можно походить по ассемблерному коду и AV вываливается довольно скоро (где-то через 10 инструкции и 3 jmp но вот понять в нём я ничего не смог...
И на данный момент я не понимаю, чем отличается экспортированная из managed-dll функция с #pragma unmanaged от обычной экспортируемой функции из unmanaged-dll.

Serpent555

Так что там явно должен быть __cdecl (по умолчанию).

@Mikhail, the parameters will be passed correctly no matter what convention is used, these two differ only in who cleans up the stack.

Чёрт, теперь я уже не уверен. Но почему же тогда при выставлении __stdcall функция вообще перестаёт вызываться?

Serab

читай комменты :)

rosali

> since all the parameters seemed to look right with default __cdecl convention ... I don't think calling convention is an issue.
Ненене, ты не спеши :) В cdecl и stdcall порядок параметров не различается, там только разница кто стек чистит, caller или callee. То есть именно на return-е эта разница и проявляется. Так что ты лучше разберись, почему она у тебя не вызывается через stdcall... Там же при декларировании stdcall случается какой-то mangling и его надо повторить там где ты декларируешь, какую функцию вызывать (autoexp.dat?)
PS. вы уж простите что я сюда, лень на stackoverflow акк заводить :)

Serab

PS. вы уж простите что я сюда, лень на stackoverflow акк заводить
ок, я там так же ответил :) я тебя там дублирую считай :)

Serpent555

В cdecl и stdcall порядок параметров не различается
В этом меня уже просвятил, точно, я знал :smirk:
читай комменты
Работаю над этим :)

Serab

где-то через 10 инструкции и 3 jmp
ну посмотри, есть ли среди них что-то похожее на add ESP, smth

Serpent555

Друзья! Я знал, что доброфорум мне поможет! Теперь я знаю, чем отличаются __stdcall и __cdecl, и что есть разница между __declspec(dllexport) и module definition file (хотя я так до конца и не понял, почему последний выключает name mangling). В любом случае, проблема решена!
Оба автора безошибочно определили причину проблемы - неправильный calling convention (порядок вызова?) функции, за что получают по плюсику. Отдельный бонус для в виде принятого ответа на stackoverflov (в результате чего его репутация преодолевает символическую планку в 3333) за объяснение того, как вырубить name mangling.

Serab

:)
а ты понял, почему unmanaged работает? Моя телепатия: ты скачал из сэмплов проект целиком, а не только исходник и там в проекте проставлен stdcall. Или что-то другое? Просто этот факт реально затуманивал проблему :)

Serpent555

Как раз потому, что там оставался от сэмплов WINAPI, но в нём я делал экспоерт функции через .def-файл, на что даже не обратил внимания. Я только видел, что depends.exe показывает функцию без name mangling, как и при __cdecl, из чего я сделал вывод, что в unmanaged WINAPI значил __cdecl. И был не прав :)
В managed dll я модифицировал скопированную функцию какого-то примера exporting unmanaged function from managed dll, где не стояло WINAPI, но был __declspec(dllexport)! Вот так я сам себя запутал.
Короче, единственное, что мне пока не совсем понятно, почему экспорт через .def-файл отрубает name mangling.

Serab

Как раз потому, что там оставался от сэмплов WINAPI, но в нём я делал экспоерт функции через .def-файл, на что даже не обратил внимания. Я только видел, что depends.exe показывает функцию без name mangling, как и при __cdecl, из чего я сделал вывод, что в unmanaged WINAPI значил __cdecl. И был не прав :)
о, это важно для меня, потому что я уж испугался, что WINAPI может значить __cdecl. Тогда ок :)
Короче, единственное, что мне пока не совсем понятно, почему экспорт через .def-файл отрубает name mangling.
да, это я тоже целиком не понимаю. Т.е. вот вроде бы принято экспортировать из независимых от языка (программирования) dll-к нормальные имена функций, но почему это работает именно так — хз, должно быть hysterical raisins (c)

rosali

> Короче, единственное, что мне пока не совсем понятно, почему экспорт через .def-файл отрубает name mangling.
Это потому, что по формату .def файла ты не можешь проэкспортировать две функции с одинаковым именем и разными calling convensions, а через dllexport можешь. Вот и получается что в одном случае манглинг и не нужен, путаницы не может возникнуть, а в другом нужен.
Собственно в .def файле ты можешь вообще функцию проэкспортировать под другим именем. Вот и считай что ты там задекларировал замангленное имя проэскпортировать под незамангленным.

Serab

не, реально, смешно же, пойти на stackoverflow, расписать проблему, потом найти решение на старом доброфоруме :grin: причем считай не одно, а два одинаковых одновременно :grin: еще на доп. вопрос ответил.

Serpent555

Ну stackoverflow крутая тема, там рано или поздно что-нибудь дельное посоветуют, аудитория там очень широкая. А с доброфорумом - как повезёт. Есть шанс, что ответят быстро и дельно, а может и вообще никто не заметит. И, опять же, публика привередливая: может заминусовать с тем, что вопрос не достоин её внимания :)

Serab

там тоже может заминусовать :)
особенно меня радует, как там реально буквально за 40 секунд закрывают трололо-вопросы типа кто быстрее перл или питон :)
А про рано или поздно — это как раз не факт там, вопросы быстро тонут, иногда надо баунти ставить, тогда, в принципе, шансы повышаются. А так-то да, надо еще пиарить вопрос среди друзей, в соц-сетях там и др.

Serpent555

вопросы быстро тонут
С одной стороны да, но с другой у меня не раз бывали вопросы, на которые дельные советы давали через несколько дней. Причём сначала, похоже, спрашивают всякие более-менее очевидные вещи, и если это не помогает (как это обычно и бывает потом откуда-то приходят матёрые батьки и начинают уже что-то мудрить :) Мне интересно, это у кого-то хобби такое, или есть саппорты, которым платят, чтобы они отвечали на профильных форумах на вопросы по их тематике? Где-то читал, что репа на stackoverflow способна хорошо украсить резюме.
Оставить комментарий
Имя или ник:
Комментарий: