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

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

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

Цитата Сообщение от HackerVlad Посмотреть сообщение
И в GlobalAlloc ещё непонятно, лично мне, чем отличается GMEM_FIXED от GMEM_MOVEABLE. Проверил работает и то и другое. Только с GMEM_FIXED легче получается, меньше строк кода, не надо даже использовать GlobalLock и GlobalUnLock
Перемещаемая память идентифицируется хендлом, это очень удобно когда нужно передать память в функцию которая может изменить ее размер. Представь ты выделил фиксированную память 100 байт и передал функции которая сохранит в этот блок памяти данные. Если размер данных не превышает 100 байт то все хорошо, а если больше то ей необходимо увеличить этот блок. Увеличение блока памяти в большинстве случаев перемещает регион и тут получишь облом. А с хендлом все гуд. Передал хендл - функция выделила сколько нужно, залочила память, записала данные. Ты же потом с легкостью можешь прочитать эти данные используя тот же самый хендл. Именно поэтому функции типа CreateStreamOnHGlobal принимают именно хендл, а не указатель.
1
Вернулся
 Аватар для HackerVlad
1778 / 673 / 46
Регистрация: 10.09.2021
Сообщений: 2,820
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
Модератор
10068 / 3913 / 886
Регистрация: 22.02.2013
Сообщений: 5,863
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
ИИ не может найти нужный язык в списке
Supersumestria 05.10.2026
Я ему даю вот такое изображение и прошу найти и подчеркнуть немецкий язык. Возвращает он вот это: https:/ / i. **********/ vqBWLe2. png Нужную строчку в 3й колонке просто выдумал. . Это. . .
Новая последняя моя музыка в SUNO
zorxor 05.10.2026
Здравствуйте, дорогие мои друзья! С большой радостью я хотел бы представить вам свою новую последнею музыку, которую сгенерировала мне по моей просьбе нейросеть SUNO. С уважением, zorxor. Это. . .
Программный домашний кинотеатр
russiannick 27.09.2026
Сподобился на программный домашний кинотеатр. В качестве ЯВУ по традиции выбрал js. В помощники взял Яндекс-Алису. Было создано три зала на разные интересы. исторические и ретро сериал Хичкок. . .
Беседа с ИИ о программистах, недопускающих к созданию и правке кода генеративные ИИ и причины этого
zorxor 21.09.2026
Раньше я радовался или получал некоторые эмоции, пусть небольшие, но всё же, от самого процесса написания кода, рекомпиляции и запуска, видя постепенное развитие программы и прочее. А теперь лень. . .
Мобильное приложение ColorStep
pavlinmavlin 17.09.2026
Реализовал приложение Красный, Зеленый, Синий в Unity3d + c#. Название изменил на ColorStep. Приложение прошло модерацию и теперь доступно для скачивания. Делал его сам, шаг за шагом — и вот,. . .
Запрет дублирования строк в табличной части
Maks 13.09.2026
Реализация из решения ниже выполнена на нетиповом справочнике "Нормы ТО" с табличной часть "Виды ТО", разработанного в КА2, со следующими реквизитами: - ВидТО (СправочникСсылка. ВидыТО); - ВидГСМ. . .
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр.
Jin X 06.09.2026
Скрипты Tampermonkey для CyberForum, ChatGPT, Claude и пр. Работая с форумом и нейросетями в браузере часто хочется что-то подкорректировать или добавить какого-то функционала. Ниже прикреплён. . .
Программа опроса у.з. расходомера SLS-720F
Argus19 02.09.2026
Программа опроса у. з. расходомера SLS-720F Программа опрашивает один раз в минуту три ультразвуковых расходомера SLS-720F через интерфейс RS-485 по протоколу Modbus RTU. Опрашиваются регистры. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru