В связи с
viewtopic.php?f=10&t=370&start=195#p63430
viewtopic.php?f=33&t=3388#p66177
viewtopic.php?f=33&t=735&start=15#p49131
мне тоже стало интересно
поизвращаться запустить в
KolibriOS через
PELoad приложение, использующее
KolibriOS API, созданное в
Delphi7.
Пришлось сначала подредактировать
PELoad.
Теперь этот
PELoad не обрабатывает импорт, он только грузит
PE.
По идее надо изменить и перекомпилировать всякие там
System,
SysInit, ... . Но мне лень это всё делать.
Если скомпилировать такой проект
Code: Select all
Program Project1;
Procedure Main(); Begin End;
Begin Main; end.
то в начале происходит вызов
InitExe из
SysInitCode: Select all
55 push ebp
8bec mov ebp, esp
83c4f0 add esp, -10h
b870334000 mov eax, 00403370h
e828ffffff call @InitExe
e89fffffff call Main
e852faffff call @Halt0
Так как разбираться с
SysInit мне было лень, то я просто прыгну на вызов
Main.
Если посчитать от точки входа, то до вызова
Main 16 байт. Для
$APPTYPE CONSOLE немного по-другому, там смещение 24.
В
PELoad это
MAGIC_OFFSETCode: Select all
MAGIC_OFFSET equ 16 ; Hack For Delphi7 {$APPTYPE GUI}
; MAGIC_OFFSET equ 24 ; Hack For Delphi7 {$APPTYPE CONSOLE}
и потом ниже вот так он используется
Code: Select all
; Go To EntryPoint
mov eax, [EntryPoint]
add eax, IMAGE_BASE + MAGIC_OFFSET
jmp eax
Чтобы это смещение не приходилось пересчитывать каждый раз, не нужно писать ничего перед вызовом
Main.
Чтобы скомпилировать какой-нибудь пример, можно даже открыть
Project1.dpr в
Delphi IDE и нажать
Ctrl+F9
Для тех, кому всё же ещё хочется использовать
KlbrInWin — это тоже можно сделать.
Запускаем
KlbrInWin, запускаем в нём
PELoad, в котором запускаем
Project1.exe Spoiler:
В папке с каждым примером находится run.bat, вот его содержимоеCode: Select all
"../peload/run.bat" "/hd1/2/DelphiKOS/test2/project1.exe"
путь к project1.exe надо поменять на свой будет.
Содержимое peload/run.batCode: Select all
Set KIW="C:/Path/To/KlbrInWin/KlbrInWin.exe"
Set PEL="C:/Path/To/PELoad/peload.kex"
Set EXE=%1
%KIW% %PEL% %EXE%
надо тоже задать пути к KlbrInWin и peload.В
KOS можно запустить с помощью
run_in_KOS.sh вот так
Code: Select all
#SHS
../peload/peload.kex project1.exe
Сама папка должна быть на
tmp, или
hd, или
rd, а то с
cd не запускается(проблема, вероятно с путями в скрипте).
Первый пример — это просто окно с заголовком "
Hello, Delphi7.0!".
Второй пример — вывод текста. Кусочек кода
Spoiler:
Code: Select all
i := 1;
While i <= 10 Do Begin
DrawText( i Shl 1 + 10, i * 12, 'Test DrawText', COLOR_RED, COLOR_GREEN,
DT_CP866_6X9 + DT_FILL_OPAQUE + DT_ZSTRING, 0);
Inc(i);
End;
i := 1;
While i <= 10 Do Begin
DrawText( -i Shl 1 + 128, i * 12, 'DrawText test', COLOR_GREEN, COLOR_BLUE,
DT_CP866_8X16 + DT_FILL_OPAQUE + DT_ZSTRING, 0);
Inc(i);
End;
Я подумал, что вместо использования
DrawText удобнее будет использовать перегруженные функции
DrawStr — это вот
Spoiler:
Code: Select all
(* -------------------------------------------------------- *)
Procedure DrawStr(X, Y: Integer; Text: PChar; ForeColor, BackColor, Flags: Cardinal); Overload;
Begin
DrawText(X, Y, Text, ForeColor, BackColor, Flags Or DT_ZSTRING, 0);
End;
(* -------------------------------------------------------- *)
Procedure DrawStr(X, Y: Integer; Text: ShortString; ForeColor, BackColor, Flags: Cardinal); Overload;
Begin
DrawText(X, Y, @Text[1], ForeColor, BackColor, Flags And Not DT_ZSTRING, Cardinal(Text[0]));
End;
(* -------------------------------------------------------- *)
Третий пример — чтение файла, создание файла, запуск приложения с параметрами. Кусочки этого кода
Spoiler:
Code: Select all
...................................................................
If CreateFile('/sys/NewFile.txt') = 0 Then
strCreateResult := 'File created.'
Else
strCreateResult := 'CreateFile Error!';
If RunFile('/sys/develop/cobj', '/sys/lib/box_lib.obj') > 0 Then
strRunResult := 'Program started successfully.'
Else
strRunResult := 'RunFile Error!';
...................................................................
If ReadFile('/sys/file managers/KFM_KEYS.TXT', @Buffer, 60, 0, 0) = 0 Then
DrawStr(20, 110, @Buffer, COLOR_RED, COLOR_GREEN, DT_CP866_8X16)
Else
DrawStr(20, 110, 'ReadFile Error!', COLOR_RED, COLOR_GREEN, DT_CP866_8X16);
DrawStr(20, 127, strCreateResult, COLOR_RED, COLOR_GREEN, DT_CP866_8X16);
DrawStr(20, 144, strRunResult, COLOR_RED, COLOR_GREEN, DT_CP866_8X16);
...................................................................
Четвёртый пример —
DrawButton и
SetWindowCaption. Кусочек кода
Spoiler:
Code: Select all
DrawButton(10, 20, 50, 30, COLOR_BLUE, 0, BLUE_BUTTON);
DrawButton(70, 20, 50, 30, COLOR_GREEN, 0, GREEN_BUTTON);
DrawButton(10, 60, 50, 30, COLOR_RED, 0, RED_BUTTON);
DrawButton(70, 60, 50, 30, COLOR_BLACK, 0, BLACK_BUTTON);
....................................................................................
Case GetButton() Shr 8 Of
1: ThreadTerminate;
BLUE_BUTTON: SetWindowCaption('Blue Button Pressed.');
GREEN_BUTTON: SetWindowCaption('Green Button Pressed.');
RED_BUTTON: SetWindowCaption('Red Button Pressed.');
BLACK_BUTTON: SetWindowCaption('Black Button Pressed.');
End;
Пятый пример —
SetEventMask, загрузка библиотеки
box_lib, использование
Scrollbar. Кусочек кода
Spoiler:
Code: Select all
hBoxLib := LoadLibrary('/sys/lib/box_lib.obj');
HScrollbarDraw := GetProcAddress(hBoxLib, 'scrollbar_h_draw');
HScrollbarMouse := GetProcAddress(hBoxLib, 'scrollbar_h_mouse');
With Scrollbar1 Do Begin
ar_offset := 1;
all_redraw := 1;
size_x := 200;
btn_high := 16;
bckg_col := COLOR_GREEN;
frnt_col := COLOR_GREEN Or COLOR_BLUE;
line_col := COLOR_BLUE;
start_y := 40;
size_y := 16;
start_x := 35;
max_area := 160;
cur_area := 40;
mode := 1;
End;
SetEventMask(EM_REDRAW + EM_KEY + EM_BUTTON + EM_MOUSE);
......................................................................
Scrollbar1.all_redraw := 1;
HScrollbarDraw(@Scrollbar1);
......................................................................
Procedure On_Mouse();
Begin
HScrollbarMouse(@Scrollbar1);;
End;
И, конечно, я проверил возможность запуска таких приложений в самой
KolibriOS.
Spoiler:
Для старта приложения можно запустить run_in_KOS.sh, который в папке с каждым примером. Один нюанс — этот скрипт работает не из всех файловых менеджеров. Но из того, который на скриншоте — работает.