powered by simpleCommunicator - 2.0.58     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Порядок передачи параметров при вызове функции.
68 сообщений из 68, показаны все 3 страниц
Порядок передачи параметров при вызове функции.
    #39739919
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Всем доброго времени суток!

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

Когда возвращаемое значение простой тип(int, char, указатель) или отсутствует(void) то все ок.

1)Когда возвращаемое значение объект класса то тут начинается неразбериха.
Если библиотека линкуется при сборке исполняемого модуля, то возвращаемый объект передается последним.
Код: plaintext
1.
2.
3.
4.
5.
6.
	Class->ParserFile();
000000013F2910D7  lea         rdx,[rsp+48h]  
000000013F2910DC  mov         rcx,qword ptr [Class]  
000000013F2910E1  call        qword ptr [__imp_Class::ParserFile (013F2EA3F8h)]  
000000013F2910E7  lea         rcx,[rsp+48h]  
000000013F2910EC  call        qword ptr [__imp_Result::~Result (013F2EA3B8h)] 



2)Если библиотека загружается по мере надобности и происходит вызов нужных функций, то возвращаемый объект передается первым.
Код: plaintext
1.
2.
3.
4.
5.
6.
		pFunction(Class);
000000013F911252  mov         rdx,qword ptr [Class] 
000000013F911257  lea         rcx,[rsp+68h]  
000000013F91125C  call        qword ptr [rsp+48h]  
000000013F911260  lea         rcx,[rsp+68h]  
000000013F911265  call        qword ptr [__imp_Result::~Result (013F96A3B8h)]  



Кто подскажет, как сделать так что бы параметры во втором случае передавались так же как в первом?
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39739923
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
__cdecl
__stdcall
etc....

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

Всё вызывается с __cdecl, но не помогает.
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39739933
Leonid Kudryavtsev
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что такое "библиотека загружается по мере надобности" ?
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39739974
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserВсё вызывается с __cdecl

Не вижу в приведённом ассемблере cdecl. В стэк ничего не заносится, после возврата стэк не
очищается. У тебя, походу, используется fastcall (что характерно для 64 бит).

Код объявления pFunction покажешь?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39739978
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovКод объявления pFunction покажешь?


typedef Result (__cdecl *pFunction)(LPVOID);
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740004
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blondusertypedef Result (__cdecl *pFunction)(LPVOID);

В таком случае твоё "pFunction(Class)" это бред полный и работать не может, ибо ты
указатель на объект приводишь к указателю на функцию.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740007
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovblondusertypedef Result (__cdecl *pFunction)(LPVOID);

В таком случае твоё "pFunction(Class)" это бред полный и работать не может, ибо ты
указатель на объект приводишь к указателю на функцию.


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

pFunction это у тебя тип, объявленный с помощью typedef. Конструкция "тип(значение)" это
приведение типов, а не вызов функции. Так что где-то что-то ты недоговариваешь. Давай
полный код, а то ещё окажется, что у тебя pFunction() до кучи это метод класса, а в этом
случае приведённый ассемблер корректен, ибо метод получает this в rcx и первый параметр в rdx.

Или ты написал что-то неправильно и оптимизатор у тебя статическую функцию
Код: sql
1.
Result foo(bar*)


перековал в
Код: sql
1.
void foo(Result&, bar*)


в целях copy elimination.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740040
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovblonduserЯ не привожу указатель на объект к указателю на функцию.

pFunction это у тебя тип, объявленный с помощью typedef. Конструкция "тип(значение)" это
приведение типов, а не вызов функции. Так что где-то что-то ты недоговариваешь. Давай
полный код, а то ещё окажется, что у тебя pFunction() до кучи это метод класса , а в этом
случае приведённый ассемблер корректен, ибо метод получает this в rcx и первый параметр в rdx.


Да pFunction - это метод класса.
Об этом было сказано первой строкой в описание топика.

Ну, как то так.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        typedef Result (__cdecl *pFunction)(LPVOID);
	HMODULE hLibrary = LoadLibraryW(L"Library.dll");

	if(hLibrary != NULL)
	{
		pFunction pFunctionCall = (pFunction)GetProcAddress(hLibrary, MAKEINTRESOURCEA(616)); // ParserFile;
		
                pFunctionCall(this);
                ....
         }
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740063
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserДа pFunction - это метод класса.
Об этом было сказано первой строкой в описание топика.

