|
Порядок передачи параметров при вызове функции.
|
|||
---|---|---|---|
#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 |
|
|
start [/forum/topic.php?fid=57&msg=39740735&tid=2017706]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
others: | 11ms |
total: | 161ms |
0 / 0 |