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

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

31.07.2023, 13:41. Показов 1571. Ответов 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
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
24.09.2023, 18:38
Студворк — интернет-сервис помощи студентам
HackerVlad, IPicture - это интерфейс, его можно запросить у объекта StdPicture.
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
24.09.2023, 18:51  [ТС]
А нет, кажется смог, вот таким кодом:

Visual Basic
1
2
3
4
5
6
7
Dim cPic As StdPicture
    
    Set cPic = LoadPictureEx(files_list(List1.ListIndex).path)
    
    Picture1.cls
    DrawFit Picture1.hdc, cPic, Picture1.ScaleWidth, Picture1.ScaleHeight
    Picture1.Refresh
Добавлено через 8 минут
Цитата Сообщение от HackerVlad Посмотреть сообщение
Picture1.Refresh
Picture1.Refresh кстати на конце даже не нужен, я заметил. Может он нужен если AutoRedraw = False?
0
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
14.11.2024, 20:51  [ТС]
Я вот сейчас думаю про GlobalAlloc и про, как я говорил "байтовые массивы". Какую же чушь я писал. Теперь я понял для чего нужен GlobalAlloc. Если нужно переменное (заранее неизвестное католичество) выделенных участков памяти, то как тогда использовать байтовые массивы?))))) вот сейчас я понял что тут как раз и подойдёт GlobalAlloc.

А ещё есть случае где GlobalAlloc действительно требуется обязательно. А так где не обязательно там можно и другие технологии применить IStream например для хранения данных. IStream кстати это отдельная интересная тема.

Добавлено через 20 минут
Кстати даже в MSDN написано что лучше использовать HeapAlloc вместо GlobalAlloc. Но я не видел примера кодов на VB6 для HeapAlloc...

Добавлено через 4 минуты
И в GlobalAlloc ещё непонятно, лично мне, чем отличается GMEM_FIXED от GMEM_MOVEABLE. Проверил работает и то и другое. Только с GMEM_FIXED легче получается, меньше строк кода, не надо даже использовать GlobalLock и GlobalUnLock
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
14.11.2024, 21:34
Цитата Сообщение от HackerVlad Посмотреть сообщение
Если нужно переменное (заранее неизвестное католичество) выделенных участков памяти, то как тогда использовать байтовые массивы?)))))
По сути нет разницы. Что через Redim выделяешь память, что через любую другую функцию динамического выделения памяти.

Цитата Сообщение от HackerVlad Посмотреть сообщение
И в GlobalAlloc ещё непонятно, лично мне, чем отличается GMEM_FIXED от GMEM_MOVEABLE. Проверил работает и то и другое. Только с GMEM_FIXED легче получается, меньше строк кода, не надо даже использовать GlobalLock и GlobalUnLock
Перемещаемая память идентифицируется хендлом, это очень удобно когда нужно передать память в функцию которая может изменить ее размер. Представь ты выделил фиксированную память 100 байт и передал функции которая сохранит в этот блок памяти данные. Если размер данных не превышает 100 байт то все хорошо, а если больше то ей необходимо увеличить этот блок. Увеличение блока памяти в большинстве случаев перемещает регион и тут получишь облом. А с хендлом все гуд. Передал хендл - функция выделила сколько нужно, залочила память, записала данные. Ты же потом с легкостью можешь прочитать эти данные используя тот же самый хендл. Именно поэтому функции типа CreateStreamOnHGlobal принимают именно хендл, а не указатель.
1
Испарился
 Аватар для HackerVlad
1741 / 637 / 45
Регистрация: 10.09.2021
Сообщений: 2,769
14.11.2024, 22:09  [ТС]
Цитата Сообщение от The trick Посмотреть сообщение
CreateStreamOnHGlobal
Я как раз кстати и пробовал на этой функции GMEM_FIXED и GMEM_MOVEABLE и то и другое работает.

Вот как я поэксперементировал:

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
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(0, 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 hMem, 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
Используя фиксированную я таким образом смог отключить использование GlobalLock и GlobalUnlock

Добавлено через 50 секунд
И перемещаемая тоже работает, но там уже сложнее код, уже нужно GlobalLock и GlobalUnlock

Добавлено через 45 секунд
Как мы видим из этого пример функции CreateStreamOnHGlobal всё равно засуним мы ей память фиксированную или перемещаемую.
0
Модератор
10046 / 3892 / 883
Регистрация: 22.02.2013
Сообщений: 5,846
Записей в блоге: 79
14.11.2024, 22:40
HackerVlad, читай описание:

A memory handle allocated by the GlobalAlloc function, or if NULL a new handle is to be allocated instead. The handle must be allocated as moveable and nondiscardable.
Вот когда тебе нужно будет сохранить картинку или вообще что-то записать в IStream то ты получишь облом.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
14.11.2024, 22:40
Помогаю со студенческими работами здесь

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

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
26
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru