1. VarPtr(p)
2. Работа, блин, с указателями, где же ещё. Скажи мне более быстрый способ записать число по указанному адресу на VB.
GSerg писал(а):А VarPtr - не lvalue.
Lord_Satan писал(а):...
Раскажи как получит адрес ячейки, где хранится адрес переменной
...
GSerg писал(а):Никак, блин!
Если бы это было возможно, то VarPtr был бы lvalue!
Ennor писал(а):Чтобы получить адрес переменной, в которой хранится адрес другой переменной, нужно сначала их обе объявить и в первую засунуть адрес второй. А потом как обычно - твоя вторая переменная это ведь тоже всего лишь переменная...
TEH3OP писал(а):Тыкс, у нас тут два челобрека и один из них ТУПОЙ.
Если это не я, то: Месир Lord_Satan, адрес ячейки памяти нигде не хранится, вернее он храниться в самой переменной, а ещё вернее, переменная -- это есть адрес в памяти. А уж сам язык програмирования, заботится о о том, чтобы обращаясь к переменной, вы с её содержимым работали. А для компа это адрес, а записывается он в стек. А стек это область памяти, а проще ещё (но не правильней) -- это массив 32-х разрядных чисел. А вааще, могу посоветовать вам, месир, почитать "Win32 API и Visual Basic".
int* addressofasddress(int a) {return &a ;}
int** addressofasddress(int* a) {return &a ;}
ToT писал(а):Это значение(400B34) жестко прописывается в экзешнике при компиляции
GSerg писал(а):Исходник оной я бы посмотрел...
GSerg писал(а):Мы тут на форуме обычно на ты, это не обижает, а объединяет. Хотя и готовы выслушать субъективные возражения, буде таковые имеются. Но пока, если ты не против...
GSerg писал(а):Суть примера вовсе не в оптимизации способа суммирования элементов массива. Изначально у меня...
GSerg писал(а):Я немного усовершенствовал (как мне кажется) работу цикла, передачу параметров и вообще... Но первоочередная задача была всё та же: дать возможность осуществлять вызов функции по указателю. И всё. Правда, это очень многое даёт.
GSerg писал(а):Динамически генерируемая ассемблерная вставка у меня в коде делает единственную вещь: push для всех параметров, call и ret. Ну нет в VB встроенной возможности вызывать функции по указателю. Поэтому так. Как юзер воспользуется данной новоприобретённой фичей - это уже вопрос, выходящий за рамки данного модуля класса...
Public Declare Function GetMem4_ Lib "msvbvm60" Alias "GetMem4" (ByVal pSrc As Long, ByRef pDst As Long) As Long
Public Sub StrBytesToLongSh(ByRef vStr As String, ByRef vLng As Long)
'Сюда необхдимо посылать строку "правильной" (не меньше) длины и уже после StrConv(Str, vbFromUnicode)
GetMem4_ StrPtr(vStr), vLng
End Sub
Public Sub StrBytesToLongEx(ByRef vStr As String, ByRef vLng As Long)
Dim lStr As String * 4, lAL As Byte
lAL = Len(vStr)
If lAL > 4 Then lAL = 4
lStr = StrConv(Left(vStr, lAL) & String(4 - lAL, Chr(0)), vbFromUnicode)
GetMem4_ StrPtr(lStr), vLng
End Sub
Option Explicit
Private Sub Form_Load()
Dim a As String, b() As Byte
Me.AutoRedraw = True
a = "проверка"
b = a
Me.Print "Строка a содержит " & Len(a) & " символов."
Me.Print "Массив b содержит " & UBound(b) - LBound(b) + 1 & " байт. Потому что Юникод."
Me.Print
a = "проверка"
b = StrConv(a, vbFromUnicode)
Me.Print "Строка a содержит " & Len(a) & " символов."
Me.Print "Массив b содержит " & UBound(b) - LBound(b) + 1 & " байт. Потому что Анси."
On Error GoTo oops
a = b
b = a
On Error GoTo 0
Me.Print "И присвоение работает без ошибок."
Exit Sub
oops:
Me.Print "Присвоение не удалось!"
End Sub
GSerg писал(а):Я не рекомендовал бы. В MSDN специально отмечается, что DC - закрытая структура, формат которой мелкософт может менять как хочет. Так что работать с ним нужно стандартными функциями.
Сейчас этот форум просматривают: Google-бот, PetalBot и гости: 16