Работа с памятью и указателями в VB.NET

Обсуждение статей, опубликованных на сайте.
gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Работа с памятью и указателями в VB.NET

Сообщение gaidar » 18.02.2006 (Сб) 10:19

Виктор Путевской
Работа с памятью и указателями в VB.NET


http://www.vbstreets.ru/VBdotNET/Articles/66311.aspx
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 18.02.2006 (Сб) 12:56

Недурно.

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

Ситуация из статьи:
Как уже было сказано, оператор AddressOf теперь создает делегат, вместо возможности получить адрес функции. Казалось бы, какая разница как объявлять функцию API? Вместо IntPtr записываем делегат соответствующего типа и все замечательно. К сожалению, вполне может сложиться такая ситуация, когда вам необходим реальный указатель на функцию. Это возможно, например, при вызове функции, которая обеспечивает Callback вызовы при некоторых условиях. То есть у вас есть параметр, который при одних условиях может быть указателем на функцию, а при других чем-то другим. Одним словом этот параметр всегда целое число и перегрузка здесь, к сожалению, не поможет.


Почему не поможет перегрузка-то?
Код: Выделить всё
Module Module1
 

  Private Delegate Function MyCallback(ByVal p1 As Integer, ByVal p2 As Integer) As Integer


  Private Declare Function foo Lib "foolib" (ByVal p1 As Integer, ByVal callback As MyCallback) As Integer
  Private Declare Function foo Lib "foolib" (ByVal p1 As Integer, ByVal callback As Integer) As Integer


  Sub Main()

    foo(1, AddressOf Callback)
    foo(1, 2)

  End Sub


  Function Callback(ByVal p1 As Integer, ByVal p2 As Integer) As Integer
    Return p1 + p2
  End Function

End Module
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 18.02.2006 (Сб) 23:17

GSerg, скажи, как ты бы отличил чисто типа Int от указателя на функцию?
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 18.02.2006 (Сб) 23:28

gaidar писал(а):GSerg, скажи, как ты бы отличил чисто типа Int от указателя на функцию?

Чисто, типа, Int -- это пятьбаллов 8-) :lol:
Изображение

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 19.02.2006 (Вс) 5:50

gaidar писал(а):GSerg, скажи, как ты бы отличил чисто типа Int от указателя на функцию?

Откуда?


Из VB6? Никак. Но ни разу не было такой необходимости.

Из VB .NET? Вопрос не имеет смысла, ибо указатель на функцию суть объект, а о маршалинге указателя в неуправляемый код заботится p-invoke. Заботится, проверял, даже в нетривиальных случаях.

Из неуправляемой библиотеки, которая получила число и думает - указатель это или нет? Никак. Причём совсем никак, ибо способ передачи параметра здесь роли не играет вообще. Перегрузка, varptr - один фиг. Если библиотека хочет отличать одно от другого, она имеет дополнительный параметр, в котором ей объясняют, что передали в первом.


Или я совсём чё-то не понимаю? :?
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 19.02.2006 (Вс) 19:07

Нет, все проще. Функции либо возвращают адрес, либо заведомо известный код ошибки, например -1 и т.е. :)
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali

hCORe
VB - Экстремал
VB - Экстремал
Аватара пользователя
 
Сообщения: 2332
Зарегистрирован: 22.02.2003 (Сб) 15:21
Откуда: parent directory

Сообщение hCORe » 19.02.2006 (Вс) 20:22

Может, поправить в тексте "описателей" на "дескрипторы" (хэндлы, идентификаторы, ...?)
А то название непривычное.
Моду создают модоки, а распространяют модозвоны.

Viper
Артефакт VBStreets
Артефакт VBStreets
Аватара пользователя
 
Сообщения: 4394
Зарегистрирован: 12.04.2005 (Вт) 17:50
Откуда: Н.Новгород

Сообщение Viper » 20.02.2006 (Пн) 12:05

hCORe писал(а):Может, поправить в тексте "описателей" на "дескрипторы" (хэндлы, идентификаторы, ...?)
А то название непривычное.


Почему бы и нет? Можно поправить... Мне как то привычнее всегда был именно описатель (исторически так сложилось).

Насчет указателя на функцию. Вероятность ситуации, когда может понадобиться именно указатель вместо делегата действительно крайне мала. Но если вдруг такое чудо проявится, то вот оно решение.
Весь мир матрица, а мы в нем потоки байтов!

gaidar
System Debugger
System Debugger
 
Сообщения: 3152
Зарегистрирован: 23.12.2001 (Вс) 13:22

Сообщение gaidar » 20.02.2006 (Пн) 23:18

Описатель сохраним, потому что многие так привыкли.
The difficult I’ll do right now. The impossible will take a little while. (c) US engineers in WWII
I don't always know what I'm talking about, but I know I'm right. (c) Muhammad Ali


Вернуться в Статьи

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 0

    TopList