определить тип void указателя
От: sergey2b ЮАР  
Дата: 18.12.20 18:29
Оценка: :)
у меня есть функция которая получает void*
на самом деле это может быть указатель на мной определенный класс или HANDLE для файла


подскажите пожалуйста есть ли хороший способ определить какого типа указатель получила функция
Re: определить тип void указателя
От: Pzz Россия https://github.com/alexpevzner
Дата: 18.12.20 18:50
Оценка: +1
Здравствуйте, sergey2b, Вы писали:

S>подскажите пожалуйста есть ли хороший способ определить какого типа указатель получила функция


Нету. void* — это просто адрес в памяти. Никакой метаинформации к нему не прилагается.
Re: определить тип void указателя
От: kov_serg Россия  
Дата: 18.12.20 18:53
Оценка: +1
Здравствуйте, sergey2b, Вы писали:

S>у меня есть функция которая получает void*

S>на самом деле это может быть указатель на мной определенный класс или HANDLE для файла
S>подскажите пожалуйста есть ли хороший способ определить какого типа указатель получила функция
Передать его в явном виде:

void fn(void* ptr,int ptr_type);

Но лучше использовать интерфейсы:

void fn(IStream *stream);
Re[2]: определить тип void указателя
От: sergey2b ЮАР  
Дата: 18.12.20 18:53
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, sergey2b, Вы писали:


S>>подскажите пожалуйста есть ли хороший способ определить какого типа указатель получила функция


Pzz>Нету. void* — это просто адрес в памяти. Никакой метаинформации к нему не прилагается.



я это понимаю
но тк на верхнем уровне я вызываю эту функцию я точно знаю что я могу передать только
pointer на класс
HANDLE FILE
Re: определить тип void указателя
От: rg45 СССР  
Дата: 18.12.20 18:56
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>у меня есть функция которая получает void*

S>на самом деле это может быть указатель на мной определенный класс или HANDLE для файла
S>подскажите пожалуйста есть ли хороший способ определить какого типа указатель получила функция

Встроенной такой возможности нет, поддержка таких преобразований всегда делается вручную. Тут можно использовать различные подходы, но все они будут так или иначе завязаны на какие-то соглашения о типах и надежность системы будет зависеть от соблюдения этих соглашений, т.е. в значительной мере будет зависеть от человеческого фактора. Даже если сделать все предельно аккуратно, ни о какой типовой безопасности здесь речи быть не может.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[2]: определить тип void указателя
От: sergey2b ЮАР  
Дата: 18.12.20 19:02
Оценка:
Здравствуйте, kov_serg, Вы писали:


_>void fn(void* ptr,int ptr_type);


я не могу менять прототип функции
Re[2]: определить тип void указателя
От: sergey2b ЮАР  
Дата: 18.12.20 19:10
Оценка:
Здравствуйте, rg45, Вы писали:

R>Здравствуйте, sergey2b, Вы писали:


S>>у меня есть функция которая получает void*

S>>на самом деле это может быть указатель на мной определенный класс или HANDLE для файла
S>>подскажите пожалуйста есть ли хороший способ определить какого типа указатель получила функция

R>Встроенной такой возможности нет, поддержка таких преобразований всегда делается вручную. Тут можно использовать различные подходы, но все они будут так или иначе завязаны на какие-то соглашения о типах и надежность системы будет зависеть от соблюдения этих соглашений, т.е. в значительной мере будет зависеть от человеческого фактора. Даже если сделать все предельно аккуратно, ни о какой типовой безопасности здесь речи быть не может.


я надеялся что смогу использовать
_cast и GetHandleInformation function
Re[3]: определить тип void указателя
От: Carc Россия https://vk.com/gosha_mazov
Дата: 18.12.20 19:23
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>Здравствуйте, Pzz, Вы писали:


Pzz>>Здравствуйте, sergey2b, Вы писали:


S>>>подскажите пожалуйста есть ли хороший способ определить какого типа указатель получила функция


