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