Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.72/29: Рейтинг темы: голосов - 29, средняя оценка - 4.72
2 / 2 / 0
Регистрация: 26.03.2020
Сообщений: 41

VB6. Как обойти ошибку Out of memory?

08.04.2020, 22:26. Показов 6304. Ответов 27

Студворк — интернет-сервис помощи студентам
Игры, программы, фильмы ..... имеют большие файлы разного формата. И я хочу, чтобы мой *.exe файл (мой проект) был большим. Я хочу в нём хранить и звуковые файлы, и рисунки, и всё что необходимо моему проекту для качественной работу в компьютере у пользователя. Если оперативной памяти мало, то пусть мой проект зависает как большие игры на слабых компьютерах. Почему всем можно, а мне нельзя? Почему ты запрещаешь мне?

Вот эти слова я много раз повторял Visual-у Basic-у 6.0, но он упёрся при компиляции *.exe файла и говорит мне:
Название: 08.07.jpg
Просмотров: 100

Размер: 15.2 Кб

Мне не удалось убедить то, что мне так нравится. Уважаемые программисты, может у Вас получится? Ведь на другой язык программирования я переходить не хочу.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.04.2020, 22:26
Ответы с готовыми решениями:

Помогите, пожалуйста, обойти проблему: Out of memory
Помогите, пожалуйста, обойти проблему: = geotiffread('srtm_49_01.tif'); = geotiffread('srtm_49_02.tif'); ...

В моей программе на VB6 победить memory leak!
Имею такой bas модуль : Attribute VB_Name = "Proc" Option Explicit Dim y As Byte Const TH32CS_SNAPHEAPLIST = &H1 ...

Как обойти ошибку?
Может кто знает как обойти ошибку при вставке более 6000 записей? и в чем природа ошибки?

27
sleep
 Аватар для I can
4927 / 4577 / 840
Регистрация: 13.04.2015
Сообщений: 9,730
08.04.2020, 22:38
Цитата Сообщение от Anti_All Посмотреть сообщение
И я хочу, чтобы мой *.exe файл (мой проект) был большим.
Я уже у Вас кажется спрашивал, но почему бы не сделать человеческий инсталляционный файл, и не морочить голову прежде всего себе ?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38169 / 21104 / 4307
Регистрация: 12.02.2012
Сообщений: 34,693
Записей в блоге: 14
09.04.2020, 07:54
Anti_All, вопрос несерьезен. Это то же самое, что спросить врача на форуме: почему у меня нога болит? Может быть много причин. Без характеристик проекта вам никто не поможет.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
09.04.2020, 10:23
Цитата Сообщение от Anti_All Посмотреть сообщение
Мне не удалось убедить то, что мне так нравится. Уважаемые программисты, может у Вас получится? Ведь на другой язык программирования я переходить не хочу.
Нужно сначала понять что вызывает данную ошибку. Для этого нужен либо проект либо посмотреть какой файл не удается скомпилировать. В архиве утилита, которая показывает лог компилятора, в ней можно узнать на каком файле фейлится компиляция.

Цитата Сообщение от Anti_All Посмотреть сообщение
Игры, программы, фильмы ..... имеют большие файлы разного формата. И я хочу, чтобы мой *.exe файл (мой проект) был большим. Я хочу в нём хранить и звуковые файлы, и рисунки, и всё что необходимо моему проекту для качественной работу в компьютере у пользователя. Если оперативной памяти мало, то пусть мой проект зависает как большие игры на слабых компьютерах. Почему всем можно, а мне нельзя? Почему ты запрещаешь мне?
Вообще-то подавляющее большинство программ как раз-таки используют кучу библиотек и ресурсы хранят во внешних файлах. Хранить много ресурсов в EXE - не очень хорошо, при загрузке образа весь файл отображается в память и соответственно это все занимает память и памяти для приложения становится меньше. Если нужно хранить ресурсы в EXE то правильней прикрепить их в "хвосте", тогда файл не будет занимать всю память и так делают большинство инсталляционных пакетов.
Вложения
Тип файла: zip HookC2.zip (10.2 Кб, 6 просмотров)
2
2 / 2 / 0
Регистрация: 26.03.2020
Сообщений: 41
09.04.2020, 12:32  [ТС]
Цитата Сообщение от Catstail Посмотреть сообщение
Это то же самое, что спросить врача на форуме: почему у меня нога болит?
Уважаемый Catstail (в хорошем смысле этого слова), задам вопрос как врачу. Почему я кушая, кушаю, кушаю всё подряд и у меня живот болит?

Цитата Сообщение от The trick Посмотреть сообщение
Нужно сначала понять что вызывает данную ошибку
Уважаемый The trick, ДРУГ (в хорошем смысле этого слова).

Цитата Сообщение от Anti_All Посмотреть сообщение
Я хочу в нём хранить и звуковые файлы, и рисунки, и всё
Причина данной ошибки это куча файлов в проекте.

Цитата Сообщение от The trick Посмотреть сообщение
много ресурсов в EXE - не очень хорошо
Тогда как создать много файлов, вокруг *.exe файла (проекта), типа базы данных, но так чтобы эти файлы мог прочитать только мой проект. Например играет музыка, а этого файла нет нигде.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38169 / 21104 / 4307
Регистрация: 12.02.2012
Сообщений: 34,693
Записей в блоге: 14
09.04.2020, 12:44
Anti_All, непонятен Ваш пафос... Не получается? Решайте проблему. Хотите совета? Представьте исходные данные.

В exe-файле можно хранить что угодно и в довольно больших объемах. Технология примерно такая. Собираете необходимые данные в двоичный файл (какую-нибудь структуру соорудите для него). Потом приливаете эти данные к самому экзешнику (это вполне допустимо). Когда экзешник запускается, он может открыть сам себя на чтение и прочитать из своего хвоста любые данные. Я это неоднократно делал. Примерно так.
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
09.04.2020, 14:14
Цитата Сообщение от Anti_All Посмотреть сообщение
Я хочу в нём хранить и звуковые файлы, и рисунки,
Я два вопроса задам:
1 Каким образом вы пытаетесь это сделать?
2 О каких объемах (примерно) идет речь?
0
2 / 2 / 0
Регистрация: 26.03.2020
Сообщений: 41
09.04.2020, 14:28  [ТС]
Catstail, я не совсем понимаю смысл слова в "хвосте". Это какой-то отдельный файл? Или он находится в *.exe файле, но при загрузке проекта остаётся ждать пока к нему не обратится проект, тем самым не загружая память при загрузке проекта.

Добавлено через 10 минут
Цитата Сообщение от Pro_grammer Посмотреть сообщение
Каким образом вы пытаетесь это сделать?
Pro_grammer, так как у меня нету данного ответа на Ваш первый вопрос, я процитирую слова Catstail:
Цитата Сообщение от Catstail Посмотреть сообщение
Технология примерно такая. Собираете необходимые данные в двоичный файл (какую-нибудь структуру соорудите для него). Потом приливаете эти данные к самому экзешнику (это вполне допустимо). Когда экзешник запускается, он может открыть сам себя на чтение и прочитать из своего хвоста любые данные.
Возможно, если Catstail поможет мне, именно таким образом я попытаюсь это сделать

Добавлено через 1 минуту
Цитата Сообщение от Pro_grammer Посмотреть сообщение
О каких объемах (примерно) идет речь?
Ну не больше 1 ГБ я думаю. Пока неизвестно
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
09.04.2020, 14:56
Цитата Сообщение от Anti_All Посмотреть сообщение
Тогда как создать много файлов, вокруг *.exe файла (проекта), типа базы данных, но так чтобы эти файлы мог прочитать только мой проект. Например играет музыка, а этого файла нет нигде.
Я уже написал:
Цитата Сообщение от The trick Посмотреть сообщение
Если нужно хранить ресурсы в EXE то правильней прикрепить их в "хвосте", тогда файл не будет занимать всю память и так делают большинство инсталляционных пакетов.
Вот у Вас есть EXE файл, просто дописывайте ему в конец ваши данные и все.
1
2 / 2 / 0
Регистрация: 26.03.2020
Сообщений: 41
09.04.2020, 15:46  [ТС]
Если ещё кто-то напишет “хвост”, то я перенесу инсульт.

