|
|
|
RAD Studio 10.3 Rio
|
|||
|---|---|---|---|
|
#18+
Проголосуйте https://quality.embarcadero.com/browse/RSP-26389 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2019, 12:19 |
|
||
|
RAD Studio 10.3 Rio
|
|||
|---|---|---|---|
|
#18+
Код: pascal 1. 2. 3. 4. 5. 6. 7. 1) "No result argument" - это верно, так как результат возвращается через "Result" аргумент. 2) "error here" - какая собственно error там ? 3) Я думаю, что это "by design", так как реализация позволяет вызовы так, как они есть в родном Delphi коде, т.е.: Код: pascal 1. 2. 3. последнее должно вывести не S_OK, а то что GetValue возвращает. Или я что-то пропустил ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2019, 14:11 |
|
||
|
RAD Studio 10.3 Rio
|
|||
|---|---|---|---|
|
#18+
Dmitry Arefiev Код: pascal 1. 2. 3. 4. 5. 6. 7. 1) "No result argument" - это верно, так как результат возвращается через "Result" аргумент. 2) "error here" - какая собственно error там ? 3) Я думаю, что это "by design", так как реализация позволяет вызовы так, как они есть в родном Delphi коде, т.е.: Код: pascal 1. 2. 3. последнее должно вывести не S_OK, а то что GetValue возвращает. Или я что-то пропустил ? Пропустил то, что функция GetValue описана как safecall. Поэтому результат возвращается в последнем аргументе по ссылке. В Result - должен быть HRESULT, который должен быть в eax/rax и который потом передается в функцию CheckAutoResult. https://stackoverflow.com/questions/96042/whats-safecall ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2019, 19:23 |
|
||
|
RAD Studio 10.3 Rio
|
|||
|---|---|---|---|
|
#18+
Dmitry Arefiev, Вот прототип функции safecall с stdcall. Вот что в итоге должно быть: Код: pascal 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2019, 19:25 |
|
||
|
RAD Studio 10.3 Rio
|
|||
|---|---|---|---|
|
#18+
ziv-2014, еще раз нативный код должен соответствовать динамическому вызову. И в Result должен быть результат исполнения метода, а не HRESULT. Ты же не будешь писать: {code} function Xxxx.GetValue: Integer; safecall; begin // хз как и через что возвращать реальный результат, но за то ... Result := S_OK; end; {code} safecall это соглашения о вызове, но не модификатор логики работы с аргументами и возвращаемым значением. Прочувствуй смысл этой фразы ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2019, 19:29 |
|
||
|
RAD Studio 10.3 Rio
|
|||
|---|---|---|---|
|
#18+
ziv-2014Dmitry Arefiev, Вот прототип функции safecall с stdcall. Вот что в итоге должно быть: Код: pascal 1. Ну теперь попробуй код реального safecall метода засунуть сюда один в один ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2019, 19:31 |
|
||
|
RAD Studio 10.3 Rio
|
|||
|---|---|---|---|
|
#18+
PS: сорри, сюда засунеться, но кто теперь Result ?? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2019, 19:33 |
|
||
|
RAD Studio 10.3 Rio
|
|||
|---|---|---|---|
|
#18+
Dmitry Arefiev, Запустите отладчик и выполните метод с safecall и вам все станет понятно. Результат (Result) передается через стек, а результат (HRESULT) через eax/rax, как любой результат функции. Что-то не понятно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2019, 19:39 |
|
||
|
RAD Studio 10.3 Rio
|
|||
|---|---|---|---|
|
#18+
Dmitry Arefiev, Далее наступает магия компилятора, который дополнительно вызывает CheckAutoResult и если результат (HRESULT) не является ошибкой, то сохраняет переменную (Result) туда куда надо, если же результат (HRESULT) является ошибкой происходит обработка ошибки (см. TInterfacedObject) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2019, 19:41 |
|
||
|
RAD Studio 10.3 Rio
|
|||
|---|---|---|---|
|
#18+
ziv-2014, Точнее ошибки в SafeCallErrorProc. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2019, 19:43 |
|
||
|
RAD Studio 10.3 Rio
|
|||
|---|---|---|---|
|
#18+
Да я в курсе как оно устроено ... Ладно, новый аргумент, меняя соглашение о вызове для метода, тело анонимного метода в TVirtualInterface.Create должно меняться ? Нет, наверное ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2019, 19:46 |
|
||
|
RAD Studio 10.3 Rio
|
|||
|---|---|---|---|
|
#18+
Dmitry Arefievziv-2014Dmitry Arefiev, Вот прототип функции safecall с stdcall. Вот что в итоге должно быть: Код: pascal 1. Ну теперь попробуй код реального safecall метода засунуть сюда один в один ... Вызов будет Код: pascal 1. 2. 3. 4. Код будет работать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2019, 19:46 |
|
||
|
RAD Studio 10.3 Rio
|
|||
|---|---|---|---|
|
#18+
ziv-2014Код будет работать. И это должен проделывать каждый программер ? Или же все-таки это магия компилятора, являющаяся частью соглашения о вызове ? И если это магия являющаяся частью, то чему должно следовать TVirtualInterface ? PS: ты не спеши написать, а реально задайся этими вопросами ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2019, 19:52 |
|
||
|
RAD Studio 10.3 Rio
|
|||
|---|---|---|---|
|
#18+
Или ты хочешь поставить вопрос - и как же получить HRESULT из safecall метода ? Если так, то это понятно, и это фича реквест для TVirtualInterface ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2019, 19:55 |
|
||
|
RAD Studio 10.3 Rio
|
|||
|---|---|---|---|
|
#18+
Dmitry Arefievziv-2014Код будет работать. И это должен проделывать каждый программер ? Или же все-таки это магия компилятора, являющаяся частью соглашения о вызове ? И если это магия являющаяся частью, то чему должно следовать TVirtualInterface ? PS: ты не спеши написать, а реально задайся этими вопросами ... Если этому не следовать, то результат в eax будет случайным, а следовательно вызов CheckAutoResult со случайным параметром будет отрабатываться случайным образом. Ну а дальше сам думай, задайся так сказать вопросом и не спеши писать. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.10.2019, 20:01 |
|
||
|
|

start [/forum/topic.php?fid=58&msg=39876211&tid=2038958]: |
0ms |
get settings: |
5ms |
get forum list: |
14ms |
check forum access: |
2ms |
check topic access: |
2ms |
track hit: |
146ms |
get topic data: |
7ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
| others: | 204ms |
| total: | 429ms |

| 0 / 0 |
