Чтобы добавлять сообщения и комментарии, .

@mabu:
mabu

Сделал бота как службу виндоуз. Теперь он запускается автоматически без участия пользлователей. Осталось научить его самостоятельно обновляться.
Из‐за этого теперь можно завершать сеанс пользователя удалённого рабочего стола.
Исходники тут github.com

@mabu:
mabu

Обновил Read.Me вебсервера. Теперь стало
понятнее как же всё‐таки его использовать
github.com

@mabu:
mabu

Scope
		Dim hDC As HDC = GetDC(hWin)
		
		ReleaseDC(hWin, hDC)
End Scope

@mabu:
mabu

Игра «Девятка». Уточнил координаты
карт, теперь не выпирают вниз при разворачивании окна. Проект пишу на
голом WinAPI и GDI.

Планы таковы:
* научиться анимировать ходы игроков;
* сетевой режим;
* нарисовать персонажей.

Исходники тут github.com
Всё правильно делаю?

@mabu:
mabu

Выложил исходники своего ирк‐бота github.com
Пока умеет только заходить и выходить, показывать список процессов, использование памяти процессом по его PID, выполнять команды на машине.

@mabu:
mabu

Скомпилировал вебсервер на бейсике под 64 бита, заодно исправил предупреждения компилятора, что в нескольких местах использовал не тот тип данных, например, Integer вместо DWORD или Long.
Операционная система 64‐битная, теперь и сам вебсервер 64‐битный.
Уже работает и обслуживает сайты в релаьном времени.

@mabu:
mabu

По поводу некомпилируемости исходника, если там есть включение заголовочника windows.bi из поста #2863623
Ошибка появляется, если в пути к компилятору есть кириллица.
Очевидный баг компилятора.

@mabu:
mabu

Потыкал вчера в 64‐битный FreeBASIC. Стоит только включить заголовочник windows.bi для винды, то сразу валятся ошибки конпеляции, что в заголовочниках какие‐то двойные определения и прочее.
Но без этого вполне работает, можно пользоваться.
А внутри всё это дело конпелируется в си, потом из си в ассемблер, потом оттуда в объектные файлы, потом уже в исполняемый файл.

@mabu:
mabu

Зарегистрировался на гитхабе и выложил код своего сервера там github.com
Что теперь?

@mabu:
mabu

Компилятор бейсикового кода онлайн tutorialspoint.com

@mabu:
mabu

Процесс хакер выводит показатели моего самописного http‐сервера.

@mabu:
mabu

Реализовал на своём сервере метод CONNECT freebasic.su

@mabu:
mabu

Про меня:
[19:43] Ham62: oh yeah of course the guy to make a FB web server is russian
[19:43] Ham62: russians always do stuff like that for some reason :P
[19:43] Ham62: like that guy who wrote a web server in x86 assembly :P

@mabu:
mabu

Ещё одна статья на моём сайте, теперь про карточную библиотеку cards.dll freebasic.su

@mabu:
mabu

Перевёл свои сайты на сервер, написанный на фрибейсике.

@CaufMAN:
CaufMAN

cast @mabu
Кароч у мну что-то пошло не так. Скомпилированные экзешники перестали работать адекватно. Сборка проходит без ошибок, но экзешник виснет в процессах не выводя ничего в консоль и/или на гуй (при использовании системного API). Такая херня и при сборке вручную, и при сборке из под FbIde. Есть мысли?

@mabu:
mabu

Получил ещё одну статью в коллекцию, на этот раз про отображённые в память файлы freebasic.su

@CaufMAN:
CaufMAN

каст @mabu
а что там в вашем фрибасике из 2д движков свободных модно пользовать под геймдев? Чот просмотр форумов и гуглинг ничего определенного не дали. Какие—то врапперы сомнительной свежести под ирлихт и куча недоделок 3дешных.

@mabu:
mabu

Я тут ещё одну статью написал: кодирование и декодирование в base64 на фрибейсике freebasic.su

@mabu:
mabu

Наконец написал статью по программированию IRC‐ботов на фрибейсике freebasic.su
Попозже сделаю подсветку синтаксиса кода.

@mabu:
mabu

Только вчера написал про IRC‐канал по фрибейсику, как сегодня выходит новая версия компилятора.
Версия 1.05.0 не добавляет нового, просто исправляет ошибки старых версий.

@mabu:
mabu

Решил задачу из #2800564 на фрибейсике без встроенных библиотек, на голом WinAPI. Присутствует создание кучи, выделение памяти из кучи, прямая запись в консоль. Размер исполняемого файла получился в 2560 байт.
Я не оптимизировал. Если оптимизировать, то екзешник получится ещё меньше и наверняка ужмётся до двух килобайт pastebin.com

@mabu:
mabu

Вышла новая версия компилятора 1.04.0.
Плюшечки.

Добавлен тип данных Boolean. Теперь не нужно вручную определать False = 0, а True = Not False. Из‐за появилась функция CBool для преобразования в логический тип.

Добавили ссылку или псевдоним переменной. Выглядит это так:
Dim i As Integer
Dim Byref Link1 As Integer = i
Dim Byref Link2 As Integer = i
Теперь Link1 и Link2 ссылаются на переменную i. Все они указывают на одно место в памяти и если изменить одну, меняются все.

@mabu:
mabu

Написал статью на форуме, что лучше использовать функцию GetAddrInfoW для разрешения доменного имени. Это позволяет работать с IPv6 и именем домена в юникоде. freebasic.justforum.net
Способ с заполнением структуры sockaddr_in, вызовом gethostbyname и inet_addr объявлен корпорацией Micro$oft устаревшим. msdn.microsoft.com

@mabu:
mabu

Есть две сетевухи, однако в Миранде нельзя настроить, чтобы она соединялась с сервером через конкретную сетевую карту. Поэтому написал проксирующую утилиту, с которой будет соединяться Миранда, а утилита будет соединяться с сервером через конкретную сетевуху.
Используя свой скрипт компиляции получил екзешник размером в три килобайта.
pastebin.com

@mabu:
mabu

Моё первое написанное на бейсике нативное приложение. Выводит строку «Hello, World!». Тестировал в ReactOS, чтобы не портить свою систему.

#define unicode
/'
	Компилировать
	
"%ProgramFiles%\FreeBASIC\fbc.exe" -r -lib native.bas
"%ProgramFiles%\FreeBASIC\bin\win32\as.exe" --32 --strip-local-absolute "native.asm" -o "native.o"
"%ProgramFiles%\FreeBASIC\bin\win32\ld.exe" -m i386pe -e [email protected] -subsystem native -s --stack 1048576,1048576 -L "%programfiles%\freebasic\lib\win32" -L "./" "native.o" -o "native.exe" -( -lntdll -)

'/

Declare Sub RtlInitUnicodeString Alias "RtlInitUnicodeString"(ByRef s As WString, ByRef s2 As WString)
Declare Sub NtDisplayString Alias "NtDisplayString"(ByRef str As WString)

Const HelloWorld = "Hello, world!"
Common Shared sHello As WString * 256

Public Function Main Alias "Main"()As Integer
	RtlInitUnicodeString(sHello, HelloWorld)
	NtDisplayString(sHello)
	Return 0
End Function

@mabu:
mabu

Уже говорил в #2778132, что фрибейсик версии 1.02.0 содержит код в заголовочных файлах. Так как Я компилирую без использования библиотеки времени выполнения, то вот сделал скрипт, удаляющий ненужный код из ассемблерного листинга pastebin.com
Скрипт принимает в качестве параметра *.asm‐файлы и удаляет из них левый код.

@mabu:
mabu

В версии компилятора 1.02.0 в заголовочных файлах есть код, из-за чего программа раздувается на шесть‐семь килобайт. Сделал грязный хак: поставил себе новую версию компилятора, а заголовочные файлы взял из предыдущей версии 1.01.0.

@mabu:
mabu

Вышел минорный релиз фрибейсика, а Я опять всё пропустил. Что там? Почти ничего нового, только исправления ошибок и регрессий. Ещё помаленьку добавляют заголовки для 64-битных версий.

@mabu:
mabu

Не могу не поделиться ссылочкой на русскую справку по фрибейсику free-basic.ru

@mabu:
mabu

Вышел релиз-кандидат №2 ReactOS 0.3.17. Только что протестировал на нём фрибейсик. Компилятор устанавливается, программы компилируются, можно программироваться.

@mabu:
mabu

Продолжаю создавать собственную RTL-библиотеку. На этот раз хвастаюсь примитивной функцией преобразования строки в число
Public Function ToInteger(ByVal Buffer As Byte Ptr, ByVal DigitCount As Integer)As Integer
	Dim intResult As Integer
	Dim flag As Integer
	Dim j As Integer = 1
	If Buffer[0] = 45 Then
		flag = 1
	End If
	' Нужно идти с конца строки
	For i As Integer = DigitCount * SizeOf(WString) - SizeOf(WString) To flag * SizeOf(WString) Step -2
		intResult += (Buffer[i] - 48) * j
		j *= 10
	Next
	If flag Then
		intResult *= -1
	End If
	Return intResult
End Function

@mabu:
mabu

Для компиляции без RTL сделал пару функций, преобразующих число в строку. Размер программы 2048 байт. Фактически, Я пишу на продвинутом бейсико-ассемблере, поэтому программа такая маленькая.
Компилировать как в #2714532.
pastebin.com

@mabu:
mabu

Вышла версия фрибейсика 1.0.0!
Прошло десять лет с начала разработки первого компилятора. Начиная с этой версии стартует поддержка 64-бит. В 64-битной версии под тип Integer и указатели отводится 8 байт памяти. В то же время размеры типов Byte, Short, Long и LongInt одинаковы как в 32-битной версии, так и в 64-битной.
Также есть кое-какая поддержка компиляции под ARM.
Из новых плюшек. Теперь можно создавать динамический массивы внутри пользовательских типов Type. Строки можно передавать по значению, New/Delete могут работать со строками. Можно перегружать оператор [], и Len для собственных типов. И безопасная для работы в многопоточном режиме встроеная графическая библиотека.

@mabu:
mabu

Возвращает подстроку между пробелами за определённым номером. Что-то наподобие функции Split, только возвращает не массив, а строку с конкретным индексом в массиве. Может выскочить за границы памяти.
Index — индекс с нуля необходимой подстроки
strData — указатель на строку, откуда будет извлекаться подстрока
Function Substring(ByVal Index As Integer, ByVal strData As WString Ptr)As WString Ptr
	Dim ircData As WString Ptr
	Dim intStart As Integer = InStr(*strData, " ")
	If Index Then
		' Получить строку между первым и вторым пробелом
		For i As Integer = 1 To Index - 1
			intStart = InStr(intStart + 1, *strData, " ")
		Next i
		Dim intStart2 As Integer = InStr(intStart + 1, *strData, " ")
		If intStart2 Then
			ircData = Allocate((intStart2 - intStart) * SizeOf(WString))
			*ircData = Mid(*strData, intStart + 1, intStart2 - intStart - 1)
		Else
			ircData = Allocate((Len(*strData) - intStart + 1) * SizeOf(WString))
			*ircData = Mid(*strData, intStart + 1)
		End If
	Else
		' Получить строку до первого пробела
		ircData = Allocate((intStart) * SizeOf(WString))
		*ircData = Mid(*strData, 1, intStart - 1)
	End If
	Return ircData
End Function

@mabu:
mabu

Мне понравилась идея компилировать программы без rtlib. Программочки получаются очень маленькие, шустренькие. Но за всё нужно платить же. Придётся самому реализовывать все встроенные функции, даже такие, как New, Delete, оператор &. Со строками придётся обращаться как с массивом символов.

@mabu:
mabu

Компиляция DLL без использования rtl.
Батник:
fbc -dll -r -lib test.bas
"%programfiles%\FreeBASIC\bin\win32\as.exe" --32 --strip-local-absolute "test.asm" -o "test.o"
"%Programfiles%\FreeBasic\bin\win32\ld.exe" -subsystem windows --dll --export-all-symbols -e [email protected] -s --stack 1048576,1048576 -L "%programfiles%\freebasic\lib\win32" -L "./" "test.o" -o "mydll.dll" -( -lkernel32 -luser32 -) --output-def "mydll.def"
"%Programfiles%\FreeBasic\bin\win32\dlltool.exe" --def "mydll.def" --dllname "mydll.dll" --output-lib "libmydll.dll.a"

Сама программа:
#define unicode
#include once "windows.bi"

' Точка входа в DLL, вызывается системой
' hinstDLL — дескриптор модуля DLL
' fdwReason — причина вызова функции
' lpvReserved — зарезервированный
Public Function DllMain Alias "DllMain"(ByVal hinstDLL As HINSTANCE, ByVal fdwReason As DWORD, ByVal lpvReserved As LPVOID)As BOOL
	Select Case fdwReason
		Case DLL_PROCESS_ATTACH
			MessageBox(0, "DLL загружена", "DLL тест", 0)
		Case DLL_PROCESS_DETACH
			MessageBox(0, "DLL выгружена", "DLL тест", 0)
		Case DLL_THREAD_ATTACH
			MessageBox(0, "Поток создан", "DLL тест", 0)
		Case DLL_THREAD_DETACH
			MessageBox(0, "Поток уничтожен", "DLL тест", 0)
	End Select
	Return TRUE
End Function

' Наша функция
Sub TestMess Alias "TestMess"() Export
	MessageBox(0, "Тестовое сообщение из DLL", "DLL-функция", 0)
End Sub

@mabu:
mabu

Компиляция без использования rtl.
Батник:
fbc test.bas -r -lib
"%programfiles%\FreeBASIC\bin\win32\as.exe" --32 --strip-local-absolute "test.asm" -o "test.o"
"%Programfiles%\FreeBasic\bin\win32\ld.exe" -e [email protected] -subsystem windows -s --stack 1048576,1048576 -L "%programfiles%\freebasic\lib\win32" -L "./" "test.o" -o "test.exe" -( -lkernel32 -luser32 -)

Сама программа:
#define unicode
#include once "windows.bi"

Public Sub Main Alias "Main"()
	MessageBox(0, "Привет, мир!", "Первая программа", MB_OK)
	ExitProcess(0)
End Sub

@mabu:
mabu

В #2574850 ошибки, поэтому исправил:
#include "utf_conv.bi"
' Указатель на WString, которую необходимо преобразовать в utf8
Dim srcstr As WString Ptr = @"Указатель на WString, которую необходимо преобразовать в utf8"
' Количество байт
Dim intSymbolsCount As Integer
' Указатель на массив байт, в которых будут храниться utf8-данные
Dim Utf8Bytes As Byte Ptr
WCharToUTF(UTF_ENCOD_UTF8, srcstr, Len(*srcstr) + 1, 0, @intSymbolsCount)
Utf8Bytes = Allocate(intSymbolsCount)
WCharToUTF(UTF_ENCOD_UTF8, srcstr, Len(*srcstr) + 1, Utf8Bytes, @intSymbolsCount)

' Теперь в переменной intSymbolsCount содержится количество utf8 символов + 1 на нулевой символ
Print "Количество символов utf8", intSymbolsCount

' Преобразуем utf8 в WString
' Узнать количество байт под строку
UTFToWChar(UTF_ENCOD_UTF8, Utf8Bytes, 0, @intSymbolsCount)
' Выделяем память под строку
Dim newstr As Wstring Ptr = Allocate(intSymbolsCount)
' Преобразуем
UTFToWChar(UTF_ENCOD_UTF8, Utf8Bytes, newstr, @intSymbolsCount)

Print "Количество сиволов WString", intSymbolsCount
Print "Сама строка Wstring", *newstr

' Очистка
Deallocate(newstr)
Deallocate(Utf8Bytes)

@mabu:
mabu

' Открыть текстовый файл в кодировке utf8 с меткой BOM
' и прочесть его сразу до конца
Open(strFileName For Input Encoding "utf8" As #1)
Dim intFileLength As Integer = CInt(LOF(1))
Dim strData As WString Ptr = Allocate(SizeOf(WString) * (intFileLength + 1))
*strData = WInput(intFileLength, 1)
Close(1)