Э, нет. ParserFile это метод, а pFunction это обычная функция. И не надо их путать.
Поставь принудительно -O0 и посмотри результат. Скорее всего будет такой же облом. А всё
потому, что не надо возвращать классы по значению из библиотечных функций.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740078
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovЭ, нет. ParserFile это метод, а pFunction это обычная функция. И не надо их путать.
Поставь принудительно -O0 и посмотри результат. Скорее всего будет такой же облом. А всё
потому, что не надо возвращать классы по значению из библиотечных функций.


Метод класса это функция, в которую первым параметром передается указатель на объект класса.
Остальное все уже описано выше.

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

Да. А простая статическая функция это функция в которую может передаваться то, что хочет
компилятор, и так, как хочет компилятор. И в твоём случае компилятору хочется в pFunction
передать Result* для исполнения своего долга по copy elision.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740087
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakov,

К чему эмоции?

Повторю вопрос :
Кто подскажет, как сделать так что бы параметры во втором случае передавались так же как в первом?
Если без шаманства нельзя, то так и скажите что нельзя.

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

Измени прототип функции на
Код: sql
1.
void pFunction(LPVOID, Result&);


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

Так она у меня уже работает.
Но хотелось, что бы без шаманства.
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740096
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тогда повторю медленно: не надо из библиотечных функций возвращать классы по значению. И
по ссылке тоже лучше этого не делать. И вообще лучше DLL не использовать без особой нужды.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740099
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry Sibiryakovтогда повторю медленно: не надо из библиотечных функций возвращать классы по значению. И
по ссылке тоже лучше этого не делать. И вообще лучше DLL не использовать без особой нужды.


Уже сделано и обратно не вернуть. Нужно использовать то что есть.
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740148
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Leonid Kudryavtsev__cdecl
__stdcall
в x64 этого нет
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740166
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserDimitry SibiryakovЭ, нет. ParserFile это метод, а pFunction это обычная функция. И не надо их путать.
Поставь принудительно -O0 и посмотри результат. Скорее всего будет такой же облом. А всё
потому, что не надо возвращать классы по значению из библиотечных функций.


Метод класса это функция, в которую первым параметром передается указатель на объект класса.
Остальное все уже описано выше.

Вопрос остался открытым.
не совсем так просто =)
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740167
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
судя по коду, [очередной] пользователь дибильдера
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740173
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduser,

blonduserЕсли библиотека линкуется при сборке исполняемого модуля, то возвращаемый объект передается последним.

blonduserЕсли библиотека загружается по мере надобности и происходит вызов нужных функций, то возвращаемый объект передается первым.
Способ линковки вообще не причем.
У вас разные вызовы синтаксически. В одном случае вы вызываете метод, в другом - свободную функцию.
Чтобы во втором случае тоже вызывалось как метод, вам нужно объявить указатель на метод, а не на функцию (при условии что в вашей DLL это действительно метод).

Ну и __cdecl убрать. Не надо указывать компилятору то в чем он лучше шарит ))

Код: plaintext
1.
2.
3.
4.
typedef Result (Class::*pFunction)(); 

pFunction pFunctionCall = (pFunction)GetProcAddress(hLibrary, MAKEINTRESOURCEA(616)); // ParserFile;
this->*pFunctionCall();
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740386
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserМетод класса это функция, в которую первым параметром передается указатель на объект класса.
Остальное все уже описано выше.
Вот совсем не обязательно, это одна из возможных реализаций. Компилятор может например указатель на объект передавать в метод через специальный регистр, который никогда для передачи обычных параметров не используется (и какая-то версия msvc именно так и делала).
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740387
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky
Код: plaintext
1.
2.
3.
4.
typedef Result (Class::*pFunction)(); 

pFunction pFunctionCall = (pFunction)GetProcAddress(hLibrary, MAKEINTRESOURCEA(616)); // ParserFile;
this->*pFunctionCall();

Не, так нельзя, указатель на метод - это не указатель на функцию, они не совместимы. У указателя на метод даже размер может отличаться от обычного указателя.
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740393
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlone,

Если функция невиртуальная, то указатель на нее тот же что и для свободных функций.

Виртуальные же вообще не надо импортировать из DLL напрямую . Они импортируются неявно через vtbl
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #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
Порядок передачи параметров при вызове функции.
    #39740835
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserТолько если это мембер функция класса, то первым параметром всегда должна передаваться
ссылка на объект класса.

