|
LoadString для конкретного языка
|
|
| zamabuvaraeu | Дата: Суббота, 09.05.2026, 16:43 | Сообщение # 1 |
|
Полковник
Группа: Друзья
Сообщений: 212
Статус: Offline
| Стандартная функция LoadString загружает строку из ресурсов, однако она не может загрузить строку для языка, отличного по умолчанию. Устраняем это недоразумение LoadStringEx.bas: Код #include once "windows.bi"
Function LoadStringExW Alias "LoadStringExW"( _ ByVal hInst As HINSTANCE, _ ByVal uId As UINT, _ ByVal lpBuffer As LPWSTR, _ ByVal cchBufferMax As Long, _ ByVal langId As UINT _ ) As Long
' Convert the string ID into a bundle number Dim ResId As UInteger = CUInt(uId) \ 16 + 1 Dim hRes As HRSRC = FindResourceEx( _ hInst, _ RT_STRING, _ MAKEINTRESOURCE(ResId), _ langId _ )
If hRes Then Dim hglob As HGLOBAL = LoadResource(hInst, hRes)
If hglob Then
Dim pData As Any Ptr = LockResource(hglob)
If pData Then ' Now walk the string table
Dim pwsz As LPWSTR = Cast(LPWSTR, pData)
Dim pLength As UShort Ptr = Cast(UShort Ptr, pwsz) Dim Length As UShort = *pLength pwsz = @pwsz[1]
Dim Index As Integer = CInt(uId) And 15 For i As Integer = 1 To Index pwsz = @pwsz[CInt(Length)]
pLength = Cast(UShort Ptr, pwsz) Length = *pLength
pwsz = @pwsz[1] Next
Dim LenMin As Integer = min(CInt(Length), CInt(cchBufferMax))
If LenMin Then CopyMemory(lpBuffer, pwsz, LenMin * SizeOf(WCHAR)) End If
lpBuffer [LenMin]= 0
Return LenMin End If End If End If
lpBuffer[0] = 0
Return 0
End Function
Function LoadStringExA Alias "LoadStringExA"( _ ByVal hInst As HINSTANCE, _ ByVal uId As UINT, _ ByVal lpBuffer As LPSTR, _ ByVal cchBufferMax As Long, _ ByVal langId As UINT _ ) As Long
Dim pBuf As LPWSTR = Allocate((cchBufferMax + 1) * SizeOf(WCHAR)) If pBuf = NULL Then lpBuffer[0] = 0 Return 0 End If
Dim resLength As Long = LoadStringExW( _ hInst, _ uId, _ pBuf, _ cchBufferMax, _ langId _ )
If resLength Then WideCharToMultiByte( _ CP_ACP, _ 0, _ pBuf, _ resLength, _ lpBuffer, _ cchBufferMax, _ NULL, _ NULL _ ) End If
Deallocate(pBuf)
lpBuffer [resLength]= 0
Return resLength
End Function
Заголовочный файл LoadStringEx.bi: Код #ifndef LOADSTRINGEX_BI #define LOADSTRINGEX_BI
#include once "windows.bi"
Declare Function LoadStringExW( _ ByVal hInst As HINSTANCE, _ ByVal uId As UINT, _ ByVal lpBuffer As LPWSTR, _ ByVal cchBufferMax As Long, _ ByVal langId As UINT _ ) As Long
Declare Function LoadStringExA( _ ByVal hInst As HINSTANCE, _ ByVal uId As UINT, _ ByVal lpBuffer As LPSTR, _ ByVal cchBufferMax As Long, _ ByVal langId As UINT _ ) As Long
#ifdef UNICODE Declare Function LoadStringEx Alias "LoadStringExW"( _ ByVal hInst As HINSTANCE, _ ByVal uId As UINT, _ ByVal lpBuffer As LPWSTR, _ ByVal cchBufferMax As Long, _ ByVal langId As UINT _ ) As Long #else Declare Function LoadStringEx Alias "LoadStringExA"( _ ByVal hInst As HINSTANCE, _ ByVal uId As UINT, _ ByVal lpBuffer As LPSTR, _ ByVal cchBufferMax As Long, _ ByVal langId As UINT _ ) As Long #endif
#endif
Создадим файл ресурсов, где будут две таблицы строк для русского и английского языка:Код #include "resources.rh"
LANGUAGE LANG_ENGLISH, SUBLANG_DEFAULT
STRINGTABLE BEGIN IDS_MESSAGE1 "Done" IDS_MESSAGE2 "Caption" END
LANGUAGE LANG_RUSSIAN, SUBLANG_DEFAULT
STRINGTABLE BEGIN IDS_MESSAGE1 "Готово" IDS_MESSAGE2 "Заголовок" END
Заголовочный файл ресурсов resources.rh: Код #define IDS_MESSAGE1 16 #define IDS_MESSAGE2 17
Использование:
Код #include once "resources.rh" #include once "LoadStringEx.bi"
' конструируем язык самостоятельно
Dim lngId As Long = MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT)
Dim buf1(63) As TCHAR = Any Dim StringLength1 As Long = LoadStringEx( _ GetModuleHandle(NULL), _ IDS_MESSAGE1, _ @buf1(0), _ 63, _ lngId _ )
Dim buf2(63) As TCHAR = Any Dim StringLength2 As Long = LoadStringEx( _ GetModuleHandle(NULL), _ IDS_MESSAGE2, _ @buf2(0), _ 63, _ lngId _ )
MessageBox( _ hWin, _ @buf1(0), _ @buf2(0), _ MB_OK Or MB_ICONINFORMATION _ )
Сообщение отредактировал zamabuvaraeu - Суббота, 09.05.2026, 16:44 |
| |
|
|
| DarkDemon | Дата: Суббота, 09.05.2026, 23:23 | Сообщение # 2 |
|
Генерал-майор
Группа: Друзья
Сообщений: 333
Статус: Offline
| Как понимаю что-то полезное для локализации. А можно сразу архив с батником сборки через FBC? Хотел глянуть, но уже забыл как с ресурсами собирать. Ну и для потомков лучше версию компиля всегда указывать.
|
| |
|
|
| zamabuvaraeu | Дата: Воскресенье, 10.05.2026, 21:11 | Сообщение # 3 |
|
Полковник
Группа: Друзья
Сообщений: 212
Статус: Offline
| Компилятор последний 1.10.1 Обычная сборка, ничего примечательного: make_bloatware.cmd Сборка без рантайма: make_barebone.cmd — обрати внимание на размер, как много всякой лишней ерунды удалено, которую хочет вставить компилятор. Только поправим пути к компилятору в первых строках файлов.
В ресурсах три таблицы строк: для русского, английского и французского языков (переводил промтом, наверняка ошибки есть)
(для 32 бит не делал)
|
| |
|
|
| DarkDemon | Дата: Понедельник, 11.05.2026, 05:55 | Сообщение # 4 |
|
Генерал-майор
Группа: Друзья
Сообщений: 333
Статус: Offline
| Ну да твой файл 7 кб, а дефолтный - 27,5 кб. Фактически 3 / 4 - чего-то он туда напихал. Сорц технологичный, BAT-ник тоже наворочен дай боже, хотя +/- в общих чертах понятно.
Не очень понятно что там делает манифест и некий mini-runtime с какими-то IFDEF под linux, ведь код вроде под WinAPI. Французский текст у меня отображается английскими буквами, хотя по факту в файле ресурса там юникодовые символы французские. Походу в винде надо ставить французский.
|
| |
|
|
| zamabuvaraeu | Дата: Понедельник, 11.05.2026, 07:18 | Сообщение # 5 |
|
Полковник
Группа: Друзья
Сообщений: 212
Статус: Offline
| Манифест нужен чтобы стили XP показывать и корректно работать на мониторах с высоким DPI. Так как это диалоговая панель, а не простое окно, всю работу с автоматическим масштабированием берёт на себя менеджер диалоговых окон. (В манифесте можно ещё другие штуки указывать, например, использовать COM без регистрации в реестре) mini-runtime нужен чтобы не вставлять в программу стартовый код из си‐библиотек. В этой программе нет обращения к рантайму, поэтому си‐рантайм можно выкинуть и написать стартовый код самостоятельно. Линукс там потому что файл просто скопировал из другого проекта, но я не уверен в корректности этого кода. Ну понятно что 20 килобайт в 2026 — это копейки, современные игры весят 100 гигабайт. Я предпочитаю не включать в программу даже эти 20 килобайт мёртвого кода.
|
| |
|
|
| haav | Дата: Понедельник, 11.05.2026, 08:20 | Сообщение # 6 |
 Генералиссимус
Группа: Администраторы
Сообщений: 1475
Статус: Offline
| Проект получился аксишный , экспортируются API для ASCII , соответственно французские символы отображаются неправильно. Надо указать #define UNICODE. Хотя если оставить так , то у французов должно все отображаться правильно.
Вы сохраняете власть над людьми покуда оставляете им что-то…Отберите у человека все, и этот человек уже будет неподвластен вам…
|
| |
|
|
| DarkDemon | Дата: Понедельник, 11.05.2026, 10:46 | Сообщение # 7 |
|
Генерал-майор
Группа: Друзья
Сообщений: 333
Статус: Offline
| Цитата haav (  ) Надо указать #define UNICODE. Точняк! Теперь как надо.
|
| |
|
|
| zamabuvaraeu | Дата: Понедельник, 11.05.2026, 20:23 | Сообщение # 8 |
|
Полковник
Группа: Друзья
Сообщений: 212
Статус: Offline
| Диалоги тоже можно держать в ресурсах на нескольких языках и загружать нужный по мере необходимости: Код Private Function LoadResDialog( _ ByVal hInst As HINSTANCE, _ ByVal ResId As UINT, _ ByVal langId As UINT _ ) As DLGTEMPLATE Ptr
Dim hRes As HRSRC = FindResourceEx( _ hInst, _ RT_DIALOG, _ MAKEINTRESOURCE(ResId), _ langId _ )
If hRes Then Dim hglob As HGLOBAL = LoadResource(hInst, hRes)
If hglob Then
Dim pData As DLGTEMPLATE Ptr = LockResource(hglob)
Return pData End If End If
Return NULL
End Function
Использование (на свой страх и риск): Код Dim hInst As HMODULE = GetModuleHandle(NULL)
' Диалог для конкретного языка Dim templ As DLGTEMPLATE Ptr = LoadResDialog( _ hInst, _ IDD_DLG_MAIN, _ MAKELANGID(LANG_ENGLISH, SUBLANG_DEFAULT) _ ) If templ = NULL Then End(1) End If
Dim DialogBoxParamResult As INT_PTR = DialogBoxIndirectParam( _ hInst, _ templ, _ NULL, _ @MainFormDialogProc, _ параметр _ ) If DialogBoxParamResult = -1 Then End(1) End If
Сообщение отредактировал zamabuvaraeu - Понедельник, 11.05.2026, 20:24 |
| |
|
|
| DarkDemon | Дата: Вторник, 12.05.2026, 20:01 | Сообщение # 9 |
|
Генерал-майор
Группа: Друзья
Сообщений: 333
Статус: Offline
| zamabuvaraeu, а ты пробовал код большего объёма? Т.е. компиль всегда пихает 3 / 4 лишнего, или это он пихает какую-то базу, а дальше уже идёт код без этих надбавок?
Тут парадокс в чём, понятно что это самый правильный и экономичный путь для создания компактных прог под винду, но по факту им пользуются два динозавра из 90-х. Причин много, одна из причин что нормальной интегрированной среды к FB нет. Да как бы FbEdit позволяет всё это делать, даже какой-то интерфейс создавать, но оно выглядит как костыль. Вторая причина это необходимость дробиться ещё на файл ресурса. Не всегда это удобно и приятно. И не всегда он в принципе нужен, хотя в него можно много чего запихать. Третья причина - развитие SSD, которые не дают современным программистам понять боль загрузки их толстого ПО с винчестера. По чисто экономич. причинам обычные харды будут ещё долго на рынке, но люди это уже давно не учитывают. Четвёртая причина: как бы это голый WinAPI, я не против когда идёт взаимодействие с какими-либо нутрами ОС, доступ, например, к хукам или MME, но для интерфейса руками это требует кучи времени на MSDN и не меньшей кучи уже готовых компетенций. Плюс по факту: чтобы это делать быстро нужно какое-то нормальное руководство. Потому все эти вонючие NET фреймворки, а также 4GL языки с их WYSIWYG и стали так популярны. Ну и последняя причина, это порог вхождения. Я например не умею выпиливать "рантайм"(т.е. отделять конструкции ЯП от того, что к ним не относится), как и большинство программистов на FB. Мне проще даже перейти на голый ASM и писать те же копеечные программы в пару килобайт, т.к. там заведомо ясно что в бинарник ничего лишнего не идёт и вот там подход с ресурсами - это прям в разы более востребованная фича, потому что по другому проще - никак. Но опять же 7 кб и 27, условно 2 кластера и 7. Для запуска с дискеты наверное - надо, но дискетами уже лет 20 люди не пользуются, кроме любителей ретро. Это кстати было клёвое время, когда реально на дискету пытались умещать кучу ПО...
Тут дело то не только в локализации, то что ты расколупал это и показал нам - конечно круто. А тем более ещё и как собирать без рантаймов. Но СЛОЖНО. Я всегда за то чтобы самому понимать каждую фичу которую используешь, т.е. не втупую у кого-либо взять, ну и вышеописанное по поводу недостаточной автоматизации этого процесса, тут достаточно взять условный VB и мы поймём "относительность".
|
| |
|
|
| zamabuvaraeu | Дата: Среда, 13.05.2026, 13:58 | Сообщение # 10 |
|
Полковник
Группа: Друзья
Сообщений: 212
Статус: Offline
| Цитата Т.е. компиль всегда пихает 3 / 4 лишнего, или это он пихает какую-то базу, а дальше уже идёт код без этих надбавок?
Компилятор берёт не все функции, а только то, что используется. Но только функциями раздувание не ограничивается, есть ещё Shared переменные, статические строки, таблицы релокаций, версия компилятора. Задача не в том, чтобы это удалять. Задача в том, чтобы это добавлять в список линковщика. И вот что он добавляет:
Си‐библиотеки: crt2.o 48 кбайт crtbegin.o 1 кбайт crtend.o 1 кбайт
Библиотеки фрибесика: fbrt0.o 1 кбайт libfb.a 560 кбайт
Графика: libfbgfx.a 233 кбайт
Многопоточные: libfbgfxmt.a 229 кбайт libfbmt.a 579 кбайт
Библиотеки GCC: libgcc.a 8 мегабайт libgcc_eh.a 150 кбайт libmingw32.a 424 кбайт libmingwex.a 2,69 мегабайт libmoldname.a 1 килобайт
Хотя бы одна Shared или Common переменная потянет за собой секцию .bss. Массив тянет за собой создание дескриптора массива, будет много избыточного кода, поэтому массивы запихиваем внутрь структуры. Строки String небезопасны: в рантайме нет проверки на успешное выделение памяти для строки, программа может показать крах, невозможно написать надёжную программу со строками. И даже если бы она там была… То кто делает эти проверки? В файле на 1000 строк исходного кода тип String может использоваться сотни раз.
Цитата Вторая причина это необходимость дробиться ещё на файл ресурса. Не всегда это удобно и приятно. А как делать? Одна программа — один файл? Годится только для HelloWorld. В одном файле даже на тысячу строк кода уже сложно ориентироваться. Интерфейс должен быть отделён от логики, логика не должна зависеть от интерфейса, поэтому его выносят куда‐нибудь в ресурсы. В 2026 у любой программы должен быть манифест в ресурсах, чтобы на современном мониторе с высоким DPI глаза радовались, а не вытекали из орбит. Посмотрим на игры: никто там не рисует все эти кубы, сферы и треугольники, не натягивают на них текстуры, вместо этого готовые модельки загружают из файлов, по сути те же ресурсы. Также и с GUI: диалоги в ресурсах это уже скомпилированные модельки окошек.
А без ресурсов что будет: писать руками сотни CreateWindowEx для GUI. Гораздо проще нарисовать диалог в редакторе ресурсов мышкой, и потом в коде один раз сделать DialogBoxParam, возложив задачу отрисовки на менеджер диалоговых окон. Можно без редактора править файл ресурсов самостоятельно, благо формат простой и топорный как пять бурлей. Единственная сложность — это вычислить положение контролов чтобы GUI выглядел профессионально.
На фрибесиковом рантайме GUI не создать. В любом случае придётся использовать какую‐то библиотеку.
|
| |
|
|
| DarkDemon | Дата: Четверг, 14.05.2026, 04:40 | Сообщение # 11 |
|
Генерал-майор
Группа: Друзья
Сообщений: 333
Статус: Offline
| Цитата zamabuvaraeu (  ) Массив тянет за собой создание дескриптора массива, будет много избыточного кода, поэтому массивы запихиваем внутрь структуры.
Массив в структуре и просто массив это не одно и то же. Ни по смыслу, ни по реализации. Это проблема не кодера, а конкретной реализации BASIC.
Цитата zamabuvaraeu (  ) Строки String небезопасны: в рантайме нет проверки на успешное выделение памяти для строки, программа может показать крах, невозможно написать надёжную программу со строками.
Тогда это проблема рантайма и в целом FB. Безопасность к "краху" проги я бы тоже относить не стал, режим защищённый, программы друг от друга изолированы (если конечно другой софт не лезет в наш процесс с помощью OpenProcess и WriteProcessMemory).
Сейчас очень много говорят про безопасность, но никто не говорит что т.н. безопасные указатели и прочее это по сути подмена понятий, т.е. херня. Крах софта не влияет на безопасность, винда завершает работу нормально, а вот кривая работа механизмов софта - именно она влияет.
Т.к. если на указателе не крешнулось(не полезло в защищённый диапазон памяти), это не значит что прога не может начать делать то, что нужно злоумышленнику, чего он и добивался. Безопасность это когда твоя прога формализована, и делает только то, что ей предначертано. (Пр. Преображенский оперирует только в операционной, а не в парадной и не в детской )
И это всё не касается прог на которых не оказано внешнее влияние или прог без использования сети и прочих коммуникаций. Это не проблема строк. Проверка на выделение - это абсурдная мера(оно по идее опционально должно быть). Т.к. если памяти нет, то и программа никак не отработает. Да есть там все эти виртуальные механизмы и прочее, но большинство прог работают строго с тем, что могут оттяпать у системы. Т.е. это вопросы к ненасытности пользователя, а если баг имеет место быть, то так даже проще понять что он есть.
Цитата zamabuvaraeu (  ) А как делать? Одна программа — один файл? Годится только для HelloWorld.
Не согласен, что только для сосунковых. Если мне, прогеру ниже середняка было доступно(когда форма ещё была) вполне осознанно манипулировать кодом в 3,5k строк, то другой человек по сути сможет и больше причём намного, до 5k точно... Мне нравится такой подход при прототипировании, когда софт ещё не готов и нужно раскидать общую логику "сверху вниз" просто заглушками. А так без модульности в любом случае - никуда.
И по модулям никогда не поздно раскидать. Дело не в этом. У res свой отдельный синтаксис и его надо изучать. Но претензия не к этому, а к автоматизации, это тянет за собой обслуживание в виде WinAPI, ручное перебивание ID-шников, ручной по сути контроль. Это тебе не обвёл прямоугольник и "выросла форма" c кнопками, где сразу и генерится код и ресурс и всё само связывается, считаю что так и должно быть в нормальной BASIC среде, чего пока не имеем. А надо это всё колупать и шаг влево\вправо, потребуется чуть больше чем в редакторе FBEdit - начнутся сложности с документацией.
Файлы ресурсов они же не только для GUI, по сути это механизм вложения любых файлов. Т.е вопрос использовать их или не использовать - это часть архитектуры софта. Раньше их использовали для Portable прог, чтобы не таскать рядом с exe директории с data файлами. Это неудобно прогеру, но удобно юзеру. На ASM-е же оно существенно упрощало(парадоксально, что на BASIC-е оно усложняет) создание GUI.
Цитата В 2026 у любой программы должен быть манифест в ресурсах Это всё понятно и разговоры про кривое отображение были(так понимаю это на 2k,4k мониках с увеличением масштабирования в винде), хоть лично такие артефакты и не наблюдал, но как бы верю, что надо. Понимаешь, BASIC кодер вообще этого видеть не должен, компиль должен сам эти "пилюли" вклёвывать в бинарник. А выходит что в папке болтается ещё и это...
Цитата zamabuvaraeu (  ) А без ресурсов что будет: писать руками сотни CreateWindowEx для GUI.
Без ресурсов - самое простое это Window9 + PureForm. Но это не 7 килобайт. Это плата за "проще". Для меня важно другое, скорость загрузки софта. Она не всегда зависит от объёма кода.
Цитата На фрибесиковом рантайме GUI не создать.
Всю жизнь на примитивах делаю, нигде не жмёт вроде. Оконный редко использую(чаще для настроек). Например так: https://docs.google.com/documen....tab=t.0
Добавлено (14.05.2026, 04:46) ---------------------------------------------
Цитата zamabuvaraeu (  ) Также и с GUI: диалоги в ресурсах это уже скомпилированные модельки окошек.
А без ресурсов что будет: писать руками сотни CreateWindowEx для GUI. Кстати, чисто теоретически разницы в объёме кода(бинарника) между этими вариантами быть не должно.
Сообщение отредактировал DarkDemon - Четверг, 14.05.2026, 04:46 |
| |
|
|
| zamabuvaraeu | Дата: Суббота, 16.05.2026, 15:48 | Сообщение # 12 |
|
Полковник
Группа: Друзья
Сообщений: 212
Статус: Offline
| Цитата Кстати, чисто теоретически разницы в объёме кода(бинарника) между этими вариантами быть не должно.
Разница будет. Вручную создавать окно — это регистрация класса, создание и расстановка дочерних окон, навигация по стрелочкам и клавишам TAB, это вручную всё прописывать надо, меню, горячие клавиши… Диалоговое окно — оно уже скомпилировано, тут окно одним вызовом DialogBoxParam. Менеджер диалоговых окон берёт на себя всю грязную работу. (диалоговые окна — это не панацея, они предназначены только для окон которые не изменяют размер)
Цитата Это всё понятно и разговоры про кривое отображение были(так понимаю это на 2k,4k мониках с увеличением масштабирования в винде)
Добавлено (16.05.2026, 15:50) --------------------------------------------- Вот пример масштабирования без мыла, текст чёткий, не расплывчатый на всех масштабах https://rutube.ru/video....GJBzjNQДобавлено (16.05.2026, 16:47) --------------------------------------------- К сожалению, многие программисты небрежно относятся к проверке указателей, а иногда сознательно не проверяют, удалось ли выделить память или нет. Их логика следующая:
Цитата Если функция Allocate не смогла выделить память, то вряд ли моя программа продолжит функционировать должным образом. Скорее всего, памяти будет не хватать и для других операций, поэтому можно вообще не заморачиваться об ошибках выделения памяти. В результате программа упадёт, что меня устраивает. Раз нет памяти, то и нечего мучаться
И это неправда. Вот почему.
1. Память — это динамический ресурс. Сейчас нет — это не значит что памяти нет навсегда. Память мочет через секунду появиться: пользователь закроет хром, ворд, ексель — и память появится. 2. Отсутствие памяти — это штатная ситуация, такая же как и «Не могу создать файл». Это не повод для падений. 3. А теперь представим, что пользователь проделал многочасовую работу в Microsoft Word, копирует большую картинку и пытается вставить… И тут программа берёт и падает, вместо того, чтобы штатно обработать нехватку памяти. Замечательно? Вся многочасовая работа потеряна. При правильной обработке ошибок мы просто выйдем с ошибкой из функции, показав пользователю понятное сообщение и дав ему сохранить имеющуюся работу. 4. Отсутствие проверки на NULL — это уязвимость типа «отказ в обслуживании». Мы не можем говорить о надёжности программы, которую можно уничтожить дудосом. Надёжный сервер не должен падать, он просто временно не принимает новые соединения. 5. Такое поведение в принципе недопустимо для библиотек. 6. Из-за ошибки программиста программа просить выделить ОЧЕНЬ большой буфер, которого нет. Allocate вернёт 0. Что программа сделает? Упадёт, а могла бы штатно обработать эту ситуацию.
Сообщение отредактировал zamabuvaraeu - Суббота, 16.05.2026, 15:54 |
| |
|
|
| DarkDemon | Дата: Суббота, 16.05.2026, 17:54 | Сообщение # 13 |
|
Генерал-майор
Группа: Друзья
Сообщений: 333
Статус: Offline
| zamabuvaraeu, Ты не думай, не топлю за то чтобы программы падали. Креш для меня как индикатор дебага. И указатели(и доступн. память) по хорошему НАДО проверять, если софт действительно серьёзный и должен держать многочасовые сеансы работы с ценными данными.
Но 6 - тут есть нюансы. Одно дело прога, для которой работа(операции) не являются зависимыми и стекообразующими. Если софт не редактор со свободным редактированием и требует линейной отработки - тут всё сложнее. Т.е. прям сильно сложнее, я про то, что, наверное, правильно в таком случае сделать деинициализации, выдать MessageBox - что нет памяти и вырубиться. Просто на стадии проектировки всё это втыкать, когда желательно видеть (на 100% наличия памяти) как всё это работает. Т.е. всё сначала проверить, а потом уже втыкать эти проверки.
Ещё нужно иметь в виду что иниц. и деиниц - может быть долго. Например, FBSound инициализируется и выгружается по секунде.
А так да, но то что имеем сейчас: Gimp 2.8 - при отжоре больше 1,6 Гб - падает, браузер Vivaldi на движке chromium при наличии кучи свободных гигабайт оперативы - намертво зависает(теряя последнюю вкладку). Davinci resolve - падает каждые 5-10 минут.
Такие сейчас разрабы. Но мы то лучше?
|
| |
|
|
| zamabuvaraeu | Дата: Суббота, 16.05.2026, 18:23 | Сообщение # 14 |
|
Полковник
Группа: Друзья
Сообщений: 212
Статус: Offline
| Цитата Понимаешь, BASIC кодер вообще этого видеть не должен, компиль должен сам эти "пилюли" вклёвывать в бинарник. Пытаться спрятать кишки не выйдет. Компилятор не умеет определять на какой системе будет запущена программа. На Win95 нет функций и библиотек, которые есть в WinXP. Некоторые контролы (Всплывающие подсказки с картинками и значками) работают только при включённых визуальных стилях. Ещё и потому что начнут говорить «Бесик это несерьёзно, хотите писать на профессиональном инструменте, где можно контролировать всё самостоятельно, — берите Си».
|
| |
|
|
| DarkDemon | Дата: Воскресенье, 17.05.2026, 00:47 | Сообщение # 15 |
|
Генерал-майор
Группа: Друзья
Сообщений: 333
Статус: Offline
| Цитата zamabuvaraeu (  ) На Win95 нет функций и библиотек, которые есть в WinXP. Это и является первоочередной проблемой. 95\98 выбирают только хардкорщики, любители острых ощущений. Для этого нужна высокая квали. Большинство, включая меня могли бы просто взять компилятор старой версии FB, это позволяет без особых проблем что-то писать. Совместимость как вперёд так и назад - это очень трудно. Это сейчас можно потестить, раньше то что написано было на старых - как правило имело проблемы на новых, например банальный текс. ред Bred2 зачастую имеет проблемы на Win10.
Думаешь кто-то сейчас будет углубляться в историю и делать компиль под Win95\98 ? Это настолько старые системы, что под них нужно делать отдельный компиль. Задача сложна сама по себе и нюансов много.
На мой взгляд совместимость с 2000\XP - это ещё приемлемо сейчас, а вот с 95\98 - это будет сильно ограничивать, тут в любом случае сверху вниз просто так не портируешь, потребуется половину софта переписывать.
Про Win98, которая не падает(оригинал падал), не дерёт диск и имеет самый продуманный и минималистичный интерфейс на планете - конечно можно только помечтать. Хорошо что хоть кто-то помнит эти системы. Хотя большинство - забыли и их не коробит унылый интерфейс Android-а с нулевой эргономикой...
Цитата Компилятор не умеет определять на какой системе будет запущена программа. Компилятор мог бы это делать. Начиная с Win 2000 - без особых проблем. Но этого не требуется, хватило бы и опции target. Задать руками никогда не проблема. Т.е. по поводу кишок: целевой EXE не обязан быть на все системы. Делать отдельный launcher, который определяет ОС и запускает нужный EXE - нормальная практика.
У подавляющего большинства прогеров в одном файле - это не получится, т.к. объёмы тестирования воистину огромны (ME, XP, XPx64, VISTA, VISTAx64, 7, 7x64, 8.1, 8.1x64, 10, 10x64, и теперь ещё 11x64). Нужно иметь 12(!!!) тестовых компов у себя.
Это пишу для тех кто возможно захочет написать компиль. Для FB это не актуально, там разрабы чем-то другим заняты.
Сообщение отредактировал DarkDemon - Воскресенье, 17.05.2026, 00:57 |
| |
|
|
|