Pzz>>Нету. void* — это просто адрес в памяти. Никакой метаинформации к нему не прилагается.



S>я это понимаю

S>но тк на верхнем уровне я вызываю эту функцию я точно знаю что я могу передать только
S>pointer на класс
S>HANDLE FILE

Ну можно попробовать позвать GetHandleInformation, если вернет TRUE, то соответственно это HANDLE в этом случае…

Опять же коды ошибок нужно проверять после вызова через GetLastError. По идее если это не HANDLE GetLastError вернет ERROR_INVALID_HANDLE. А вот если все таки HANDLE то что-то другое…
Aml Pages Home
Re[3]: определить тип void указателя
От: cserg  
Дата: 18.12.20 19:24
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>я не могу менять прототип функции

А тело? Это ваша функция или чужая?
Re: определить тип void указателя
От: vopl Россия  
Дата: 18.12.20 19:24
Оценка: 10 (1)
Здравствуйте, sergey2b, Вы писали:

S>у меня есть функция которая получает void*

S>на самом деле это может быть указатель на мной определенный класс или HANDLE для файла


S>подскажите пожалуйста есть ли хороший способ определить какого типа указатель получила функция


Берешь полученный void*, тестируешь его на то что он HANDLE (посредством какой нибудь winapi-функции которая не портит этот HANDLE, но может диагностировать что это не HANDLE, например — GetHandleInformation либо подбери какая подойдет, да хоть DuplicateGandle+CloseHandle). Если тест прошел — работаешь с HANDLE, иначе — там объект тобой определенного класса.

В своих классах делаешь какой нибудь механизм для определения типа, например magic. А может вообще используешь rtti для этого. На основе этого механизма детектишь тип объекта. Ну и всё, далее работаешь с ним в соответствии с этим типом.
Re[4]: определить тип void указателя
От: sergey2b ЮАР  
Дата: 18.12.20 19:26
Оценка:
Здравствуйте, cserg, Вы писали:

C>Здравствуйте, sergey2b, Вы писали:


S>>я не могу менять прототип функции

C>А тело? Это ваша функция или чужая?

это callback function тело я могу менять
Re[3]: определить тип void указателя
От: Pzz Россия https://github.com/alexpevzner
Дата: 18.12.20 19:27
Оценка: 10 (1) +3
Здравствуйте, sergey2b, Вы писали:

S>я это понимаю

S>но тк на верхнем уровне я вызываю эту функцию я точно знаю что я могу передать только
S>pointer на класс
S>HANDLE FILE

Ну ты можешь, например, вести глобальную таблицу адресов экземпляров этого класса, управляе ей (таблицей) из конструкторов и деструкторов. Соответственно, если указателя нет в таблице, то он HANDLE.

Но я бы так стал делать только от отчаянья.
Re[3]: определить тип void указателя
От: kov_serg Россия  
Дата: 18.12.20 19:30
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>я не могу менять прототип функции

Прототип в студию!
Re[5]: определить тип void указателя
От: Pzz Россия https://github.com/alexpevzner
Дата: 18.12.20 19:41
Оценка:
Здравствуйте, sergey2b, Вы писали:

S>это callback function тело я могу менять


А нельзя использовать два callback'а: один для указателей на класс, другой — для HANDLE?
Re[2]: определить тип void указателя
От: Pzz Россия https://github.com/alexpevzner
Дата: 18.12.20 19:43
Оценка: +1
Здравствуйте, vopl, Вы писали:

V>Берешь полученный void*, тестируешь его на то что он HANDLE (посредством какой нибудь winapi-функции которая не портит этот HANDLE, но может диагностировать что это не HANDLE, например — GetHandleInformation либо подбери какая подойдет, да хоть DuplicateGandle+CloseHandle). Если тест прошел — работаешь с HANDLE, иначе — там объект тобой определенного класса.