Кстати, чисто из любопытства: как ты умудрился экспортировать отдельный метод класса?
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740857
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserBarloneНу если возвращаемое значение не лезет в регистр, то первым параметром передается указатель на место в памяти, где будет помещен результат.
https://itanium-cxx-abi.github.io/cxx-abi/abi.html#return-value

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

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

За ссылку спасибо.Ну если вы все равно вручную описываете импортированный из dll метод класса как обычную функцию, так опишите ее как принимающую еще один указатель, куда будет сложен результат, и возвращающую void.
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740866
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Настоящее веселье будет, если класс который в dll, использует множественное наследование...
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740887
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovblonduserТолько если это мембер функция класса, то первым параметром всегда должна передаваться
ссылка на объект класса.

Кстати, чисто из любопытства: как ты умудрился экспортировать отдельный метод класса?


Приводил кусок года именно для вас 21747788
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740892
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneНу если вы все равно вручную описываете импортированный из dll метод класса как обычную функцию, так опишите ее как принимающую еще один указатель, куда будет сложен результат, и возвращающую void.

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

Это не код экспорта . Это код импорта . Совсем разницы не замечаешь?..
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39740910
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovblonduserПриводил кусок года именно для вас

Это не код экспорта . Это код импорта . Совсем разницы не замечаешь?..


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

КАК???
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39741000
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserBarloneНу если вы все равно вручную описываете импортированный из dll метод класса как обычную функцию, так опишите ее как принимающую еще один указатель, куда будет сложен результат, и возвращающую void.

И это уже было 21748888 так если у класса нетривиальный конструктор и деструктор, передавать надо не готовый экземпляр (для него не вызовется деструктор), а указатель на неинициализированный кусок памяти.
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39741011
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovblonduserЭкспортируются они все.

КАК???
Ну mfc же как-то собирается в виде dll...
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39741015
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39741293
Siemargl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BarloneНастоящее веселье будет, если класс который в dll, использует множественное наследование...достаточно наличия в классе виртуальных функций
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39743682
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyСпособ линковки вообще не причем.
У вас разные вызовы синтаксически. В одном случае вы вызываете метод, в другом - свободную функцию.
Чтобы во втором случае тоже вызывалось как метод, вам нужно объявить указатель на метод, а не на функцию (при условии что в вашей DLL это действительно метод).

Код: plaintext
1.
2.
3.
4.
typedef Result (Class::*pFunction)(); 

pFunction pFunctionCall = (pFunction)GetProcAddress(hLibrary, MAKEINTRESOURCEA(616)); // ParserFile;
this->*pFunctionCall();



Всё получилось почти по приведенному примеру и благодаря небольшому напильнику.
Проверил для не виртуальных функций.
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39743785
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserКто подскажет, как сделать так что бы параметры во втором случае передавались так же как в первом?

Способ и порядок передачи параметров в фукнцию и возвращаемых значений из функции в С++ не определён.
Полагаться на это -- будет программа с UB.
Так что ты не должен просто закладываться на это .

Кроме этого, есть RVO, copy ellision и встраивание, где ты вообще ничего можешь не передавать никуда.
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39743788
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
blonduserLeonid Kudryavtsev,

Всё вызывается с __cdecl, но не помогает.

Гы, это как это?
вызывается с __cdecl, а написано?
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39743791
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
kolobok0Рекомендую глянуть книгу
Рихтер
"WINDOWS для профессионалов"
там многое чаво интересного узнаете, в том числе и по библиотекам...

Ему лучше не надо!
Он и так лезет туда, куда ему рано.
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39743807
blonduser
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivЕму лучше не надо!
Он и так лезет туда, куда ему рано.

Еще один психолог. Какое ограничение по возрасту 6+?
Где вас учат давать бесполезные советы?
Уже все сделано и работает.
...
Рейтинг: 0 / 0
Порядок передачи параметров при вызове функции.
    #39743908
kolobok0
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

имхо - люди не способные сами решать мелкие затыки всегда будут находиться на позиции просящих и платящих. тем более не хотящие услышать. профессионала от лоха отличает именно реакция на подсказку - профи достаточно намёка (и будет благодарен!!!) на вероятную возможность либо вектор поиска.... посему считаю что готовые конфеты в рот бесполезны, развращают и могут размножать ошибки, помимо решений.

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


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