А можно пример? Чтобы посмотреть и понять, как это работает.

Например, пусть будет 3 файла, ну или 1 файл (просто я ещё не совсем понял, как работать с “хвостом”):
Первый файл *.exe файл (мой проект);
Второй файл (ну или “хвост”), файл который хранит в себе 3 *.jpg файла;
Третий файл (ну или “хвост”), файл который хранит в себе 3 *.wav файла;
Нажимаю на одну кнопку в форме - в Image1.Picture передаётся картинка с файла *.jpg, нажимаю ещё раз, передаётся следующая картинка с файла *.jpg;
Нажимаю на другую кнопку - воспроизводится звук с *.wav файла, нажимаю ещё раз, воспроизводится следующий звук с *.wav файла.
Но данные файлы (ну или “хвосты”) не должны открывать, извлекать ни какой сторонний проект, кроме моего проекта.
0
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
09.04.2020, 17:44
Anti_All, определяете размер EXE (посредством чтения секций файла, анализируя IMAGE_SECTION_HEADER.PointerToRawData и IMAGE_SECTION_HEADER.SizeOfRawData). После самой последней секции пишите свои данные в формате который позволит прочитать их (по имени/индексу). Самый простой вариант - это записать содержимое PropertyBag в котором будут записаны нужные данные. Как минимум это позволит с легкостью читать Persistent-объекты типа StdPicture, Font, данные контролов, любые бинарные данные (в том числе и музыку).
Альтернативно можно вместо PropertyBag записать OLE Compound File Storage, это чуть сложнее, но позволит использовать целую файловую систему внутри файла.

Для отладки используйте внешний файл с данными, а в Релиз-билде уже с помощью внешней утилиты записывайте данные в файл (подойдет простой батник который объединяет файлы в один).
2
sleep
 Аватар для I can
4927 / 4577 / 840
Регистрация: 13.04.2015
Сообщений: 9,730
09.04.2020, 17:50
Цитата Сообщение от Anti_All Посмотреть сообщение
Как обойти ошибку Out of memory?
Может тупо оперативки не хватает ?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38169 / 21104 / 4307
Регистрация: 12.02.2012
Сообщений: 34,693
Записей в блоге: 14
09.04.2020, 18:48
Лучший ответ Сообщение было отмечено Anti_All как решение

Решение

Anti_All, вот простой код. Рабочий. Разбирайся:

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
':::: Программа, которая достает данные из собственного ХВОСТА:
 
Sub Main()
 
    HomeDir$ = App.Path
    myName$ = App.EXEName + ".exe"
    
    fi% = FreeFile
    Open HomeDir$ + "\" + myName$ For Binary Access Read As #fi%
    
    LF& = LOF(fi%) '::: Определяем собственную длину
    
    ttl$ = Space$(4) '::: Буфер для сигнатуры
    
    Seek #fi%, (LF& - 3) '::: становимся на начало сигнатуры
    Get #fi%, , ttl$     '::: читаем сигнатуру
    
    If ttl$ = "TAIL" Then  '::: Сигнатура правильная
    
       Seek #fi%, LF& - 7  '::: станем на поле длины
       Get #fi%, , LL&     '::: получили длину хвоста
       
       Buf$ = Space$(LL&)  '::: буфер для чтения хвоста
       
       Seek #fi%, (LF& - LL& - 7) '::: станем на начало блока данных
       
       Get #fi%, , Buf$    '::: Читаем блок данных
       
       MsgBox Buf$         '::: Любуемся
    
    Else
    
       MsgBox "Блок данных не найден!"
    
    End If
        
    Close #fi%
 
End Sub
Формирователь хвоста:

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
'::: Служебная программа, которая формирует ХВОСТ основному модулю
 
