Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
ЗЫ вот еще раз перечитал набор сообщений - есть подозрение, что КОПИРОВАНИЕ коллекций Вам в действительности не нужно. Можно обойтись и без него, но нужно. Именно независимая копия. Ok. Обсудим более конкретные примеры: В данном случае используя библиотеку типов для доступа к IUnknown получим раннее связывание. На основе этого кода, можно сделать свою коллекцию, сохраняя пойнтеры и контролируя их через IUnknown. Public Sub Store(objThis As Object) As Long Dim iU As IShellFolderEx_TLB.IUnknown Set iU = objThis iU.AddRef Set iU = Nothing Store = ObjPtr(objThis) ' objThis cannot terminate until we call iU.Release on it End Sub ' To Retrieve the Object From the Long Value: Private Property Get ObjectFromPtr(ByVal lPtr As Long) As Object Dim objT As Object ' Bruce McKinney's code for getting an Object from the ' object pointer: CopyMemory objT, lPtr, 4 Set ObjectFromPtr = objT CopyMemory objT, 0&, 4 End Property ' To Delete The Object: Public Sub Delete(ByVal lPtr As Long) As Long Dim objThis As Object Set objThis = ObjectFromPtr(lPtr) Dim iU As IShellFolderEx_TLB.IUnknown Set iU = objThis iU.Release Set iU = Nothing Set objThis = Nothing ' objThis now terminates if there are no other external ' references to it. End Sub Точно так же, используя библиотеку типов , можно получить раннее связывание и для IMalloc. С его помощью резервировать память под обьекты, ссылки на которые хранить в массиве. Public Function SaveToMemory(ByRef b() as Byte) As Long Dim lSize As Long Dim lPtr As Long On Error Resume Next ' Error checking: UBound/LBound can fail. lSize = UBound(b) - LBound(b) If Err.Number=0 Then lSize = lSize + 1 Else ' No Data: lSize = 0 End If On Error Goto 0 lPtr = isMalloc.Alloc(lSize + 4) If Not (lPtr=0) Then ' Store the size of the array: CopyMemory ByVal lPtr, lSize, 4 If lSize > 0 Then ' Store the array: CopyMemory ByVal lPtr + 4, b(0), lSize End If End If ' Return the Value of lPtr SaveToMemory = lPtr End Function ' To Restore the array from the Pointer lPtr: Public Sub RestoreFromMemory(ByVal lPtr As Long, ByRef b() as Byte) Dim lSize As Long Erase b If Not (lPtr = 0) Then ' Get the size of the array: CopyMemory lSize, ByVal lPtr, 4 If lSize > 0 Then ReDim b(0 To lSize-1) As Byte CopyMemory b(0), ByVal lPtr, lSize End If End If End Sub Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 14:00 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
Мне трудно придумать ситуацию, когда использование IUnknown как инстумента упраления счетчиком ссылок приносит внятную пользу в программах, написанных на VB, для объектов порожденных в VB. И когда я говорил об этом, я имел ввиду сказать, что (как правило) в его использовании (почти) нет необходимости. Может быть найдется польза для управления Ком-объектами, порождаемыми внешними процессами. Приведенный Вами код при следущем его использовании Dim obj1 As MyClass Dim obj2 As MyClass Dim lngPtr as Long set obj1 = New MyClass lngPtr = Strore(obj1) set obj2 = ObjectFromPtr(lngPtr) НЕОТЛИЧИМ от Dim obj1 As MyClass Dim obj2 As MyClass Dim lngPtr as Long Set obj1 = New MyClass Set obj2 = obj1 И поэтому Store и ObjFromPtr для простых случаев - мусор. Применительно к теме копирования - Вам решать... По поводу IMalloc - удобно, если акуратно. Однако практика (моя) показывает, что в содержательных случаях не выигрывает перед Redim или String$, привнося потребность слежения за освобождением памяти. Пользу от IMalloc можно попробовать получить при программировании IO через API (каналы, сокеты, почтовые слоты, файлы, ком порты). Мне почти всегда Redim хватало. Правда есть еще одна специальная задачка, где полезно - преобразование указателя на строку к массиву заданного целочисленного типа (байт, целое, длинное целое) БЕЗ КОПИРОВАНИЯ байтов строки ( в задачах типа MIME кодирования) В точки зрения оптимизации скорости при выполнении операции копирования массив представляется (мне) наиболее удобной конструкцией, какой бы смысл вы не вкладывали в термин "копирование" PS все вышесказанное - всего лишь скромное мнение. специально для волков - возможно ошибочное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 16:07 |
|
||
|
Копирование коллекции
|
|||
|---|---|---|---|
|
#18+
Вообщем то , мне хотелось получить простой ответ, можно или нет? Если да то как? Резюмируя, можно сказать так: простого способа нет. Применительно к копированию: более быстрый доступ к элементам коллекции. Источник кода: http://www.vbaccelerator.com/codelib/imalloc/objstore.htm Magnus ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 19.02.2004, 16:13 |
|
||
|
|

start [/forum/topic.php?fid=60&gotonew=1&tid=2170046]: |
0ms |
get settings: |
9ms |
get forum list: |
19ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
55ms |
get topic data: |
13ms |
get first new msg: |
8ms |
get forum data: |
3ms |
get page messages: |
55ms |
get tp. blocked users: |
2ms |
| others: | 255ms |
| total: | 425ms |

| 0 / 0 |
