Joined: Sun Oct 30, 2011 6:43 pm Posts: 1498
|
В связи с viewtopic.php?f=10&t=370&start=195#p63430viewtopic.php?f=33&t=3388#p66177viewtopic.php?f=33&t=735&start=15#p49131мне тоже стало интересно поизвращаться запустить в KolibriOS через PELoad приложение, использующее KolibriOS API, созданное в Delphi7. Пришлось сначала подредактировать PELoad. Теперь этот PELoad не обрабатывает импорт, он только грузит PE. По идее надо изменить и перекомпилировать всякие там System, SysInit, ... . Но мне лень это всё делать. Если скомпилировать такой проект Code: Program Project1; Procedure Main(); Begin End; Begin Main; end. то в начале происходит вызов InitExe из SysInitCode: 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: MAGIC_OFFSET equ 16 ; Hack For Delphi7 {$APPTYPE GUI} ; MAGIC_OFFSET equ 24 ; Hack For Delphi7 {$APPTYPE CONSOLE} и потом ниже вот так он используется Code: ; 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  В папке с каждым примером находится run.bat, вот его содержимое Code: "../peload/run.bat" "/hd1/2/DelphiKOS/test2/project1.exe" путь к project1.exe надо поменять на свой будет. Содержимое peload/run.batCode: 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: #SHS ../peload/peload.kex project1.exe Сама папка должна быть на tmp, или hd, или rd, а то с cd не запускается(проблема, вероятно с путями в скрипте). Первый пример — это просто окно с заголовком " Hello, Delphi7.0!". Второй пример — вывод текста. Кусочек кода Code: 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 — это вот Code: (* -------------------------------------------------------- *) 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; (* -------------------------------------------------------- *) Третий пример — чтение файла, создание файла, запуск приложения с параметрами. Кусочки этого кода Code: ................................................................... 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. Кусочек кода Code: 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. Кусочек кода Code: 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.  Для старта приложения можно запустить run_in_KOS.sh, который в папке с каждым примером. Один нюанс — этот скрипт работает не из всех файловых менеджеров. Но из того, который на скриншоте — работает. Attachment:
DelphiKOS.7z [6.37 KiB]
Downloaded 175 times
|
|