|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Всем доброго времени суток! Есть класс функции которого вызываются. Изменяется порядок передачи параметров в зависимости от способа подключения библиотеки и типе возвращаемых данных. Когда возвращаемое значение простой тип(int, char, указатель) или отсутствует(void) то все ок. 1)Когда возвращаемое значение объект класса то тут начинается неразбериха. Если библиотека линкуется при сборке исполняемого модуля, то возвращаемый объект передается последним. Код: plaintext 1. 2. 3. 4. 5. 6.
2)Если библиотека загружается по мере надобности и происходит вызов нужных функций, то возвращаемый объект передается первым. Код: plaintext 1. 2. 3. 4. 5. 6.
Кто подскажет, как сделать так что бы параметры во втором случае передавались так же как в первом? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2018, 16:25 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
__cdecl __stdcall etc.... AFAIK ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2018, 16:27 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev, Всё вызывается с __cdecl, но не помогает. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2018, 16:31 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Что такое "библиотека загружается по мере надобности" ? ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2018, 16:36 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduserВсё вызывается с __cdecl Не вижу в приведённом ассемблере cdecl. В стэк ничего не заносится, после возврата стэк не очищается. У тебя, походу, используется fastcall (что характерно для 64 бит). Код объявления pFunction покажешь? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2018, 17:21 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovКод объявления pFunction покажешь? typedef Result (__cdecl *pFunction)(LPVOID); ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2018, 17:29 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blondusertypedef Result (__cdecl *pFunction)(LPVOID); В таком случае твоё "pFunction(Class)" это бред полный и работать не может, ибо ты указатель на объект приводишь к указателю на функцию. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2018, 18:01 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakovblondusertypedef Result (__cdecl *pFunction)(LPVOID); В таком случае твоё "pFunction(Class)" это бред полный и работать не может, ибо ты указатель на объект приводишь к указателю на функцию. Я не привожу указатель на объект к указателю на функцию. В функцию передаю указатель на объект и все прекрасно работает кроме описанного случая. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2018, 18:06 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduserЯ не привожу указатель на объект к указателю на функцию. pFunction это у тебя тип, объявленный с помощью typedef. Конструкция "тип(значение)" это приведение типов, а не вызов функции. Так что где-то что-то ты недоговариваешь. Давай полный код, а то ещё окажется, что у тебя pFunction() до кучи это метод класса, а в этом случае приведённый ассемблер корректен, ибо метод получает this в rcx и первый параметр в rdx. Или ты написал что-то неправильно и оптимизатор у тебя статическую функцию Код: sql 1.
перековал в Код: sql 1.
в целях copy elimination. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2018, 18:13 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovblonduserЯ не привожу указатель на объект к указателю на функцию. pFunction это у тебя тип, объявленный с помощью typedef. Конструкция "тип(значение)" это приведение типов, а не вызов функции. Так что где-то что-то ты недоговариваешь. Давай полный код, а то ещё окажется, что у тебя pFunction() до кучи это метод класса , а в этом случае приведённый ассемблер корректен, ибо метод получает this в rcx и первый параметр в rdx. Да pFunction - это метод класса. Об этом было сказано первой строкой в описание топика. Ну, как то так. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2018, 18:38 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduserДа pFunction - это метод класса. Об этом было сказано первой строкой в описание топика. Э, нет. ParserFile это метод, а pFunction это обычная функция. И не надо их путать. Поставь принудительно -O0 и посмотри результат. Скорее всего будет такой же облом. А всё потому, что не надо возвращать классы по значению из библиотечных функций. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2018, 19:11 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovЭ, нет. ParserFile это метод, а pFunction это обычная функция. И не надо их путать. Поставь принудительно -O0 и посмотри результат. Скорее всего будет такой же облом. А всё потому, что не надо возвращать классы по значению из библиотечных функций. Метод класса это функция, в которую первым параметром передается указатель на объект класса. Остальное все уже описано выше. Вопрос остался открытым. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2018, 19:36 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduserМетод класса это функция, в которую первым параметром передается указатель на объект класса. Да. А простая статическая функция это функция в которую может передаваться то, что хочет компилятор, и так, как хочет компилятор. И в твоём случае компилятору хочется в pFunction передать Result* для исполнения своего долга по copy elision. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2018, 19:48 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, К чему эмоции? Повторю вопрос : Кто подскажет, как сделать так что бы параметры во втором случае передавались так же как в первом? Если без шаманства нельзя, то так и скажите что нельзя. Спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2018, 19:57 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduserКто подскажет, как сделать так что бы параметры во втором случае передавались так же как в первом? Измени прототип функции на Код: sql 1.
Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2018, 19:59 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Так она у меня уже работает. Но хотелось, что бы без шаманства. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2018, 20:02 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
тогда повторю медленно: не надо из библиотечных функций возвращать классы по значению. И по ссылке тоже лучше этого не делать. И вообще лучше DLL не использовать без особой нужды. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2018, 20:05 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakovтогда повторю медленно: не надо из библиотечных функций возвращать классы по значению. И по ссылке тоже лучше этого не делать. И вообще лучше DLL не использовать без особой нужды. Уже сделано и обратно не вернуть. Нужно использовать то что есть. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2018, 20:13 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Leonid Kudryavtsev__cdecl __stdcall в x64 этого нет ... |
|||
:
Нравится:
Не нравится:
|
|||
28.11.2018, 23:57 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduserDimitry SibiryakovЭ, нет. ParserFile это метод, а pFunction это обычная функция. И не надо их путать. Поставь принудительно -O0 и посмотри результат. Скорее всего будет такой же облом. А всё потому, что не надо возвращать классы по значению из библиотечных функций. Метод класса это функция, в которую первым параметром передается указатель на объект класса. Остальное все уже описано выше. Вопрос остался открытым. не совсем так просто =) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 00:56 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
судя по коду, [очередной] пользователь дибильдера ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 00:57 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduser, blonduserЕсли библиотека линкуется при сборке исполняемого модуля, то возвращаемый объект передается последним. blonduserЕсли библиотека загружается по мере надобности и происходит вызов нужных функций, то возвращаемый объект передается первым. Способ линковки вообще не причем. У вас разные вызовы синтаксически. В одном случае вы вызываете метод, в другом - свободную функцию. Чтобы во втором случае тоже вызывалось как метод, вам нужно объявить указатель на метод, а не на функцию (при условии что в вашей DLL это действительно метод). Ну и __cdecl убрать. Не надо указывать компилятору то в чем он лучше шарит )) Код: plaintext 1. 2. 3. 4.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 01:37 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduserМетод класса это функция, в которую первым параметром передается указатель на объект класса. Остальное все уже описано выше. Вот совсем не обязательно, это одна из возможных реализаций. Компилятор может например указатель на объект передавать в метод через специальный регистр, который никогда для передачи обычных параметров не используется (и какая-то версия msvc именно так и делала). ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 14:44 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Anatoly Moskovsky Код: plaintext 1. 2. 3. 4.
Не, так нельзя, указатель на метод - это не указатель на функцию, они не совместимы. У указателя на метод даже размер может отличаться от обычного указателя. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 14:47 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Barlone, Если функция невиртуальная, то указатель на нее тот же что и для свободных функций. Виртуальные же вообще не надо импортировать из DLL напрямую . Они импортируются неявно через vtbl ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 14:54 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
В любом случае если DLL линкуется статически (как было указано вначале), значит все методы из нее экспортированы так чтобы их адрес можно было получить функцией GetProcAddress. Потому что загрузчик именно этой функцией загружает статические импорты. Виртуальные методы я думаю тоже могли бы экспортироваться через переходники. ЗЫ. Правильный синтаксис вызова по указателю на метод такой: Код: plaintext 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 15:05 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Да, забыл указать, что все что я написал - это теория. Возможно Barlone прав и на практике все это не работает из-за идиотизма создателей компилятора )) ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 15:25 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyВ любом случае если DLL линкуется статически (как было указано вначале), значит все методы из нее экспортированы так чтобы их адрес можно было получить функцией GetProcAddress. Потому что загрузчик именно этой функцией загружает статические импорты. Виртуальные методы я думаю тоже могли бы экспортироваться через переходники. ЗЫ. Правильный синтаксис вызова по указателю на метод такой: Код: plaintext 1.
Когда DLL линкуется статически, то все работает без шаманства. А вот когда DLL подгружается динамически, то тут то и возникают проблемы с передачей параметров. Код: plaintext 1.
Такой синтаксис даже не линкуется. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 15:44 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduserТакой синтаксис даже не линкуется. Синтаксис и не должен линковаться, он компилируется Приведите код и сообщение об ошибке, из него обычно видно что надо исправить. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 15:48 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduserКогда DLL линкуется статически, то все работает без шаманства. "Не верю!" (с) Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 15:48 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyСинтаксис и не должен линковаться, он компилируется Приведите код и сообщение об ошибке, из него обычно видно что надо исправить. Error 6 error C2297: '->*' : illegal, right operand has type 'pFunctionCall' ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 15:54 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduser, Кода нет - не о чем говорить. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 16:24 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Anatoly Moskovskyblonduser, Кода нет - не о чем говорить. Так изначально у меня нет описания класса. Напомню суть: Есть какая-то выделенная область памяти про которую я знаю, что это объект класса и в какой DLL-ке реализован этот класс. Из этой DLL-ки я загружаю функции для работы с этим классом и вызываю их. Но если ф-ия возвращает какой-то объект, то возникает коллизия с передачей параметров. Приведу схематический пример... Возвращаемый тип простой(int, char и т.д): int Class::Function1(Param1, Param2) - они передаются в ф-ию: Class&,Param1,Param2 - значение возвращается через регистр. вызываю загруженную ф-ию так int result = Function1_Load(Class&,Param1,Param2) - Все ОК. Возвращаемый тип класс - для примера CResult; CResult Class::Function2(Param1, Param2) - они передаются в ф-ию: Class&,CResult&,Param1,Param2 вызываю загруженную ф-ию так CResult = Function2_Load(Class&,Param1,Param2), а передаются они CResult&,Class&,Param1,Param2 - косяк. Вариант Код: plaintext 1.
Не подходит течет память. Обсуждения про возвращаемые объекты, зачем так и т.д уже были и мне не интересны. Если кто то знает способ правильно передать параметры в загруженную мембер функцию класса или какой то более интересный способ вызвать мембер функцию, то буду рад воспользоваться вашими знаниями. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 17:02 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduserТак изначально у меня нет описания класса. Т.е. кода не будет. ОК, дальше сами. У меня нет времени гадать как исправить код которого вы не показываете. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 17:15 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyblonduserТак изначально у меня нет описания класса. Т.е. кода не будет. ОК, дальше сами. У меня нет времени гадать как исправить код которого вы не показываете. Мне не надо исправлять код. Тем более что все уже показал. Мне нужно передать в функцию параметры в правильной последовательности. Будет даже очень интересна дока, где описано когда и как передаются параметры на уровне ассемблера. Может быть это можно сделать по тем данным которые предоставляет таблица экспорта. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 17:31 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Что бы передать в МЕТОД объекта параметры в правильной последовательности, нужно знать как этот класс описан Описание Вы не знаете. Можно гадать дальше на кофейной гуще до бесконечности. IMHO & AFAIK Может быть это можно сделать по тем данным которые предоставляет таблица экспорта. У нормальных людей, к таблице экспорта как минимум прилагается .H файл с описанием ф-ций или классов У совсем нормальных людей, таблица экспорта экспортирует функции, а не методы объекта ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 17:48 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Leonid KudryavtsevУ нормальных людей, к таблице экспорта как минимум прилагается .H файл с описанием ф-ций или классов У совсем нормальных людей, таблица экспорта экспортирует функции, а не методы объекта Если вы не сильны в программировании, то свои знания по психологии применяйте на другом форуме. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 17:53 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduserБудет даже очень интересна дока, где описано когда и как передаются параметры на уровне ассемблера. А ничего, что она гуглится за пару минут?.. https://docs.microsoft.com/ru-ru/cpp/build/overview-of-x64-calling-conventions?view=vs-2017 Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 18:02 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovА ничего, что она гуглится за пару минут?.. https://docs.microsoft.com/ru-ru/cpp/build/overview-of-x64-calling-conventions?view=vs-2017 И я её гуглил, но там не сказано про возвращаемое значение и как передаются параметры для мембер функции(указатель на объект класса). вот тут сказано что возвращаемое значение передается через RAX, а это не так... см. пример ассемблерного кода в начале топика. ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 18:24 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduserвот тут сказано что возвращаемое значение передается через RAX, а это не так... Это так. Читай внимательно про ограничения на типы данных, передаваемых через регистры. Твой Result это совсем не целое до восьми байт. И даже не указатель. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 18:38 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovЧитай внимательно..... Мне кажется, лучше еще раз перечитать 21748699 и не заниматься фигней свои знания по психологии применяйте на другом форуме. К сожалению кол-во форумов где я зарегестрирован, очень мало. Даже в ВК мне не пойти - нету меня там ))) Т.ч. я пока тут останусь ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 18:41 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakovblonduserвот тут сказано что возвращаемое значение передается через RAX, а это не так... Это так. Читай внимательно про ограничения на типы данных, передаваемых через регистры. Твой Result это совсем не целое до восьми байт. И даже не указатель. тсс, за возвращение класса из ДЛЛ положен отдельный эцих с граблями. не мешайся ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 23:39 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
дай человеку поеграться тем более, про ВМТ от еще не доехал, про которую ему АМ мягко намекнул ... |
|||
:
Нравится:
Не нравится:
|
|||
29.11.2018, 23:43 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Siemarglпро ВМТ от еще не доехал Да ладно, кто я такой чтобы закрывать от него чудной мир COM... Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 01:19 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduser...Кто подскажет, ... Представляете - Вы ПЕРВЫЙ в МИРЕ кто столкнулся с такими проблемами!!! улыбнуло? значит надо отдохнуть и стэп-бай-стэп раскрутить все узелки у Вас в голове. По ходу обсуждения выясняется, что Вы не владете терминологией. Посему либо начинаете изъясняться на языке программистов, либо (что предпочтительнее) делаете остов Вашей проблемы (рыбу) и постите на форуме. Поверьте - это САМЫЕ оптимальные пути получения информации. Народ попытался натолкнуть Вас на путеводители по грабелькам, но Вы упорно стараетесь наступать туда, куда не следует. Хозяин барин, в конечном итоге оно так крепче запоминается. :) Закончу по существу, так сказать с базиса... 1) Есть статические либы, есть динамические. Статические - это сборная солянка неких компильнутых бинарных модулей сваленых в один файлик. Файлик имеет расширение 'lib'. Его отлично знает любой линковщик. Бинарные модули собираются в библиотеку после компиляции. Эти модули(объектники) могут быть написаны на любом языке поддерживающих стандарт линковки-объектников. Объектные модули, после компиляции, как правило имеют расширение 'obj'. Динамическая библиотека (DLL в мире форточек) - это загружаемая в процессе работы процессора, исполняемые части кода. Связывание dll с кодом происходит на этапе загрузки (загрузчик прописывает вентили вызовов на каждую функцию и ссылочные объекты). 2) Динамические библиотеки могут загружаться явно и не явно. Явно - это когда Вы в коде пишите типа лоад лайбрэри и далее гэт фанкшион адресс. Далее юзаете функцию по полученному адресу. Не явно - это когда проблемы загрузки и получение адресов на функции делает за вас загрузчик либо при старте либо при первом вызове(см. настройки). 3) Динамические библиотеки можно отгружать. Данный функционал в полный рост может юзать COM. 4) Язык си, си плас плас и иже - это ТИПИЗИРОВАННЫЕ языки. Не зная типа связывание не произойдёт. Связывание - это процесс в основном который делает компилятор и(или) линковщик. Исходя из выше сказанного. а) Любая библиотека - есть способ хранения и использования вашего исполняемого кода. Библиотека НЕ вносит никаких (от слова совсем) изменений отличных от описания на данную библиотеку. б) Любую библиотеку можно упразднить (убрать совсем) либо наоборот создать из любого кода библиотеку. Т.е . это не обман или шаманство за спиной у компилятора-линковщика, это удобство использования и только. в) Если Вы не можете создать свой код БЕЗ библиотеки, то библиотека Вам НЕ сможет помочь (написать или придумать за вас типизацию или описание типов), от слова совсем. как то так. (круглый) ЗЫ Рекомендую глянуть книгу Рихтер "WINDOWS для профессионалов" там многое чаво интересного узнаете, в том числе и по библиотекам... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 01:45 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
kolobok0Представляете - Вы ПЕРВЫЙ в МИРЕ кто столкнулся с такими проблемами!!! Если бы я был первый, то не пытался бы выяснить на форуме! Зачем было копи-пастить столько букв, если вы не можете прочитать то, что уже написано?! Поверьте, что уже было много читано перечитано и испробовано, но возникают косяки. Так что теоретики могут расслабится и отдыхать. Хотелось бы послушать практиков, которые столкнулись с такой проблемой и успешно её решили. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 11:09 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduser И я её гуглил, но там не сказано про возвращаемое значение и как передаются параметры для мембер функции(указатель на объект класса). вот тут сказано что возвращаемое значение передается через RAX, а это не так... см. пример ассемблерного кода в начале топика.Ну если возвращаемое значение не лезет в регистр, то первым параметром передается указатель на место в памяти, где будет помещен результат. https://itanium-cxx-abi.github.io/cxx-abi/abi.html#return-value ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 12:47 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
BarloneНу если возвращаемое значение не лезет в регистр, то первым параметром передается указатель на место в памяти, где будет помещен результат. https://itanium-cxx-abi.github.io/cxx-abi/abi.html#return-value Это все понятно. Только если это мембер функция класса, то первым параметром всегда должна передаваться ссылка на объект класса. А когда я обращаюсь к функции после получения её адреса через GetProcAddress, первым параметром лезет именно возвращаемой значение. И происходит падение. Думал сделать это через встроенный ассемблер, но оказалось что Itanium и X64 не поддерживают его. За ссылку спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 13:11 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
может я чего не понял, но если прям так необходимо держать логику классов в DLL, то почему не сделать DLL с экпортируемой С-функцией, которая будет возвращать вам указатель на объект класса, который вам необходим, а дальше делайте с ним все что нужно. То есть эта функция своего рода ворота к фабрике классов внутри DLL. У этого подхода есть множество плюсов, взять хотя бы то, что из библиотеки наружу не торчат конструкторы, деструкторы и операторы классов, а все инкапсулировано внутри, как и требуется согласно ООП. Чтобы не возникало проблем с освобождением памяти, создать еще две экспортируемые функции: allocator и deallocator. Или сделать так как делает это COM через подсчет ссылок и Release на стороне клиента. blonduser Вариант Код: plaintext 1.
Не подходит течет память. и вместо того, чтобы разобраться почему, начали изобретать костыли - а чо? нормальный подход! ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 13:33 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduserоказалось что Itanium и X64 не поддерживают его. Поддерживают. По крайней мере GCC. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 13:33 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduserТолько если это мембер функция класса, то первым параметром всегда должна передаваться ссылка на объект класса. Кстати, чисто из любопытства: как ты умудрился экспортировать отдельный метод класса? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 13:36 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduserBarloneНу если возвращаемое значение не лезет в регистр, то первым параметром передается указатель на место в памяти, где будет помещен результат. https://itanium-cxx-abi.github.io/cxx-abi/abi.html#return-value Это все понятно. Только если это мембер функция класса, то первым параметром всегда должна передаваться ссылка на объект класса. А когда я обращаюсь к функции после получения её адреса через GetProcAddress, первым параметром лезет именно возвращаемой значение. И происходит падение. Думал сделать это через встроенный ассемблер, но оказалось что Itanium и X64 не поддерживают его. За ссылку спасибо.Ну если вы все равно вручную описываете импортированный из dll метод класса как обычную функцию, так опишите ее как принимающую еще один указатель, куда будет сложен результат, и возвращающую void. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 13:53 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Настоящее веселье будет, если класс который в dll, использует множественное наследование... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 13:58 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovblonduserТолько если это мембер функция класса, то первым параметром всегда должна передаваться ссылка на объект класса. Кстати, чисто из любопытства: как ты умудрился экспортировать отдельный метод класса? Приводил кусок года именно для вас 21747788 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 14:13 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
BarloneНу если вы все равно вручную описываете импортированный из dll метод класса как обычную функцию, так опишите ее как принимающую еще один указатель, куда будет сложен результат, и возвращающую void. И это уже было 21748888 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 14:15 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduserПриводил кусок года именно для вас Это не код экспорта . Это код импорта . Совсем разницы не замечаешь?.. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 14:22 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovblonduserПриводил кусок года именно для вас Это не код экспорта . Это код импорта . Совсем разницы не замечаешь?.. Экспортируются они все. Импортируются только те что необходимы. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 14:24 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduserЭкспортируются они все. КАК??? Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 14:44 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduserBarloneНу если вы все равно вручную описываете импортированный из dll метод класса как обычную функцию, так опишите ее как принимающую еще один указатель, куда будет сложен результат, и возвращающую void. И это уже было 21748888 так если у класса нетривиальный конструктор и деструктор, передавать надо не готовый экземпляр (для него не вызовется деструктор), а указатель на неинициализированный кусок памяти. ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 15:31 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Dimitry SibiryakovblonduserЭкспортируются они все. КАК??? Ну mfc же как-то собирается в виде dll... ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 15:39 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 15:41 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
BarloneНастоящее веселье будет, если класс который в dll, использует множественное наследование...достаточно наличия в классе виртуальных функций ... |
|||
:
Нравится:
Не нравится:
|
|||
30.11.2018, 20:30 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
Anatoly MoskovskyСпособ линковки вообще не причем. У вас разные вызовы синтаксически. В одном случае вы вызываете метод, в другом - свободную функцию. Чтобы во втором случае тоже вызывалось как метод, вам нужно объявить указатель на метод, а не на функцию (при условии что в вашей DLL это действительно метод). Код: plaintext 1. 2. 3. 4.
Всё получилось почти по приведенному примеру и благодаря небольшому напильнику. Проверил для не виртуальных функций. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2018, 16:37 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduserКто подскажет, как сделать так что бы параметры во втором случае передавались так же как в первом? Способ и порядок передачи параметров в фукнцию и возвращаемых значений из функции в С++ не определён. Полагаться на это -- будет программа с UB. Так что ты не должен просто закладываться на это . Кроме этого, есть RVO, copy ellision и встраивание, где ты вообще ничего можешь не передавать никуда. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2018, 18:37 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
blonduserLeonid Kudryavtsev, Всё вызывается с __cdecl, но не помогает. Гы, это как это? вызывается с __cdecl, а написано? ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2018, 18:39 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
kolobok0Рекомендую глянуть книгу Рихтер "WINDOWS для профессионалов" там многое чаво интересного узнаете, в том числе и по библиотекам... Ему лучше не надо! Он и так лезет туда, куда ему рано. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2018, 18:44 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
MasterZivЕму лучше не надо! Он и так лезет туда, куда ему рано. Еще один психолог. Какое ограничение по возрасту 6+? Где вас учат давать бесполезные советы? Уже все сделано и работает. ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2018, 19:35 |
|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#18+
MasterZiv, имхо - люди не способные сами решать мелкие затыки всегда будут находиться на позиции просящих и платящих. тем более не хотящие услышать. профессионала от лоха отличает именно реакция на подсказку - профи достаточно намёка (и будет благодарен!!!) на вероятную возможность либо вектор поиска.... посему считаю что готовые конфеты в рот бесполезны, развращают и могут размножать ошибки, помимо решений. как то так... (круглый) ... |
|||
:
Нравится:
Не нравится:
|
|||
06.12.2018, 22:22 |
|
|
start [/forum/topic.php?all=1&fid=57&tid=2017706]: |
0ms |
get settings: |
11ms |
get forum list: |
15ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
38ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
84ms |
get tp. blocked users: |
2ms |
others: | 264ms |
total: | 437ms |
0 / 0 |