А эти функции точно правильно работают, если им какой-то вообще левый указатель подсунуть?
Re[3]: определить тип void указателя
От: vopl Россия  
Дата: 18.12.20 19:50
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, vopl, Вы писали:


V>>Берешь полученный void*, тестируешь его на то что он HANDLE (посредством какой нибудь winapi-функции которая не портит этот HANDLE, но может диагностировать что это не HANDLE, например — GetHandleInformation либо подбери какая подойдет, да хоть DuplicateGandle+CloseHandle). Если тест прошел — работаешь с HANDLE, иначе — там объект тобой определенного класса.


Pzz>А эти функции точно правильно работают, если им какой-то вообще левый указатель подсунуть?



Ну вот автор и попробует) Чисто теоретически — DuplicateHandle просто обязан работать правильно, иначе он нарушит заявленные в документации гарантии.
Re[6]: определить тип void указателя
От: sergey2b ЮАР  
Дата: 18.12.20 19:50
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, sergey2b, Вы писали:


S>>это callback function тело я могу менять


Pzz>А нельзя использовать два callback'а: один для указателей на класс, другой — для HANDLE?


я сейчас пытаюсьэто сделать
пока не получилось но шанс не 0
Re[3]: определить тип void указателя
От: rg45 СССР  
Дата: 18.12.20 19:52
Оценка: 10 (1)
Здравствуйте, sergey2b, Вы писали:

S>я надеялся что смогу использовать

S>_cast и GetHandleInformation function

Можешь, конечно, но исключительно на свой страх и риск. Вот смотри:

https://docs.microsoft.com/en-us/windows/win32/api/handleapi/nf-handleapi-gethandleinformation

You can specify a handle to one of the following types of objects: access token, console input buffer, console screen buffer, event, file, file mapping, job, mailslot, mutex, pipe, printer, process, registry key, semaphore, serial communication device, socket, thread, or waitable timer.


Дается полный перечень того, что ты можешь передать в функцию. То есть, строго говоря, для того, чтобы вызывать эту функцию, ты должен быть уверен, что твой указатель void* является чем-то из перечисленного. И нигде ничего не говорится, что произойдет, если передать в функцию какой-нибудь левый указатель. А раз не знаем, значит и использовать такой способ проверки валидности указателя не можем.

Ну и как быть с остальными типами — вопрос остается без ответа.
--
Не можешь достичь желаемого — пожелай достигнутого.
Re[5]: определить тип void указателя
От: cserg  
Дата: 18.12.20 19:59
Оценка: +2
Здравствуйте, sergey2b, Вы писали:

S>это callback function тело я могу менять

Ну, тогда когда вы создаете объект вашего класса помещайте его указатель например, в set, а в функции проверяйте его наличие там. Если объект там есть, то это ваш класс, нет — HANDLE. Получить экземпляр set внутри функции можно, например, через механизм tls.
Если callback синхронный, то можно обойтись и без set.
Отредактировано 18.12.2020 20:09 cserg . Предыдущая версия .
Re[6]: определить тип void указателя
От: sergey2b ЮАР  
Дата: 18.12.20 20:07
Оценка:
Здравствуйте, cserg, Вы писали:

C>Здравствуйте, sergey2b, Вы писали:


S>>это callback function тело я могу менять

C>Ну, тогда когда вы создаете объект вашего класса помещайте его например, в set, а в функции проверяйте его наличие там. Если объект там есть, то это ваш класс, нет — HANDLE. Получить экземпляр set внутри функции можно, например, через механизм tls.
C>Если callback синхронный, то можно обойтись и без set.


у меня есть С++ class
который вызывает одну из внешних callback функций С функций

разработичками библиотеки этот механизм был сделан что бы читать файл из разных источников например БД или криптоконтейнера

нам понадобилось перекрыть все операции на чтение запись модификация
я сдела но с огрнаичениями


объсните пложалуйста что гуглить что бы понять как использовать tls что бы узнать какой класс вызвал С функцию
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.