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

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

31.07.2023, 13:41. Показов 1774. Ответов 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
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
24.09.2023, 18:38
Студворк — интернет-сервис помощи студентам
HackerVlad, IPicture - это интерфейс, его можно запросить у объекта StdPicture.
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
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
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
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
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 79
14.11.2024, 21:34
Цитата Сообщение от HackerVlad Посмотреть сообщение
Если нужно переменное (заранее неизвестное католичество) выделенных участков памяти, то как тогда использовать байтовые массивы?)))))
По сути нет разницы. Что через Redim выделяешь память, что через любую другую функцию динамического выделения памяти.

Цитата Сообщение от HackerVlad Посмотреть сообщение
И в GlobalAlloc ещё непонятно, лично мне, чем отличается GMEM_FIXED от GMEM_MOVEABLE. Проверил работает и то и другое. Только с GMEM_FIXED легче получается, меньше строк кода, не надо даже использовать GlobalLock и GlobalUnLock
Перемещаемая память идентифицируется хендлом, это очень удобно когда нужно передать память в функцию которая может изменить ее размер. Представь ты выделил фиксированную память 100 байт и передал функции которая сохранит в этот блок памяти данные. Если размер данных не превышает 100 байт то все хорошо, а если больше то ей необходимо увеличить этот блок. Увеличение блока памяти в большинстве случаев перемещает регион и тут получишь облом. А с хендлом все гуд. Передал хендл - функция выделила сколько нужно, залочила память, записала данные. Ты же потом с легкостью можешь прочитать эти данные используя тот же самый хендл. Именно поэтому функции типа CreateStreamOnHGlobal принимают именно хендл, а не указатель.
1
Вернулся
 Аватар для HackerVlad
1748 / 644 / 45
Регистрация: 10.09.2021
Сообщений: 2,786
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
Модератор
10060 / 3905 / 885
Регистрация: 22.02.2013
Сообщений: 5,854
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал (мат мет мод 29)
anaschu 23.06.2026
Многофункциональное здание: как одно здание порождает конфликты требований, которые никто не планировал Материалы для обсуждения с МГСУ · 2026 Рисунки внутри приложенного ворд файла. Что за. . .
28. Конкретное развертывание плана номер 1 из поста номер 27
anaschu 22.06.2026
Можно ли из модели получить конкретные строительные требования? Честно — напрямую из текущей модели такие ответы не получить. Но цепочка логики есть, и она не такая длинная. Где разрыв . . .
27. Планы на разработку функциональных требований к строительству внутри модели пищеблока (или не только его?)
anaschu 22.06.2026
Что уже реализовано и даёт конфликты «бесплатно» Самый простой конфликт уже работает — конфликт за ресурс-работника. Заданий больше, чем доступных поваров → очередь в queue1. Это прямое отражение. . .
26. мед мат модель.Какие типы конфликтов функциональных требований можно рассчитать через ДЕС-моделирование (СМО) в AnyLogic?
anaschu 22.06.2026
Что ДЕС/ СМО умеет считать напрямую: Конфликты за ресурсы (очереди, узкие места). Несколько типов агентов (повара, учителя, рабочие, пациенты) претендуют на один ресурс (лифт, вход, коридор,. . .
25 модель здравосохранения и функциональных требований к пищеблоку: конфликты функциональных требований.
anaschu 22.06.2026
Есть ли данные о том, какие функциональные/ эксплуатационные требования или их сочетания труднее всего учитывать при проектировании зданий? Да, такие данные есть, и они хорошо описаны и в российской,. . .
Remote Connection Manager
DevAlt 21.06.2026
Написал для себя небольшую прилагу: https:/ / github. com/ altbodhi/ ReConMan По итогу пришел к мысли, что DU не дружат с существующими технологиями. От сериализации до отображения в реляционную. . .
Администрация Хабра удаляет новые энергоэфективные алгоритмы, которые не западной школы кода, и вовсе никак не сгенерированы
Hrethgir 20.06.2026
Делается это, как замечено, при правках - при объявлении концептуальных отличий в алгоримах. Делается это, по линейке событий - после дополнения публикации основными отличиями от основных западных. . .
Процесс ориентированная диалектика (не новость - просто системное обновление, философия).
Hrethgir 20.06.2026
Однажды один участник в своём блоге, на этом форуме, сделал запись "О языках замолвите слово". Понимая, что язык - важная вещь, я решил хорошо подумать, прежде чем сказать, и сказал то, что вы видите. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru