powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Порядок передачи параметров при вызове функции.
25 сообщений из 68, страница 2 из 3
Порядок передачи параметров при вызове функции.
    #39740400
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В любом случае если DLL линкуется статически (как было указано вначале), значит все методы из нее экспортированы так чтобы их адрес можно было получить функцией GetProcAddress. Потому что загрузчик именно этой функцией загружает статические импорты.
Виртуальные методы я думаю тоже могли бы экспортироваться через переходники.

ЗЫ. Правильный синтаксис вызова по указателю на метод такой:
Код: plaintext
1.
(this->*pFunctionCall)();
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740410
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, забыл указать, что все что я написал - это теория. Возможно Barlone прав и на практике все это не работает из-за идиотизма создателей компилятора ))
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740424
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyВ любом случае если DLL линкуется статически (как было указано вначале), значит все методы из нее экспортированы так чтобы их адрес можно было получить функцией GetProcAddress. Потому что загрузчик именно этой функцией загружает статические импорты.
Виртуальные методы я думаю тоже могли бы экспортироваться через переходники.

ЗЫ. Правильный синтаксис вызова по указателю на метод такой:
Код: plaintext
1.
(this->*pFunctionCall)();



Когда DLL линкуется статически, то все работает без шаманства.

А вот когда DLL подгружается динамически, то тут то и возникают проблемы с передачей параметров.

Код: plaintext
1.
(this->*pFunctionCall)();


Такой синтаксис даже не линкуется.
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740428
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserТакой синтаксис даже не линкуется.
Синтаксис и не должен линковаться, он компилируется
Приведите код и сообщение об ошибке, из него обычно видно что надо исправить.
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740429
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserКогда DLL линкуется статически, то все работает без шаманства.

"Не верю!" (с)
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740435
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyСинтаксис и не должен линковаться, он компилируется
Приведите код и сообщение об ошибке, из него обычно видно что надо исправить.

Error 6 error C2297: '->*' : illegal, right operand has type 'pFunctionCall'
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740452
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduser,

Кода нет - не о чем говорить.
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740469
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
void Function2_Load(Class&, CResult&, Param1,Param2);


Не подходит течет память.

Обсуждения про возвращаемые объекты, зачем так и т.д уже были и мне не интересны.

Если кто то знает способ правильно передать параметры в загруженную мембер функцию класса
или какой то более интересный способ вызвать мембер функцию, то буду рад воспользоваться вашими знаниями.
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740476
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserТак изначально у меня нет описания класса.
Т.е. кода не будет.
ОК, дальше сами. У меня нет времени гадать как исправить код которого вы не показываете.
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740481
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyblonduserТак изначально у меня нет описания класса.
Т.е. кода не будет.
ОК, дальше сами. У меня нет времени гадать как исправить код которого вы не показываете.

Мне не надо исправлять код. Тем более что все уже показал.
Мне нужно передать в функцию параметры в правильной последовательности.

Будет даже очень интересна дока, где описано когда и как передаются параметры на уровне ассемблера.
Может быть это можно сделать по тем данным которые предоставляет таблица экспорта.
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740490
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что бы передать в МЕТОД объекта параметры в правильной последовательности, нужно знать как этот класс описан

Описание Вы не знаете. Можно гадать дальше на кофейной гуще до бесконечности.

IMHO & AFAIK
Может быть это можно сделать по тем данным которые предоставляет таблица экспорта.

У нормальных людей, к таблице экспорта как минимум прилагается .H файл с описанием ф-ций или классов
У совсем нормальных людей, таблица экспорта экспортирует функции, а не методы объекта
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740492
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid KudryavtsevУ нормальных людей, к таблице экспорта как минимум прилагается .H файл с описанием ф-ций или классов
У совсем нормальных людей, таблица экспорта экспортирует функции, а не методы объекта

Если вы не сильны в программировании, то свои знания по психологии применяйте на другом форуме.
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740496
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserБудет даже очень интересна дока, где описано когда и как передаются параметры на уровне
ассемблера.

А ничего, что она гуглится за пару минут?..
https://docs.microsoft.com/ru-ru/cpp/build/overview-of-x64-calling-conventions?view=vs-2017
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740506
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovА ничего, что она гуглится за пару минут?..
https://docs.microsoft.com/ru-ru/cpp/build/overview-of-x64-calling-conventions?view=vs-2017


И я её гуглил, но там не сказано про возвращаемое значение и как передаются параметры для мембер функции(указатель на объект класса).

вот тут сказано что возвращаемое значение передается через RAX, а это не так... см. пример ассемблерного кода в начале топика.
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740511
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserвот тут сказано что возвращаемое значение передается через RAX, а это не так...

Это так. Читай внимательно про ограничения на типы данных, передаваемых через регистры.
Твой Result это совсем не целое до восьми байт. И даже не указатель.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740512
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЧитай внимательно.....

Мне кажется, лучше еще раз перечитать
21748699
и не заниматься фигней

свои знания по психологии применяйте на другом форуме.
К сожалению кол-во форумов где я зарегестрирован, очень мало.
Даже в ВК мне не пойти - нету меня там )))
Т.ч. я пока тут останусь
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740622
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovblonduserвот тут сказано что возвращаемое значение передается через RAX, а это не так...

Это так. Читай внимательно про ограничения на типы данных, передаваемых через регистры.
Твой Result это совсем не целое до восьми байт. И даже не указатель.

тсс, за возвращение класса из ДЛЛ положен отдельный эцих с граблями. не мешайся
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740623
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
дай человеку поеграться

тем более, про ВМТ от еще не доехал, про которую ему АМ мягко намекнул
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740630
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Siemarglпро ВМТ от еще не доехал

Да ладно, кто я такой чтобы закрывать от него чудной мир COM...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740631
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduser...Кто подскажет, ...


Представляете - Вы ПЕРВЫЙ в МИРЕ кто столкнулся с такими проблемами!!!

улыбнуло? значит надо отдохнуть и стэп-бай-стэп раскрутить все узелки у Вас в голове.
По ходу обсуждения выясняется, что Вы не владете терминологией.
Посему либо начинаете изъясняться на языке программистов, либо (что предпочтительнее) делаете остов Вашей проблемы (рыбу) и постите на форуме. Поверьте - это САМЫЕ оптимальные пути получения информации.

Народ попытался натолкнуть Вас на путеводители по грабелькам, но Вы упорно стараетесь наступать туда, куда не следует. Хозяин барин, в конечном итоге оно так крепче запоминается. :)

Закончу по существу, так сказать с базиса...
1) Есть статические либы, есть динамические. Статические - это сборная солянка неких компильнутых бинарных модулей сваленых в один файлик. Файлик имеет расширение 'lib'. Его отлично знает любой линковщик. Бинарные модули собираются в библиотеку после компиляции. Эти модули(объектники) могут быть написаны на любом языке поддерживающих стандарт линковки-объектников. Объектные модули, после компиляции, как правило имеют расширение 'obj'. Динамическая библиотека (DLL в мире форточек) - это загружаемая в процессе работы процессора, исполняемые части кода. Связывание dll с кодом происходит на этапе загрузки (загрузчик прописывает вентили вызовов на каждую функцию и ссылочные объекты).
2) Динамические библиотеки могут загружаться явно и не явно. Явно - это когда Вы в коде пишите типа лоад лайбрэри и далее гэт фанкшион адресс. Далее юзаете функцию по полученному адресу. Не явно - это когда проблемы загрузки и получение адресов на функции делает за вас загрузчик либо при старте либо при первом вызове(см. настройки).
3) Динамические библиотеки можно отгружать. Данный функционал в полный рост может юзать COM.
4) Язык си, си плас плас и иже - это ТИПИЗИРОВАННЫЕ языки. Не зная типа связывание не произойдёт. Связывание - это процесс в основном который делает компилятор и(или) линковщик.

Исходя из выше сказанного.
а) Любая библиотека - есть способ хранения и использования вашего исполняемого кода. Библиотека НЕ вносит никаких (от слова совсем) изменений отличных от описания на данную библиотеку.
б) Любую библиотеку можно упразднить (убрать совсем) либо наоборот создать из любого кода библиотеку. Т.е . это не обман или шаманство за спиной у компилятора-линковщика, это удобство использования и только.
в) Если Вы не можете создать свой код БЕЗ библиотеки, то библиотека Вам НЕ сможет помочь (написать или придумать за вас типизацию или описание типов), от слова совсем.


как то так.
(круглый)
ЗЫ
Рекомендую глянуть книгу
Рихтер
"WINDOWS для профессионалов"
там многое чаво интересного узнаете, в том числе и по библиотекам...
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740735
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0Представляете - Вы ПЕРВЫЙ в МИРЕ кто столкнулся с такими проблемами!!!


Если бы я был первый, то не пытался бы выяснить на форуме!
Зачем было копи-пастить столько букв, если вы не можете прочитать то, что уже написано?!
Поверьте, что уже было много читано перечитано и испробовано, но возникают косяки.

Так что теоретики могут расслабится и отдыхать.

Хотелось бы послушать практиков, которые столкнулись с такой проблемой и успешно её решили.
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740794
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduser
И я её гуглил, но там не сказано про возвращаемое значение и как передаются параметры для мембер функции(указатель на объект класса).

вот тут сказано что возвращаемое значение передается через RAX, а это не так... см. пример ассемблерного кода в начале топика.Ну если возвращаемое значение не лезет в регистр, то первым параметром передается указатель на место в памяти, где будет помещен результат.
https://itanium-cxx-abi.github.io/cxx-abi/abi.html#return-value
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740809
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneНу если возвращаемое значение не лезет в регистр, то первым параметром передается указатель на место в памяти, где будет помещен результат.
https://itanium-cxx-abi.github.io/cxx-abi/abi.html#return-value

Это все понятно.
Только если это мембер функция класса, то первым параметром всегда должна передаваться ссылка на объект класса.
А когда я обращаюсь к функции после получения её адреса через GetProcAddress, первым параметром лезет именно возвращаемой значение. И происходит падение.

Думал сделать это через встроенный ассемблер, но оказалось что Itanium и X64 не поддерживают его.

За ссылку спасибо.
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740828
Фотография Cerebrum
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
может я чего не понял, но если прям так необходимо держать логику классов в DLL, то почему не сделать DLL с экпортируемой С-функцией, которая будет возвращать вам указатель на объект класса, который вам необходим, а дальше делайте с ним все что нужно. То есть эта функция своего рода ворота к фабрике классов внутри DLL.

У этого подхода есть множество плюсов, взять хотя бы то, что из библиотеки наружу не торчат конструкторы, деструкторы и операторы классов, а все инкапсулировано внутри, как и требуется согласно ООП.

Чтобы не возникало проблем с освобождением памяти, создать еще две экспортируемые функции: allocator и deallocator. Или сделать так как делает это COM через подсчет ссылок и Release на стороне клиента.

blonduser Вариант
Код: plaintext
1.
void Function2_Load(Class&, CResult&, Param1,Param2);


Не подходит течет память.
и вместо того, чтобы разобраться почему, начали изобретать костыли - а чо? нормальный подход!
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740829
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserоказалось что Itanium и X64 не поддерживают его.

Поддерживают. По крайней мере GCC.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
25 сообщений из 68, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Порядок передачи параметров при вызове функции.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]