Sub Main()
 
    Cmd$ = Command$
    
    k% = InStr(Cmd$, " ")
    
    If k% = 0 Then
       MsgBox "Вызов addData Куда_добавлять Что_добавлять"
       Exit Sub
    End If
 
    Where$ = Left$(Cmd$, k% - 1)
    From$ = Mid$(Cmd$, k% + 1)
    
    fo% = FreeFile
    Open Where$ For Binary Access Write As #fo%
    
    fi% = FreeFile
    Open From$ For Binary Access Read As #fi%
    
    LFI& = LOF(fi%)
    Buf$ = Space(LFI&)
    Get #fi%, , Buf$
    Close #fi%
    
    LFO& = LOF(fo%)
    Seek #fo%, LFO&
    Put #fo%, , Buf$
    Put #fo%, , LFI& ' длина блока даных
    ttl$ = "TAIL"
    Put #fo%, , ttl$
    Close #fo%
    
    MsgBox "OK"
 
End Sub
Как всем этим пользоваться:

1) Распаковать архив
2) перетранслировать t123
3) выполнить командный файл addData.cmd (Он добавить в ХВОСТ t123 ее собственный исходник)
4) запустить t123.exe и убедиться, что распечатается исходник (без открытия доп. файлов)
Вложения
Тип файла: zip t123.zip (8.2 Кб, 3 просмотров)
2
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
09.04.2020, 19:44
Цитата Сообщение от Catstail Посмотреть сообщение
что распечатается исходник (без открытия доп. файлов)
Текст понятно. Вот это интересно посмотреть без выгрузки файла на диск:
А вот
Цитата Сообщение от Anti_All Посмотреть сообщение
в Image1.Picture передаётся картинка с файла *.jpg, нажимаю ещё раз, передаётся следующая картинка с файла *.jpg;
Ну и звуки до кучи.
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38169 / 21104 / 4307
Регистрация: 12.02.2012
Сообщений: 34,693
Записей в блоге: 14
09.04.2020, 20:11
Мне это не было нужно, поэтому не занимался. В общем, путь указан...
0
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
09.04.2020, 20:41
Цитата Сообщение от Catstail Посмотреть сообщение
В общем, путь указан...
Это распутье, на котором мы встали
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38169 / 21104 / 4307
Регистрация: 12.02.2012
Сообщений: 34,693
Записей в блоге: 14
09.04.2020, 21:00
Лучший ответ Сообщение было отмечено Anti_All как решение

Решение

Ну вот:

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
Sub LoadPic()
 
    HomeDir$ = App.Path
    myName$ = App.EXEName + ".exe"
    
    fi% = FreeFile
    Open HomeDir$ + "\" + myName$ For Binary Access Read As #fi%
    
    LF& = LOF(fi%)         '::: Определяем собственную длину
    
    ttl$ = Space$(4)       '::: Буфер для сигнатуры
    
    Seek #fi%, (LF& - 3)   '::: становимся на начало сигнатуры
    Get #fi%, , ttl$       '::: читаем сигнатуру
    
    If ttl$ = "TAIL" Then  '::: Сигнатура правильная
    
       Seek #fi%, LF& - 7  '::: станем на поле длины
       Get #fi%, , LL&     '::: получили длину хвоста
       
       Buf$ = Space$(LL&)  '::: буфер для чтения хвоста
       
       Seek #fi%, (LF& - LL& - 7) '::: станем на начало блока данных
       
       Get #fi%, , Buf$    '::: Читаем блок данных
       
       Close #fi%
       
       fo% = FreeFile
       Open HomeDir$ + "\$$$.jpg" For Binary Access Write As #fo%
       Put #fo%, , Buf$
       Close #fo%
       
       Form1.Image1.Picture = LoadPicture(HomeDir$ + "\$$$.jpg")
       
       Kill HomeDir$ + "\$$$.jpg"
    
    Else
    
       Close #fi%
    
       MsgBox "Блок данных не найден!"
    
    End If
 
End Sub
В упаковке командный файл, который добавляет картинку jpg в хвост экзешнику. Разберетесь. Если не нравится, что файл создается в текущей директории, никто не мешает создавать его во временной директории системы. Думаю, что The trick подскажет более изящное решение.
Вложения
Тип файла: zip t124.zip (152.0 Кб, 5 просмотров)
1
Модератор
10048 / 3894 / 883
Регистрация: 22.02.2013
Сообщений: 5,847
Записей в блоге: 79
09.04.2020, 21:09
Файлы можно объединить через батник типа
Code
1
copy /b file.001+file.002 file.bin
2
 Аватар для Pro_grammer
