Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.83/6: Рейтинг темы: голосов - 6, средняя оценка - 4.83
Испарился
 Аватар для HackerVlad
1742 / 638 / 45
Регистрация: 10.09.2021
Сообщений: 2,769

Зачем некоторые программисты используют GlobalAlloc? По мне так это глупость полнейшая

31.07.2023, 13:41. Показов 1668. Ответов 25
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Зачем некоторые программисты используют GlobalAlloc??? По мне так это глупость полнейшая, неужели нельзя обойтись без GlobalAlloc для программиста на VB можно же и не выделять память вообще для своей программы, можно пользоваться например байтовыми массивами простыми если надо. Я не понимаю зачем GlobalAlloc, GlobalLock, GlobalUnlock, GlobalFree. Может кто-нибудь мне объяснит зачем так мудрить...
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
31.07.2023, 13:41
Ответы с готовыми решениями:

Зачем это используют
Хотел бы узнать зачем используют вот такую работу с памятью в SQL запросах Connection* iconn = SQLPool.GetConnection(); ...

Почему программисты используют классы, удобно ли это, плюсы и минусы классов
Здравствуйте,программисты я сейчас участвую в научной конференции по теме "Классы на c#" и мне нужно узнать ваше мнение,почему...

сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь усложнять?
сегодня наконец то понял что такое КЛАСС, и ОБЪЕКТ. понято всё, кроме одного - зачем всё это? в смысле, можно же без этого? так зачем жизнь...

25
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,733
Записей в блоге: 14
31.07.2023, 22:08
Скажу осторожно: в современных версиях Windows статус участка выделенной памяти может быть разный (в частности, возможно, что участок памяти не будет позволять разместить исполняемый код - это про байтовые массивы). А GlobalAlloc выделяет память, в которой можно поместить исполняемый код.
0
Испарился
 Аватар для HackerVlad
1742 / 638 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
31.07.2023, 23:15  [ТС]
Catstail, интересная гипотеза, но я своими глазами видел как исполняемый код засовывали в байтовый массив

Добавлено через 22 минуты
Вот пример функция сортировки массива qsort здесь в этом примере исполняемый код функции как раз лежит в байтовом массиве:

Модуль:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
Option Explicit
Private Declare Sub qsort CDecl Lib "ntdll" (ByVal base As Long, ByVal num As Long, ByVal width As Long, ByVal compare As Long)
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As Long
Private Declare Function GetProcAddress Lib "kernel32" (ByVal hModule As Long, ByVal lpProcName As String) As Long
Private Declare Function FreeLibrary Lib "kernel32" (ByVal hLibModule As Long) As Long
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Dest As Any, Src As Any, ByVal Length As Long)
Private Declare Function VarCmp Lib "oleaut32" (ByRef pvarLeft As Any, ByRef pvarRight As Any, ByVal lcid As Long, ByVal dwFlags As Long) As Long
Private Declare Function GetUserDefaultLCID Lib "kernel32" () As Long
 
Global arr(4) As Variant
Dim Comparer(0 To 24) As Byte
 
Private Function MyCompare CDecl(arg1 As Variant, arg2 As Variant) As Long
    MyCompare = VarCmp(arg1, arg2, GetUserDefaultLCID, &H1)
End Function
 
Private Function MyCompare1 CDecl(arg1 As Variant, arg2 As Variant) As Long
    Debug.Print "arg1:" & CStr(arg1)
    Debug.Print "arg2:" & CStr(arg2)
    
    MyCompare1 = StrComp(CStr(arg1), CStr(arg2), vbTextCompare)
End Function
 
Public Function my1()
    Dim hModule As Long
    Dim VarCmp As Long
    
    hModule = LoadLibrary("oleaut32")
    VarCmp = GetProcAddress(hModule, "VarCmp")
    
    ' Для косвенного вызова через qSort функции VarCmp (сравнение двух Variant переменных)
    ' qSort сама чистит стек после выполнения этой вставки.
    ' stdCall - ложим в стек параметры справа налево
    Comparer(0) = &H6A                  '6A00       push 0 - dwFlags
    Comparer(2) = &H6A                  '6A00       push 0 - lcid
    CopyMemory Comparer(4), &H102474FF, 4 'FF742410 push dword ptr [esp+10h] - pvarRight
    CopyMemory Comparer(8), &H102474FF, 4 'FF742410 push dword ptr [esp+10h] - pvarLeft
    CopyMemory Comparer(12), &H2E8, 2   'E802000000 call $+2 - Начнем выполнение с Comparer(19) (push xxxxxxxx -
                                        ' где xxxxxxxx- адрес функции VarCmp)
                                        ' Возвращаемое значение в регистре eax
    Comparer(17) = &H48                 '48         dec eax  - Вычитаем единицу для соответствия константам qSort'a
    Comparer(18) = &HC3                 'C3         ret - stdcall функция VarCmp сама почистила стек, поэтому просто выходим
    Comparer(19) = &H68                 '68xxxxxxxx push xxxxxxxx - здесь пишем адрес функции VarCmp в стек
    CopyMemory Comparer(20), VarCmp, 4
    Comparer(24) = &HC3
    
    arr(0) = "яблоки"
    arr(1) = "дыни"
    arr(2) = "груши"
    arr(3) = "бананы"
    arr(4) = "арбузы"
    
    qsort VarPtr(arr(0)), UBound(arr) + 1, 16, VarPtr(Comparer(0))
End Function
Форма:
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Option Explicit
 
Private Sub Command1_Click()
    Dim i As Long
    
    my1
    
    For i = 0 To UBound(arr)
        Print arr(i)
    Next
End Sub
1
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38195 / 21128 / 4309
Регистрация: 12.02.2012
Сообщений: 34,733
Записей в блоге: 14
31.07.2023, 23:16
HackerVlad, не настаиваю.
0
Испарился
 Аватар для HackerVlad
1742 / 638 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
31.07.2023, 23:17  [ТС]
У меня код немного неправильный, брал от туда: Работа с DLL в Visual Basic (статья)
Но суть в том что как видно в байтовом массиве лежит исполняемый код
0
Испарился
 Аватар для HackerVlad
1742 / 638 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.09.2023, 11:18  [ТС]
На мою тему так никто особо толком и не ответил. Зато вот сейчас я понял. Что выделять память через API быстрее, чем через ReDim у массива.

Добавлено через 2 минуты
The Trick говорит, что выделяя память через ReDim Preserve всё сначала забивается пустыми нулями, а на это уходит много времени.
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
24.09.2023, 13:31
Цитата Сообщение от HackerVlad Посмотреть сообщение
The Trick говорит, что выделяя память через ReDim Preserve всё сначала забивается пустыми нулями, а на это уходит много времени.
Я такого не говорил. Redim зануляет память, а Redim Preserve зануляет только добавленные элементы.
1
Испарился
 Аватар для HackerVlad
1742 / 638 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.09.2023, 15:00  [ТС]
The trick, извини, чуть ошибся

Ну получается что использовать API для выделения памяти имеет смысл только чтобы сэкономить чуть-чуть времени на выделение памяти? А так в большинстве случае и простой байтовый массив сойдёт. Так ведь?
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
24.09.2023, 15:07
HackerVlad, все эти микрооптимизации можно использовать лишь бы был в этом смысл. Если тебе просто какие-то данные нужно обработать некритично по времени - тогда и простой массив пойдет.
0
Испарился
 Аватар для HackerVlad
1742 / 638 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.09.2023, 15:11  [ТС]
The trick, а можно с тобой проконсультировать по поводу кода который я нашёл? Там используется GlobalAlloc я вот думаю нужен ли он там вообще!?
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
24.09.2023, 15:20
Цитата Сообщение от HackerVlad Посмотреть сообщение
Там используется GlobalAlloc я вот думаю нужен ли он там вообще!?
Ну кидай код. GlobalAlloc может использоваться если сказано в документации что нужно использовать GlobalAlloc, к примеру функция CreateStreamOnHGlobal требует такую память. GlobalAlloc также может выделять перемещаемую память, по факту возвращает хендл памяти, а чтобы его зафиксировать вызывается GlobalLock/GlobalUnlock.
1
Испарился
 Аватар для HackerVlad
1742 / 638 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.09.2023, 15:22  [ТС]
The trick, в общем я использую код, который где-то нашёл в Интернете, для загрузки картинок из байтового массива:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
Private Declare Function CLSIDFromString Lib "ole32" (ByVal lpsz As Any, pclsid As GUID) As Long
Private Declare Function IsEqualGUID Lib "ole32" (rguid1 As GUID, rguid2 As GUID) As Boolean
Private Declare Function CreateStreamOnHGlobal Lib "ole32" (ByVal hGlobal As Long, ByVal fDeleteOnRelease As CBoolean, ppstm As Any) As Long
Private Declare Function OleLoadPicture Lib "olepro32" (pStream As Any, ByVal lSize As Long, ByVal fRunmode As CBoolean, riid As GUID, ppvObj As Any) As Long
Private Declare Sub MoveMemory Lib "kernel32" Alias "RtlMoveMemory" (pDest As Any, pSource As Any, ByVal dwLength As Long)
Private Declare Function GlobalAlloc Lib "kernel32" (ByVal uFlags As Long, ByVal dwBytes As Long) As Long
Private Declare Function GlobalLock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalUnlock Lib "kernel32" (ByVal hMem As Long) As Long
Private Declare Function GlobalFree Lib "kernel32" (ByVal hMem As Long) As Long
 
Private Enum CBoolean ' Enum members are Long data types
    CFalse = 0
    CTrue = 1
End Enum
 
Private Type GUID        ' 16 bytes (128 bits)
    dwData1 As Long      ' 4 bytes
    wData2 As Integer    ' 2 bytes
    wData3 As Integer    ' 2 bytes
    abData4(7) As Byte   ' 8 bytes, zero based
End Type
 
Private Const sIID_IPicture = "{7BF80980-BF32-101A-8BBB-00AA00300CAB}"
Private Const S_OK = 0 ' Indicates successful HRESULT
Private Const GMEM_MOVEABLE = &H2
 
Public Function PictureFromBits(abPic() As Byte) As IPicture ' Not a StdPicture!!
    Dim nLow As Long
    Dim cbMem  As Long
    Dim hMem  As Long
    Dim lpMem  As Long
    Dim IID_IPicture As GUID
    Dim istm As stdole.IUnknown ' IStream
    Dim ipic As IPicture
    
    ' Get the size of the picture's bits
    On Error GoTo out
    nLow = LBound(abPic)
    On Error GoTo 0
    cbMem = (UBound(abPic) - nLow) + 1
    
    ' Allocate a global memory object
    hMem = GlobalAlloc(GMEM_MOVEABLE, cbMem)
    If hMem Then
        ' Lock the memory object and get a pointer to it.
        lpMem = GlobalLock(hMem)
        
        If lpMem Then
            ' Copy the picture bits to the memory pointer and unlock the handle.
            MoveMemory ByVal lpMem, abPic(nLow), cbMem
            Call GlobalUnlock(hMem)
            
            ' Create an ISteam from the pictures bits (we can explicitly free hMem
            ' below, but we'll have the call do it here...)
            If (CreateStreamOnHGlobal(hMem, CTrue, istm) = S_OK) Then
                If (CLSIDFromString(StrPtr(sIID_IPicture), IID_IPicture) = S_OK) Then
                    ' Create an IPicture from the IStream (the docs say the call does not
                    ' AddRef its last param, but it looks like the reference counts are correct..)
                    Call OleLoadPicture(ByVal ObjPtr(istm), cbMem, CFalse, IID_IPicture, PictureFromBits)
                End If   ' CLSIDFromString
            End If ' CreateStreamOnHGlobal
        End If ' lpMem
        
        Call GlobalFree(hMem)
    End If ' hMem
out:
End Function
Но мне непонятно зачем тут использовать эти GlobalAlloc, GlobalLock, GlobalUnlock, GlobalFree

Добавлено через 1 минуту
The trick, тут как раз CreateStreamOnHGlobal
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
24.09.2023, 15:22
Цитата Сообщение от HackerVlad Посмотреть сообщение
Но мне непонятно зачем тут использовать эти GlobalAlloc, GlobalLock, GlobalUnlock, GlobalFree
Ну тут как раз то случай где в документации написано - используйте GlobalAlloc для инициализации.
0
Испарился
 Аватар для HackerVlad
1742 / 638 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.09.2023, 15:23  [ТС]
The trick, на твой взгляд этот код оптимален значит? и ничего менять не надо?
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
24.09.2023, 15:28
Я бы использоваль SHCreateMemStream. Ну и там замечания ещё есть, с телефона не удобно писать.
1
Испарился
 Аватар для HackerVlad
1742 / 638 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.09.2023, 15:31  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
SHCreateMemStream
Да, я только вот как раз прочитал в MSDN как раз сказано, что эта функция более оптимальная и обеспечивает более высокую производительность. Значит ли это что картинки можно загружать чуть быстрее!?
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
24.09.2023, 15:35
HackerVlad, просто можно меньшим количеством кода обойтись поскольку она принимает данные инициализации и не нужно работать с выделением памяти.
1
Испарился
 Аватар для HackerVlad
1742 / 638 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.09.2023, 17:42  [ТС]
The trick, надо будет тогда значит написать функцию более оптимальную для загрузки картинок из байтового массива. Мне это нужно ни только для PNG. Но и для загрузки юникодных имён файлов. Сначала загружаю я файл в байтовый массив потом загружаю картинку.

Добавлено через 1 час 58 минут
The trick, слушай, а этот код загрузки картинки из байтового массива получается не грузит PNG? Можешь, пожалуйста, поделиться готовым кодом для загрузки картинки из байтового массива чтобы грузило и PNG тоже?
0
Модератор
10057 / 3902 / 884
Регистрация: 22.02.2013
Сообщений: 5,853
Записей в блоге: 79
24.09.2023, 18:30
https://www.cyberforum.ru/blog... g1824.html
1
Испарился
 Аватар для HackerVlad
1742 / 638 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.09.2023, 18:37  [ТС]
The trick, я наверное таким образом не смогу применить твой DrawFit. Так как там функция возвращает As StdPicture у тебя, а мне надо iPicture Disp вроде как
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.09.2023, 18:37
Помогаю со студенческими работами здесь

Зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может больше 4 байт весить?
Вот еще один вопрос зачем биты нужны это меньше байтов но int 32 бита но я не допер зачем это нужно это 4 байта то есть int не может...

Зачем мне принтер, если он ест краску, я же могу и так с компьютера рисовать?
Здравствуйте! У вас такой форум огромный, слов много непонятных, потому извините, если пишу не там. В общем, у меня такая проблема: я...

QueryTable копирует веб страницу не так, как мне нужно, то есть некоторые ссылки не копируются
Добрый день. QueryTable копирует веб страницу не так, как мне нужно, то есть некоторые ссылки не копируются. Когда я копирую, страницу...

Почему программисты часто используют шестнадцатеричную систему счисления?
Сабж. Почему? Например число 255 в шестнадцатеричной системе счисления записывается как 0xff Но 255 же удобнее читать и даже короче...

Зачем в scanf писать тип данных, если в начале программы это и так пишется?
если переменная a имеет тип integer , то зачем это указывать в printf???


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Вывод данных через динамический список в справочнике
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
10 пpимет, которые всегда сбываются
Maks 31.03.2026
1. Чтобы, наконец, пришла маршрутка, надо закурить. Если сигарета последняя, маршрутка придет еще до второй затяжки даже вопреки расписанию. 2. Нaдоели зима и снег? Не надо переезжать. Достаточно. . .
Перемещение выделенных строк ТЧ из одного документа в другой
Maks 31.03.2026
Реализация из решения ниже выполнена на примере нетипового документа "ВыдачаОборудованияНаСпецтехнику" с единственной табличной частью "ОборудованиеИКомплектующие" разработанного в конфигурации КА2. . . .
Functional First Web Framework Suave
DevAlt 30.03.2026
Sauve. IO Апнулись до NET10. Из зависимостей один пакет, работает одинаково хорошо как в режиме проекта так и в интерактивном режиме. из сложностей - чисто функциональный подход. Решил. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru