Страница: 1 | 2 |
Вопрос: CopyMemory
Добавлено: 27.10.04 21:43
Автор вопроса: Black Dragon | Web-сайт:
Кто знает, чо за функция такая: CopyMemory и есть еще функции на эту же тему (DeleteMemory?)
Ответы
Всего ответов: 20
Номер ответа: 1
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #1
Добавлено: 27.10.04 23:30
Копирование блока памяти заданной длинны с одного адреса в другой...
DeleteMemory - это еще как? Нет такого...
Есть MoveMemory, ZeroMemory
Номер ответа: 2
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #2
Добавлено: 28.10.04 08:31
FillMemory
Номер ответа: 3
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #3
Добавлено: 28.10.04 11:39
А интересно быстрее ли отчистится строка
при strString = "", при FillMemory, или при ZeroMemory?
Ясно что АПИ быстрее, но как это сделать?
Номер ответа: 4
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #4
Добавлено: 28.10.04 22:40
Очистить строку в VB'шном понимании навряд-ли удастся, это надо найти описание структуры для хранения string данных в VB, а вот занулить - это запросто...
Номер ответа: 5
Автор ответа:
shareman
Вопросов: 11
Ответов: 37
Профиль | | #5
Добавлено: 28.10.04 23:59
ZagZag
К вопросу об очистке:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Private Sub Command1_Click()
Dim strVariable As String
strVariable = "Some string"
Debug.Print strVariable '"Some string"
Debug.Print Len(strVariable) '11
CopyMemory strVariable, 0&, 4
Debug.Print strVariable 'пустая строка
Debug.Print Len(strVariable) '0
End Sub
Номер ответа: 6
Автор ответа:
crackoff
ICQ: 156165990
Вопросов: 12
Ответов: 229
Профиль | | #6
Добавлено: 29.10.04 07:58
>ZagZag
при этом память не освободится, ты просто запонил первые ДВА символа сроки нулями
Номер ответа: 7
Автор ответа:
shareman
Вопросов: 11
Ответов: 37
Профиль | | #7
Добавлено: 29.10.04 12:07
crackoff
То есть как это - не освободится?
И какие это ДВА символа?
Объясню подробнее, что происходит вот здесь:
Мы просто обнуляем указатель на переменную - 4 байта это размер типа данных Long, а, поскольку strVariable передана по ссылке, то это и есть, в данном случае, указатель.
Того же самого можно добиться при помощи:
ZeroMemory strVariable, 4
Номер ответа: 8
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #8
Добавлено: 29.10.04 12:59
2shareman, а ты уверен что правильно представляешь что происходит !?
Извини, конечно, я никак не хочу поставить тебя в неловкое положение, но и вводить в заблуждение общественность, тоже не позволю...
Сам я не изучал детально как хранит VB строки, но одно сказать могу точно, хранятся они в юникоде, строка это не обычная последовательность байт, а структура, вероятно, содержащая в себе переменную-указатель на область памяти, и, возможно, переменную определяющую размер выделенной под строку области памяти.
Т.о. скорее всего зануляя первые 4 байта ты попросту вводишь в заблуждение msvbvm60.dll, которая не может найти указатель/размер области данных...
Это легко проверить, загрузив в переменную эдак метров 15, и посмотреть на память... Все верно, глядим и видим ~30 Мб (юникод - по два байта на каждый символ). Теперь исполняем твой код, смотрим - у мня осталось опосля этой процедуры 19 Мб... Теперь выполняем вот это:
Private Sub Command2_Click()
strVariable = vbNullString
MsgBox strVariable
End Sub
смотрим, о, все как и должно быть, программа занимает обычные 2 мб памяти...
ЗЫ
Для работы с памятью в VB используются функции работы с памятью потоков, а именно те что Tls...
Номер ответа: 9
Автор ответа:
shareman
Вопросов: 11
Ответов: 37
Профиль | | #9
Добавлено: 30.10.04 16:32
2sne
Верно, признаю свою ошибку. То, что мною написано до этого = vbNullString
Номер ответа: 10
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #10
Добавлено: 30.10.04 16:38
да...shareman...тебе сначала нужно книги прочесть хоть какие-то по ВБ, уж тогда на форум...
Номер ответа: 11
Автор ответа:
shareman
Вопросов: 11
Ответов: 37
Профиль | | #11
Добавлено: 30.10.04 17:03
О-о-о, DaSharm, как круто!
А родителей приводить или нет?
Знаешь, если вымести поганой метлой всех тех, кто хоть раз дал неправильный ответ - на форуме только админы останутся (да и то, не все)
Я вот давеча видел как один из уважаемых форумчан посоветовал дожидаться окончания процесса в таймере, а другой - в цикле Do со Sleep - ну так как, укажем им на дверь?
У человека должно быть право на ошибку, недосып, перепой и т.д.
Пойду Аппельмана почитаю
Номер ответа: 12
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #12
Добавлено: 30.10.04 17:09
shareman, да не возмущайся ты
За то что признал недочет, респект!
ЗЫ
Одно дело твой недочет, и совсем другое таймер и цикл... Ведь то, тоже решения, попросту это один из вариантов, а варианты бывают удачны и не очень, поэтому, имхо, это не одно и то-же...
ЗЗЫ
Не забываем, в споре рождается истина
Номер ответа: 13
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #13
Добавлено: 30.10.04 17:55
2shareman: Ты прикалываешься?Сне пожелал ждать в цыкле, я в таймере, чтобы не создавать задержек, а ты, спаситель, посоветовал создать отдельный поток!Ну ты реально крут!Создай поток из ВБ в NT!И все же, это возможно, но гемор офигенный!Таймер - лучше всего, и это правда, таймер использует сам диспетчер задач винды...
Номер ответа: 14
Автор ответа:
CyRax
Разработчик Offline Client
ICQ: 204447456
Вопросов: 180
Ответов: 4229
Web-сайт:
Профиль | | #14
Добавлено: 31.10.04 06:09
и, возможно, переменную определяющую размер выделенной под строку области памяти.
Нет, там по хитрому сделано. Размер указывается перед началом данных строки. Т.е. это VarPtr(String)-4
Номер ответа: 15
Автор ответа:
DaSharm
ICQ: 780477
Вопросов: 72
Ответов: 1297
Web-сайт:
Профиль | | #15
Добавлено: 31.10.04 10:08
String
|00 00 00 00|0000 0000 0000 0000|
Вот это BStr, что используеться в ВБ, сперва 4 байта, эти 4 байта - указатель на участок памяти, содержащий Unicode символы (по 2 байта на символ). Мож ещё что забыл, давно читал книги по этой фигне...
Но лучше разобраться со структурой BStr можно все тем же CopyMemory, сперва нужно скопировать строку в байтовый массив и вывести на экран. Сразу все будет ясно, но при написании примера следите за тем, чтобы ВБ не конвертнул строку в ASCII (StrConv.......VBUnicode)