6807 / 2839 / 527
Регистрация: 24.04.2011
Сообщений: 5,308
Записей в блоге: 10
09.04.2020, 21:51
Цитата Сообщение от Catstail Посмотреть сообщение
Если не нравится, что файл создается в текущей директории, никто не мешает создавать его во временной директории системы.
В принципе не нравится выгрузка на диск. Теряется смысл всех этих плясок с бубном, имею в виду присоединение файлов в хвост. Гораздо проще и надежней в таком случае создать обычный SFX архив.
Должен же быть способ загрузить прямо из участка памяти изображение в Image? На PureBasic это делается одной командой, значит это возможно с точки зрения системы, просто мы не знаем как?
0
Супер-модератор
Эксперт функциональных языков программированияЭксперт Python
 Аватар для Catstail
38169 / 21104 / 4307
Регистрация: 12.02.2012
Сообщений: 34,693
Записей в блоге: 14
10.04.2020, 10:25
Да, способ должен быть

Добавлено через 1 час 14 минут
The trick, объединить-то - да, но придется еще оглавление создавать...
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
10.04.2020, 10:25
Помогаю со студенческими работами здесь

Как победить ошибку Out of memory?
Добрый день, форумчане! У меня есть ListBox. Если двойным кликом нажать на надпись, должна появится форма. Все работало прекрасно, но...

Как обойти ошибку 207?
Суть проблемы такова: при изменении n=100 на n=1000 компилятор ТП ругается error'ом 207. Как я подозреваю, это происходит из-за того, что...

XMLHttpRequest. как обойти ошибку?
Привет! Подскажите как обойти ошибку. xhr.open('GET', 'https://up.htmlacademy.ru/assets/javascript/demo/8-xhr/data.json'); ...

Как обойти ошибку Warning: file_get_contents?
Доброго времени суток форумчане. Помогите пожалуйста начинающему... Что означает эта ошибка и как её исправить? Ошибка: Warning:...

Как можно обойти эту ошибку ?
Собственно сама ошибка...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
Новые блоги и статьи
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 28.01.2026
Содержание блога SDL3 имеет собственные средства для загрузки и отображения PNG-файлов с альфа-каналом и базовой работы с ними. В этой инструкции используется функция SDL_LoadPNG(), которая. . .
Загрузка PNG с альфа-каналом на SDL3 для Android: с помощью SDL3_image
8Observer8 27.01.2026
Содержание блога SDL3_image - это библиотека для загрузки и работы с изображениями. Эта пошаговая инструкция покажет, как загрузить и вывести на экран смартфона картинку с альфа-каналом, то есть с. . .
влияние грибов на сукцессию
anaschu 26.01.2026
Бифуркационные изменения массы гриба происходят тогда, когда мы уменьшаем массу компоста в 10 раз, а скорость прироста биомассы уменьшаем в три раза. Скорость прироста биомассы может уменьшаться за. . .
Воспроизведение звукового файла с помощью SDL3_mixer при касании экрана Android
8Observer8 26.01.2026
Содержание блога SDL3_mixer - это библиотека я для воспроизведения аудио. В отличие от инструкции по добавлению текста код по проигрыванию звука уже содержится в шаблоне примера. Нужно только. . .
Установка Android SDK, NDK, JDK, CMake и т.д.
8Observer8 25.01.2026
Содержание блога Перейдите по ссылке: https:/ / developer. android. com/ studio и в самом низу страницы кликните по архиву "commandlinetools-win-xxxxxx_latest. zip" Извлеките архив и вы увидите. . .
Вывод текста со шрифтом TTF на Android с помощью библиотеки SDL3_ttf
8Observer8 25.01.2026
Содержание блога Если у вас не установлены Android SDK, NDK, JDK, и т. д. то сделайте это по следующей инструкции: Установка Android SDK, NDK, JDK, CMake и т. д. Сборка примера Скачайте. . .
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Содержание блога Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а. . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru