Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 | 2 |

 

  Вопрос: CopyMemory Добавлено: 27.10.04 21:43  

Автор вопроса:  Black Dragon | Web-сайт: в разработке | ICQ: 321186096 
Кто знает, чо за функция такая: CopyMemory и есть еще функции на эту же тему (DeleteMemory?)

Ответить

  Ответы Всего ответов: 20  

Номер ответа: 1
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #4
Добавлено: 28.10.04 22:40
Очистить строку в VB'шном понимании навряд-ли удастся, это надо найти описание структуры для хранения string данных в VB, а вот занулить - это запросто...

Ответить

Номер ответа: 5
Автор ответа:
 shareman



Вопросов: 11
Ответов: 37
 Профиль | | #5 Добавлено: 28.10.04 23:59
ZagZag
К вопросу об очистке:
Option Explicit

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
То есть как это - не освободится?
И какие это ДВА символа?
Объясню подробнее, что происходит вот здесь:
CopyMemory strVariable, 0&, 4

Мы просто обнуляем указатель на переменную - 4 байта это размер типа данных Long, а, поскольку strVariable передана по ссылке, то это и есть, в данном случае, указатель.
Того же самого можно добиться при помощи:
Private Declare Sub ZeroMemory Lib "kernel32.dll" Alias "RtlZeroMemory" (Destination As Any, ByVal Length As Long)

ZeroMemory strVariable, 4

Ответить

Номер ответа: 8
Автор ответа:
 sne



Разработчик Offline Client

ICQ: 233286456 

Вопросов: 34
Ответов: 5445
 Web-сайт: hw.t-k.ru
 Профиль | | #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-сайт: dasharm.com
 Профиль | | #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-сайт: hw.t-k.ru
 Профиль | | #12
Добавлено: 30.10.04 17:09
shareman, да не возмущайся ты :)
За то что признал недочет, респект!

ЗЫ
Одно дело твой недочет, и совсем другое таймер и цикл... Ведь то, тоже решения, попросту это один из вариантов, а варианты бывают удачны и не очень, поэтому, имхо, это не одно и то-же...

ЗЗЫ
Не забываем, в споре рождается истина ;)

Ответить

Номер ответа: 13
Автор ответа:
 DaSharm



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #13
Добавлено: 30.10.04 17:55
2shareman: Ты прикалываешься?Сне пожелал ждать в цыкле, я в таймере, чтобы не создавать задержек, а ты, спаситель, посоветовал создать отдельный поток!Ну ты реально крут!Создай поток из ВБ в NT!И все же, это возможно, но гемор офигенный!Таймер - лучше всего, и это правда, таймер использует сам диспетчер задач винды...

Ответить

Номер ответа: 14
Автор ответа:
 CyRax



Разработчик Offline Client

ICQ: 204447456 

Вопросов: 180
Ответов: 4229
 Web-сайт: basicproduction.nm.ru
 Профиль | | #14
Добавлено: 31.10.04 06:09

и, возможно, переменную определяющую размер выделенной под строку области памяти.

 Нет, там по хитрому сделано. Размер указывается перед началом данных строки. Т.е. это VarPtr(String)-4

Ответить

Номер ответа: 15
Автор ответа:
 DaSharm



ICQ: 780477 

Вопросов: 72
Ответов: 1297
 Web-сайт: dasharm.com
 Профиль | | #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)

Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам