to post messages and comments.

@mabu:

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

@mabu:

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

@mabu:

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

@mabu:

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

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

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

@mabu:

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

@mabu:

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

@mabu:

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

@mabu:

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

@mabu:

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

@mabu:

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

@mabu:

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

@mabu:

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

@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:

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

@mabu:

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

@CaufMAN:

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

@mabu:

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

@CaufMAN:

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

@mabu:

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

@mabu:

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

@mabu:

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

@mabu:

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

@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:

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

@mabu:

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

@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:

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

@mabu:

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

@mabu:

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

@mabu:

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

@mabu:

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

@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:

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

@mabu:

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

@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:

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

@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:

Компиляция без использования 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:

В #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:

' Открыть текстовый файл в кодировке 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)