155 / 9 / 1
Регистрация: 14.08.2019
Сообщений: 768
|
|
1 | |
Как будет &(PVOID&) в reinterpret_cast?21.08.2021, 03:27. Показов 3558. Ответов 47
Метки нет (Все метки)
Как правильно написать приведение к типу &(PVOID&) через reinterpret_cast?
(в Detours вообще написано что DetourAttach ждет первым аргументом void**, но когда я привожу к void** вместо &(PVOID&) то оно крашит процесс при внедрении :/
0
|
21.08.2021, 03:27 | |
Ответы с готовыми решениями:
47
Ошибка: multiple definition of `void std::swap<A>(A&, A&) Язык C, напечатать таблицу истинности логической функции (A & B & C), где & - знаки логический операций И, НЕ Почему friend ostrem& operator <<(ostream& outs, const Rational&); - invalid function declaration? В заштрихованную фигуру бросают точки с координатами x и y. Получить координаты первой точки не попавшей в эту область (фигура x*x+y*y<25&&x*x+y*y>=9& |
2837 / 2339 / 708
Регистрация: 29.06.2020
Сообщений: 8,655
|
|||||||||||
21.08.2021, 19:45 | 21 | ||||||||||
два вызова
так что не убежден завтра со свжей головой буду разбираться, где собака.
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,286
|
|
21.08.2021, 19:51 | 22 |
С чего бы?
В первом у нас rvalue в результате каста. А во втором у нас выражение lpvoid - это lvalue. Добавлено через 3 минуты Ссылка что-то может продлить только до конца блока, либо до конца полного выражения. Так что вам достаточно немного подумать, что даже если бы это произошло, то "продленный" объект просто помер бы в конце выражения и DetourAttach получил бы адрес дохлого объекта. Но этого не происходит. Так что ни о каком продлении речь тут не идет. Речь только о реинтерпретации.
0
|
2837 / 2339 / 708
Регистрация: 29.06.2020
Сообщений: 8,655
|
|
21.08.2021, 20:02 | 23 |
Так о чем я и говорю, указателя на указатель достаточно для изменения исходного указателя.
вот поэтому в реинтерперт каст в вызове функции и добавлена ссылка (ссылка на указатель), то есть из ссылки можно взять адресс, а из rvalue нет. ладно, походу я совсем запутался, или меня запутали.
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,286
|
|||||||||||
21.08.2021, 20:09 | 24 | ||||||||||
SmallEvil, да, и работа с "продленным" временным объектом (я пишу это не потому, что допускаю тут хоть малейшую возможность наличия тут этого явления, а для того, чтобы на ваших ошибочных рассуждениях вам было проще увидеть их ошибочность) противоречит тому, что задумано в этом коде. Нужно изменить именно TrueSleep.
А вариант с продлением, если бы он тут был возможен, работал бы так:
Добавлено через 47 секунд Нет, не достаточно. Короче, см. выше примеры. После него все должно быть понятно. Добавлено через 39 секунд Это верно. Но не потому что там что-то продлевается.
0
|
2837 / 2339 / 708
Регистрация: 29.06.2020
Сообщений: 8,655
|
|
21.08.2021, 20:23 | 25 |
да, не потому, а потому что после каста из ссылкой, выходит другой тип чем каст из PVOID, вот в этом мне и стоит разобраться (поэксперементировать). Спасибо за терпимость и понимание.
То есть, каст со ссылкой не является rvaluе. Только вчера начал читать Мейерса и первая глава там об этом . Добавлено через 37 секунд достаточно
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,286
|
|
21.08.2021, 20:27 | 26 |
0
|
2837 / 2339 / 708
Регистрация: 29.06.2020
Сообщений: 8,655
|
|
21.08.2021, 20:34 | 27 |
вот не ожидал что с реинтерперт каст будут камни подводные ...
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,286
|
|
21.08.2021, 20:49 | 28 |
Так я об этом и говорил.
Каст интерпретировал тип TrueSleep другим образом, но ссылка дала возможно применить эту интерпретацию непосредственно к объекту TrueSleep (т.е. сослаться на него, но под видом другого типа).Не понятно тогда чего вы решили, что Если же мы просто скастим TrueSleep к void**, как это сделал ТС, то мы не добьемся такого же эффекта. Мы просто получим значение исходного указателя на функцию в качестве указателя на указатель. В то время как нам нужно получить адрес исходного указателя на функцию.Добавлено через 10 минут Тут вроде бы все на поверхности. Просто не нужно заниматься делами без понимания того что за ними стоит. Мы, грубо говоря, открываем электрический щиток и начинаем тыкать без разбора во все цепи отверткой (электрик внеше же так же делал), а когда получаем короткое замыкание - чешем репу и говорим "вот уж не ожидал, что со щитком такие подводные камни". Это звучит очень глупо, когда экстраполируется на реальную жизнь, а в программировании запросто может быть Добавлено через 4 минуты Кстати, всегда своим новым сотрудникам говорю, что примеры в документации даются не для переписывания в ваш код, а для того чтобы вы разобрались в принципах работы.
0
|
2837 / 2339 / 708
Регистрация: 29.06.2020
Сообщений: 8,655
|
|
21.08.2021, 21:02 | 29 |
Пример со щитком так себе, как и любые другие аналогии, которые я не люблю, в щитке все ясно, и все выглядит тем чем есть, не так как с++...
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,286
|
|
21.08.2021, 21:02 | 30 |
SmallEvil, для кого-то в щите выглядит "чем есть", а для условного ребенка не выглядит. Он запросто может так сделать. А для меня вся эта ситуация выглядит "чем есть". А для кого-то - это "магия", так же как для ребенка "магия" то, что делает электрик. Т.е. тут разница всего лишь в уровне предметной области. В электрощит вникнуть проще, чем в то, что делается в программировании, но по сути само "вникание" - это действие одной природы.
И на самом деле это не аналогия. Это демонстрация общего подхода, который можно описать коротко как "начать фигачить без понимания сути дела". Сама по себе деятельность не играет роли.
0
|
ablex
|
21.08.2021, 21:08
#31
|
0
|
2837 / 2339 / 708
Регистрация: 29.06.2020
Сообщений: 8,655
|
||||||
21.08.2021, 21:09 | 32 | |||||
ну это не про меня (хотя по последним постам могло быть адресовано мне), и еще код по тому что достаточно указателя на указетель.
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,286
|
|
21.08.2021, 21:14 | 33 |
SmallEvil, этот код о том, что достаточно просто указателя, у которого возможно взять правильный адрес.
Такой же пример я выше показывал в #10 А слова о том, что достаточно void** я понял в контексте того, что описывал ТС в первом сообщении.
1
|
2837 / 2339 / 708
Регистрация: 29.06.2020
Сообщений: 8,655
|
|
21.08.2021, 21:18 | 34 |
но фишку с рентерпетркаст надо записывать отдельно , в большой блокнот
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,286
|
||||||
21.08.2021, 21:24 | 35 | |||||
Резюмируем, что ТС проще всего сделать так:
PVOID* , это наиболее простой для понимания способ.А вот зачем в примерах MS они делали не так (PVOID*)(&TrueSleep) , а так &(PVOID&)(TrueSleep) - непонятно. Никакой практической ценности именно в таком подходе здесь нет.Эта ситуация еще раз красноречиво намекает на то, что переписывать примеры к себе в код - не надо.
1
|
2837 / 2339 / 708
Регистрация: 29.06.2020
Сообщений: 8,655
|
|
21.08.2021, 21:31 | 36 |
мне уже сложно искать правильный ответ, его нужно искать сначала,
но такое не пройдет ! Добавлено через 1 минуту ибо, шаблонная функция - реинтерпреткаст с простым указателем даст рвалую Добавлено через 26 секунд а с ссылкой даст ссылку
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,286
|
||||||
21.08.2021, 21:39 | 37 | |||||
Все пройдет.
В любом случае это не помешает. Добавлено через 2 минуты .... Удивительно как вы умудрились противоречить сами себе. Вы только что предложили самое лучшее для ТС решение его вопроса, и даже продемонстрировали его кодом, но стоило мне вас поддержать, так вы сразу же бросились со мной спорить. Это как так?
0
|
155 / 9 / 1
Регистрация: 14.08.2019
Сообщений: 768
|
|||||||||||
21.08.2021, 21:41 [ТС] | 38 | ||||||||||
Забавно, вчера я именно так и сделал, но подумал что это как-то слишком просто и что я явно где-то ошибся)
Так лучше делать
0
|
18844 / 9843 / 2408
Регистрация: 30.01.2014
Сообщений: 17,286
|
|
21.08.2021, 21:43 | 39 |
Все отличия описаны выше. Я второй раз так распинаться не буду
Добавлено через 45 секунд Второй вариант понятнее, на мой взгляд. Требует меньше знаний для использования.
1
|
2837 / 2339 / 708
Регистрация: 29.06.2020
Сообщений: 8,655
|
|
21.08.2021, 21:47 | 40 |
0
|
21.08.2021, 21:47 | |
21.08.2021, 21:47 | |
Помогаю со студенческими работами здесь
40
ostream &operator<< (ostream &output, const Array &obj) - что означает эта строка? Нюансы синтаксиса: где, как и для чего используется && Как проверить, принадлежит ли символ заданному диапазону m...n, кроме if (c <= n && c >= m) ? Порядок вычисления: операторы «|» и «||», «&» и «&&» Как заменить if(a > first && a < second) одним оператором? Friend ostream& operator<<(ostream& stream, CArr& obj); Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |