├── .gitignore ├── CaptureConsoleUnit.pas ├── LICENSE ├── README.md └── TestApplication ├── ConsoleHandleTestApp.dpr ├── ConsoleHandleTestApp.dproj ├── ConsoleHandleTestApp.res ├── MainUnit.fmx └── MainUnit.pas /.gitignore: -------------------------------------------------------------------------------- 1 | *.dcu 2 | *.~* 3 | *.exe 4 | _history\* 5 | -------------------------------------------------------------------------------- /CaptureConsoleUnit.pas: -------------------------------------------------------------------------------- 1 | unit CaptureConsoleUnit; 2 | 3 | interface 4 | 5 | uses 6 | System.Classes, System.SysUtils, System.Threading, 7 | {$IFDEF MSWINDOWS} 8 | Winapi.Windows; 9 | {$ELSE POSIX} 10 | Posix.Base; 11 | {$ENDIF} 12 | 13 | type 14 | TConsoleCallback = reference to procedure(const Arg: T); 15 | procedure CaptureConsoleOutputSync(const Command: String; Callback: TConsoleCallback); 16 | 17 | implementation 18 | 19 | /// 20 | /// Calls system console and redirects it's lines to the Callback 21 | /// 22 | /// Application or Command to execute 23 | /// Optional argumets 24 | /// Callback procedure (Line: String) 25 | /// 26 | /// Because of TThread.Synchronize() this procedure should be used in an asyncronous context 27 | /// 28 | procedure CaptureConsoleOutputSync(const Command: String; Callback: TConsoleCallback); 29 | {$IFDEF MSWINDOWS} 30 | const 31 | CReadBuffer = 1; 32 | var 33 | saSecurity: TSecurityAttributes; 34 | hRead, hWrite: THandle; 35 | suiStartup: TStartupInfo; 36 | piProcess: TProcessInformation; 37 | pBuffer, dBuffer: array [0..CReadBuffer] of AnsiChar; 38 | dRead, dRunning, dAvailable: DWORD; 39 | TempString: String; 40 | begin 41 | TempString := ''; 42 | saSecurity.nLength := SizeOf(TSecurityAttributes); 43 | saSecurity.bInheritHandle := True; 44 | saSecurity.lpSecurityDescriptor := nil; 45 | 46 | if CreatePipe(hRead, hWrite, @saSecurity, 0) then 47 | try 48 | FillChar(suiStartup, SizeOf(TStartupInfo), #0); 49 | suiStartup.cb := SizeOf(TStartupInfo); 50 | suiStartup.hStdInput := hRead; 51 | suiStartup.hStdOutput := hWrite; 52 | suiStartup.hStdError := hWrite; 53 | suiStartup.dwFlags := STARTF_USESTDHANDLES or STARTF_USESHOWWINDOW; 54 | suiStartup.wShowWindow := SW_HIDE; 55 | 56 | if CreateProcess(nil, PChar('cmd /c "' + Command + '"'), @saSecurity, @saSecurity, true, NORMAL_PRIORITY_CLASS, nil, nil, suiStartup, piProcess) then 57 | try 58 | repeat 59 | dRunning := WaitForSingleObject(piProcess.hProcess, 1); 60 | repeat 61 | PeekNamedPipe(hRead, nil, 0, nil, @dAvailable, nil); 62 | if dAvailable > 0 then begin 63 | dRead := 0; 64 | ReadFile(hRead, pBuffer[0], CReadBuffer, dRead, nil); 65 | pBuffer[dRead] := #0; 66 | OemToCharA(pBuffer, dBuffer); 67 | 68 | if (dBuffer[0] = #$D) then begin 69 | if TempString.Contains(#$A) then begin 70 | TempString := TempString.Replace(#$A, ''); 71 | end; 72 | TThread.Synchronize(nil, procedure begin 73 | Callback(TempString); 74 | end); 75 | TempString := ''; 76 | end else 77 | TempString := TempString + dBuffer[0]; 78 | end else Break; 79 | until dRead < CReadBuffer; 80 | //Application.ProcessMessages; 81 | until dRunning <> WAIT_TIMEOUT; 82 | finally 83 | CloseHandle(piProcess.hProcess); 84 | CloseHandle(piProcess.hThread); 85 | end; 86 | finally 87 | CloseHandle(hRead); 88 | CloseHandle(hWrite); 89 | end; 90 | {$ELSE POSIX} 91 | type 92 | PIOFile = Pointer; 93 | _popen = function (const Command, Modes: PAnsiChar): PIOFile; cdecl; 94 | _pclose = function (Stream: PIOFile): Integer; cdecl; 95 | _feof = function (Strean: PIOFile): Integer; cdecl; 96 | _fread = function (Ptr: Pointer; Size, N: LongWord; Stream: PIOFile): LongWord; cdecl; 97 | _wait = function (__stat_loc: PInteger): Integer; cdecl; 98 | 99 | function popen(const Command, Modes: PAnsiChar): PIOFile; 100 | var 101 | Handle: HMODULE; 102 | func: _popen; 103 | begin 104 | Result := nil; 105 | Handle := LoadLibrary('libc.dylib'); 106 | if Handle <> 0 then begin 107 | try 108 | @func := GetProcAddress(Handle, _PU + 'popen'); 109 | if @func <> nil then 110 | Result := func(Command, Modes); 111 | finally 112 | FreeLibrary(Handle); 113 | end; 114 | end; 115 | end; 116 | 117 | function pclose(Stream: PIOFile): Integer; 118 | var 119 | Handle: HMODULE; 120 | func: _pclose; 121 | begin 122 | Result := -1; 123 | Handle := LoadLibrary('libc.dylib'); 124 | if Handle <> 0 then begin 125 | try 126 | @func := GetProcAddress(Handle, _PU + 'pclose'); 127 | if @func <> nil then 128 | Result := func(Stream); 129 | finally 130 | FreeLibrary(Handle); 131 | end; 132 | end; 133 | end; 134 | 135 | function fread(Ptr: Pointer; Size, N: LongWord; Stream: PIOFile): LongWord; 136 | var 137 | Handle: HMODULE; 138 | func: _fread; 139 | begin 140 | Result := 0; 141 | Handle := LoadLibrary('libc.dylib'); 142 | if Handle <> 0 then begin 143 | try 144 | @func := GetProcAddress(Handle, _PU + 'fread'); 145 | if @func <> nil then 146 | Result := func(Ptr, Size, N, Stream); 147 | finally 148 | FreeLibrary(Handle); 149 | end; 150 | end; 151 | end; 152 | 153 | function feof(Stream: PIOFile): Integer; 154 | var 155 | Handle: HMODULE; 156 | func: _feof; 157 | begin 158 | Result := -1; 159 | Handle := LoadLibrary('libc.dylib'); 160 | if Handle <> 0 then begin 161 | try 162 | @func := GetProcAddress(Handle, _PU + 'feof'); 163 | if @func <> nil then 164 | Result := func(Stream); 165 | finally 166 | FreeLibrary(Handle); 167 | end; 168 | end; 169 | end; 170 | 171 | function wait(__stat_loc: PInteger): Integer; 172 | var 173 | Handle: HMODULE; 174 | func: _wait; 175 | begin 176 | Result := -1; 177 | Handle := LoadLibrary('libc.dylib'); 178 | if Handle <> 0 then begin 179 | try 180 | @func := GetProcAddress(Handle, _PU + 'wait'); 181 | if @func <> nil then 182 | Result := func(__stat_loc); 183 | finally 184 | FreeLibrary(Handle); 185 | end; 186 | end; 187 | end; 188 | 189 | const 190 | BufferSize = 1; 191 | var 192 | Output: PIOFile; 193 | Buffer: PAnsiChar; 194 | TempString, Line: AnsiString; 195 | BytesRead: Integer; 196 | begin 197 | TempString := ''; 198 | Output := popen(PAnsiChar(AnsiString(Command)), 'r'); 199 | GetMem(Buffer, BufferSize); 200 | if Assigned(Output) then 201 | try 202 | while feof(Output) = 0 do begin 203 | BytesRead := fread(Buffer, 1, BufferSize, Output); 204 | SetLength(TempString, Length(TempString) + BytesRead); 205 | Move(Buffer^, TempString[Length(TempString) - (BytesRead - 1)], BytesRead); 206 | 207 | while Pos(#10, TempString) > 0 do begin 208 | Line := Copy(TempString, 1, Pos(#10, TempString) - 1); 209 | 210 | TThread.Synchronize(nil, procedure begin 211 | Callback(UTF8ToString(Line)); 212 | end); 213 | 214 | TempString := Copy(TempString, Pos(#10, TempString) + 1, Length(TempString)); 215 | 216 | end; 217 | end; 218 | finally 219 | pclose(Output); 220 | wait(nil); 221 | FreeMem(Buffer, BufferSize) 222 | end; 223 | {$ENDIF} 224 | end; 225 | 226 | end. 227 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2021 Alice 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # CaptureConsoleOutput.pas 2 | Procedure that executes console command and redirects it's output to the callback procedure. 3 | Should be used only in an asynchronous context (use `TThread` or `TTask.Run()`), beucase of `TThread.Synchronize()` that is used inside the procedure. 4 | 5 | Tested with RAD Studio 11.0 Alexandria on `Windows 11 (Version 21H2)` and `macOS 11.6.1 Big Sur`. 6 | 7 | ## Usage 8 | ```Pascal 9 | uses 10 | CaptureConsoleUnit; 11 | 12 | procedure TForm1.Button1Click(Sender: TObject); 13 | begin 14 | TTask.Run(procedure begin 15 | CaptureConsoleOutputSync('ping google.com', 16 | procedure (const Line: String) begin 17 | Memo1.Lines.Add(Line); 18 | Memo1.GoToTextEnd; 19 | end); 20 | end); 21 | end; 22 | ``` 23 | -------------------------------------------------------------------------------- /TestApplication/ConsoleHandleTestApp.dpr: -------------------------------------------------------------------------------- 1 | program ConsoleHandleTestApp; 2 | 3 | uses 4 | System.StartUpCopy, 5 | FMX.Forms, 6 | MainUnit in 'MainUnit.pas' {Form1}, 7 | CaptureConsoleUnit in '..\CaptureConsoleUnit.pas'; 8 | 9 | {$R *.res} 10 | 11 | begin 12 | Application.Initialize; 13 | Application.CreateForm(TForm1, Form1); 14 | Application.Run; 15 | end. 16 | -------------------------------------------------------------------------------- /TestApplication/ConsoleHandleTestApp.dproj: -------------------------------------------------------------------------------- 1 |  2 | 3 | {17EAD113-3D78-40EF-BAB4-2F5BD540388C} 4 | 19.3 5 | FMX 6 | True 7 | Debug 8 | Win32 9 | 37907 10 | Application 11 | ConsoleHandleTestApp.dpr 12 | 13 | 14 | true 15 | 16 | 17 | true 18 | Base 19 | true 20 | 21 | 22 | true 23 | Base 24 | true 25 | 26 | 27 | true 28 | Base 29 | true 30 | 31 | 32 | true 33 | Base 34 | true 35 | 36 | 37 | true 38 | Base 39 | true 40 | 41 | 42 | true 43 | Base 44 | true 45 | 46 | 47 | true 48 | Base 49 | true 50 | 51 | 52 | true 53 | Base 54 | true 55 | 56 | 57 | true 58 | Cfg_1 59 | true 60 | true 61 | 62 | 63 | true 64 | Cfg_1 65 | true 66 | true 67 | 68 | 69 | true 70 | Base 71 | true 72 | 73 | 74 | true 75 | Cfg_2 76 | true 77 | true 78 | 79 | 80 | true 81 | Cfg_2 82 | true 83 | true 84 | 85 | 86 | .\$(Platform)\$(Config) 87 | .\$(Platform)\$(Config) 88 | false 89 | false 90 | false 91 | false 92 | false 93 | System;Xml;Data;Datasnap;Web;Soap;$(DCC_Namespace) 94 | true 95 | true 96 | true 97 | true 98 | true 99 | true 100 | true 101 | true 102 | $(BDS)\bin\delphi_PROJECTICON.ico 103 | $(BDS)\bin\delphi_PROJECTICNS.icns 104 | ConsoleHandleTestApp 105 | 106 | 107 | fmx;DbxCommonDriver;bindengine;IndyIPCommon;emsclient;FireDACCommonDriver;IndyProtocols;IndyIPClient;dbxcds;bindcompfmx;FireDACSqliteDriver;DbxClientDriver;soapmidas;fmxFireDAC;dbexpress;inet;DataSnapCommon;dbrtl;FireDACDBXDriver;CustomIPTransport;DBXInterBaseDriver;IndySystem;bindcomp;FireDACCommon;IndyCore;RESTBackendComponents;bindcompdbx;rtl;RESTComponents;DBXSqliteDriver;IndyIPServer;dsnapxml;DataSnapClient;DataSnapProviderClient;DataSnapFireDAC;emsclientfiredac;FireDAC;FireDACDSDriver;xmlrtl;tethering;dsnap;CloudService;DataSnapNativeClient;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) 108 | package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= 109 | Debug 110 | true 111 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 112 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 113 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 114 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 115 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 116 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png 117 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 118 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 119 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 120 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 121 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png 122 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png 123 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png 124 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png 125 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png 126 | annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar 127 | 128 | 129 | fmx;DbxCommonDriver;bindengine;IndyIPCommon;emsclient;FireDACCommonDriver;IndyProtocols;IndyIPClient;dbxcds;bindcompfmx;FireDACSqliteDriver;DbxClientDriver;soapmidas;fmxFireDAC;dbexpress;inet;DataSnapCommon;dbrtl;FireDACDBXDriver;CustomIPTransport;DBXInterBaseDriver;IndySystem;bindcomp;FireDACCommon;IndyCore;RESTBackendComponents;bindcompdbx;rtl;RESTComponents;DBXSqliteDriver;IndyIPServer;dsnapxml;DataSnapClient;DataSnapProviderClient;DataSnapFireDAC;emsclientfiredac;FireDAC;FireDACDSDriver;xmlrtl;tethering;dsnap;CloudService;DataSnapNativeClient;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) 130 | package=com.embarcadero.$(MSBuildProjectName);label=$(MSBuildProjectName);versionCode=1;versionName=1.0.0;persistent=False;restoreAnyVersion=False;installLocation=auto;largeHeap=False;theme=TitleBar;hardwareAccelerated=true;apiKey= 131 | Debug 132 | true 133 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_36x36.png 134 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_48x48.png 135 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_72x72.png 136 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_96x96.png 137 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_144x144.png 138 | $(BDS)\bin\Artwork\Android\FM_LauncherIcon_192x192.png 139 | $(BDS)\bin\Artwork\Android\FM_SplashImage_426x320.png 140 | $(BDS)\bin\Artwork\Android\FM_SplashImage_470x320.png 141 | $(BDS)\bin\Artwork\Android\FM_SplashImage_640x480.png 142 | $(BDS)\bin\Artwork\Android\FM_SplashImage_960x720.png 143 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_24x24.png 144 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_36x36.png 145 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_48x48.png 146 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_72x72.png 147 | $(BDS)\bin\Artwork\Android\FM_NotificationIcon_96x96.png 148 | annotation-1.2.0.dex.jar;asynclayoutinflater-1.0.0.dex.jar;billing-4.0.0.dex.jar;browser-1.0.0.dex.jar;cloud-messaging.dex.jar;collection-1.0.0.dex.jar;coordinatorlayout-1.0.0.dex.jar;core-1.5.0-rc02.dex.jar;core-common-2.0.1.dex.jar;core-runtime-2.0.1.dex.jar;cursoradapter-1.0.0.dex.jar;customview-1.0.0.dex.jar;documentfile-1.0.0.dex.jar;drawerlayout-1.0.0.dex.jar;firebase-annotations-16.0.0.dex.jar;firebase-common-20.0.0.dex.jar;firebase-components-17.0.0.dex.jar;firebase-datatransport-18.0.0.dex.jar;firebase-encoders-17.0.0.dex.jar;firebase-encoders-json-18.0.0.dex.jar;firebase-iid-interop-17.1.0.dex.jar;firebase-installations-17.0.0.dex.jar;firebase-installations-interop-17.0.0.dex.jar;firebase-measurement-connector-19.0.0.dex.jar;firebase-messaging-22.0.0.dex.jar;fmx.dex.jar;fragment-1.0.0.dex.jar;google-play-licensing.dex.jar;interpolator-1.0.0.dex.jar;javax.inject-1.dex.jar;legacy-support-core-ui-1.0.0.dex.jar;legacy-support-core-utils-1.0.0.dex.jar;lifecycle-common-2.0.0.dex.jar;lifecycle-livedata-2.0.0.dex.jar;lifecycle-livedata-core-2.0.0.dex.jar;lifecycle-runtime-2.0.0.dex.jar;lifecycle-service-2.0.0.dex.jar;lifecycle-viewmodel-2.0.0.dex.jar;listenablefuture-1.0.dex.jar;loader-1.0.0.dex.jar;localbroadcastmanager-1.0.0.dex.jar;play-services-ads-20.1.0.dex.jar;play-services-ads-base-20.1.0.dex.jar;play-services-ads-identifier-17.0.0.dex.jar;play-services-ads-lite-20.1.0.dex.jar;play-services-base-17.5.0.dex.jar;play-services-basement-17.6.0.dex.jar;play-services-cloud-messaging-16.0.0.dex.jar;play-services-drive-17.0.0.dex.jar;play-services-games-21.0.0.dex.jar;play-services-location-18.0.0.dex.jar;play-services-maps-17.0.1.dex.jar;play-services-measurement-base-18.0.0.dex.jar;play-services-measurement-sdk-api-18.0.0.dex.jar;play-services-places-placereport-17.0.0.dex.jar;play-services-stats-17.0.0.dex.jar;play-services-tasks-17.2.0.dex.jar;print-1.0.0.dex.jar;room-common-2.1.0.dex.jar;room-runtime-2.1.0.dex.jar;slidingpanelayout-1.0.0.dex.jar;sqlite-2.0.1.dex.jar;sqlite-framework-2.0.1.dex.jar;swiperefreshlayout-1.0.0.dex.jar;transport-api-3.0.0.dex.jar;transport-backend-cct-3.0.0.dex.jar;transport-runtime-3.0.0.dex.jar;user-messaging-platform-1.0.0.dex.jar;versionedparcelable-1.1.1.dex.jar;viewpager-1.0.0.dex.jar;work-runtime-2.1.0.dex.jar 149 | 150 | 151 | fmx;DbxCommonDriver;bindengine;IndyIPCommon;emsclient;FireDACCommonDriver;IndyProtocols;IndyIPClient;dbxcds;bindcompfmx;FireDACSqliteDriver;DbxClientDriver;soapmidas;fmxFireDAC;dbexpress;inet;DataSnapCommon;fmxase;dbrtl;FireDACDBXDriver;CustomIPTransport;DBXInterBaseDriver;IndySystem;bindcomp;FireDACCommon;IndyCore;RESTBackendComponents;bindcompdbx;rtl;RESTComponents;DBXSqliteDriver;IndyIPServer;dsnapxml;DataSnapClient;DataSnapProviderClient;DataSnapFireDAC;emsclientfiredac;FireDAC;FireDACDSDriver;xmlrtl;tethering;dsnap;CloudService;DataSnapNativeClient;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) 152 | CFBundleName=$(MSBuildProjectName);CFBundleDevelopmentRegion=en;CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleInfoDictionaryVersion=7.1;CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;LSRequiresIPhoneOS=true;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);UIDeviceFamily=iPhone & iPad;NSLocationAlwaysUsageDescription=The reason for accessing the location information of the user;NSLocationWhenInUseUsageDescription=The reason for accessing the location information of the user;NSLocationAlwaysAndWhenInUseUsageDescription=The reason for accessing the location information of the user;UIBackgroundModes=;NSContactsUsageDescription=The reason for accessing the contacts;NSPhotoLibraryUsageDescription=The reason for accessing the photo library;NSPhotoLibraryAddUsageDescription=The reason for adding to the photo library;NSCameraUsageDescription=The reason for accessing the camera;NSFaceIDUsageDescription=The reason for accessing the face id;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSSiriUsageDescription=The reason for accessing Siri;ITSAppUsesNonExemptEncryption=false;NSBluetoothAlwaysUsageDescription=The reason for accessing bluetooth;NSBluetoothPeripheralUsageDescription=The reason for accessing bluetooth peripherals;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSMotionUsageDescription=The reason for accessing the accelerometer;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers 153 | iPhoneAndiPad 154 | true 155 | Debug 156 | $(MSBuildProjectName) 157 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_1024x1024.png 158 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_120x120.png 159 | $(BDS)\bin\Artwork\iOS\iPhone\FM_ApplicationIcon_180x180.png 160 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_2x.png 161 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_2x.png 162 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImage_3x.png 163 | $(BDS)\bin\Artwork\iOS\iPhone\FM_LaunchImageDark_3x.png 164 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_80x80.png 165 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SpotlightSearchIcon_120x120.png 166 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_58x58.png 167 | $(BDS)\bin\Artwork\iOS\iPhone\FM_SettingIcon_87x87.png 168 | $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_40x40.png 169 | $(BDS)\bin\Artwork\iOS\iPhone\FM_NotificationIcon_60x60.png 170 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_152x152.png 171 | $(BDS)\bin\Artwork\iOS\iPad\FM_ApplicationIcon_167x167.png 172 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImage_2x.png 173 | $(BDS)\bin\Artwork\iOS\iPad\FM_LaunchImageDark_2x.png 174 | $(BDS)\bin\Artwork\iOS\iPad\FM_SpotlightSearchIcon_80x80.png 175 | $(BDS)\bin\Artwork\iOS\iPad\FM_SettingIcon_58x58.png 176 | $(BDS)\bin\Artwork\iOS\iPad\FM_NotificationIcon_40x40.png 177 | 178 | 179 | DataSnapServer;fmx;DbxCommonDriver;bindengine;IndyIPCommon;FireDACCommonODBC;emsclient;FireDACCommonDriver;IndyProtocols;IndyIPClient;dbxcds;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;soapmidas;fmxFireDAC;dbexpress;DBXMySQLDriver;inet;DataSnapCommon;fmxase;dbrtl;FireDACDBXDriver;FireDACOracleDriver;fmxdae;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;RESTComponents;DBXSqliteDriver;IndyIPServer;dsnapxml;DataSnapClient;DataSnapProviderClient;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;DBXInformixDriver;fmxobj;DataSnapNativeClient;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) 180 | CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers 181 | Debug 182 | true 183 | 184 | 185 | CFBundleName=$(MSBuildProjectName);CFBundleDisplayName=$(MSBuildProjectName);CFBundleIdentifier=$(MSBuildProjectName);CFBundleVersion=1.0.0;CFBundleShortVersionString=1.0.0;CFBundlePackageType=APPL;CFBundleSignature=????;CFBundleAllowMixedLocalizations=YES;CFBundleExecutable=$(MSBuildProjectName);NSHighResolutionCapable=true;LSApplicationCategoryType=public.app-category.utilities;NSLocationUsageDescription=The reason for accessing the location information of the user;NSContactsUsageDescription=The reason for accessing the contacts;NSCalendarsUsageDescription=The reason for accessing the calendar data;NSRemindersUsageDescription=The reason for accessing the reminders;NSCameraUsageDescription=The reason for accessing the camera;NSMicrophoneUsageDescription=The reason for accessing the microphone;NSMotionUsageDescription=The reason for accessing the accelerometer;NSDesktopFolderUsageDescription=The reason for accessing the Desktop folder;NSDocumentsFolderUsageDescription=The reason for accessing the Documents folder;NSDownloadsFolderUsageDescription=The reason for accessing the Downloads folder;NSNetworkVolumesUsageDescription=The reason for accessing files on a network volume;NSRemovableVolumesUsageDescription=The reason for accessing files on a removable volume;NSSpeechRecognitionUsageDescription=The reason for requesting to send user data to Apple's speech recognition servers 186 | Debug 187 | true 188 | 189 | 190 | vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;soapmidas;vclactnband;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;fmxdae;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) 191 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;Bde;$(DCC_Namespace) 192 | Debug 193 | true 194 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 195 | 1033 196 | $(BDS)\bin\default_app.manifest 197 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 198 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 199 | 200 | 201 | vclwinx;DataSnapServer;fmx;emshosting;vclie;DbxCommonDriver;bindengine;IndyIPCommon;VCLRESTComponents;DBXMSSQLDriver;FireDACCommonODBC;emsclient;FireDACCommonDriver;appanalytics;IndyProtocols;vclx;IndyIPClient;dbxcds;vcledge;bindcompvclwinx;emsedge;bindcompfmx;DBXFirebirdDriver;inetdb;FireDACSqliteDriver;DbxClientDriver;FireDACASADriver;soapmidas;vclactnband;fmxFireDAC;dbexpress;FireDACInfxDriver;DBXMySQLDriver;VclSmp;inet;DataSnapCommon;vcltouch;fmxase;DBXOdbcDriver;dbrtl;FireDACDBXDriver;FireDACOracleDriver;fmxdae;FireDACMSAccDriver;CustomIPTransport;FireDACMSSQLDriver;DataSnapIndy10ServerTransport;DataSnapConnectors;vcldsnap;DBXInterBaseDriver;FireDACMongoDBDriver;IndySystem;FireDACTDataDriver;vcldb;vclFireDAC;bindcomp;FireDACCommon;DataSnapServerMidas;FireDACODBCDriver;emsserverresource;IndyCore;RESTBackendComponents;bindcompdbx;rtl;FireDACMySQLDriver;FireDACADSDriver;RESTComponents;DBXSqliteDriver;vcl;IndyIPServer;dsnapxml;dsnapcon;DataSnapClient;DataSnapProviderClient;adortl;DBXSybaseASEDriver;DBXDb2Driver;vclimg;DataSnapFireDAC;emsclientfiredac;FireDACPgDriver;FireDAC;FireDACDSDriver;inetdbxpress;xmlrtl;tethering;bindcompvcl;dsnap;CloudService;DBXSybaseASADriver;DBXOracleDriver;FireDACDb2Driver;DBXInformixDriver;fmxobj;bindcompvclsmp;DataSnapNativeClient;DatasnapConnectorsFreePascal;soaprtl;soapserver;FireDACIBDriver;$(DCC_UsePackage) 202 | Winapi;System.Win;Data.Win;Datasnap.Win;Web.Win;Soap.Win;Xml.Win;$(DCC_Namespace) 203 | Debug 204 | true 205 | CompanyName=;FileDescription=$(MSBuildProjectName);FileVersion=1.0.0.0;InternalName=;LegalCopyright=;LegalTrademarks=;OriginalFilename=;ProgramID=com.embarcadero.$(MSBuildProjectName);ProductName=$(MSBuildProjectName);ProductVersion=1.0.0.0;Comments= 206 | 1033 207 | $(BDS)\bin\default_app.manifest 208 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_44.png 209 | $(BDS)\bin\Artwork\Windows\UWP\delphi_UwpDefault_150.png 210 | 211 | 212 | DEBUG;$(DCC_Define) 213 | true 214 | false 215 | true 216 | true 217 | true 218 | true 219 | true 220 | 221 | 222 | false 223 | true 224 | PerMonitorV2 225 | 226 | 227 | true 228 | PerMonitorV2 229 | 230 | 231 | false 232 | RELEASE;$(DCC_Define) 233 | 0 234 | 0 235 | 236 | 237 | true 238 | PerMonitorV2 239 | 240 | 241 | true 242 | PerMonitorV2 243 | 244 | 245 | 246 | MainSource 247 | 248 | 249 |
Form1
250 | fmx 251 |
252 | 253 | 254 | Base 255 | 256 | 257 | Cfg_1 258 | Base 259 | 260 | 261 | Cfg_2 262 | Base 263 | 264 |
265 | 266 | Delphi.Personality.12 267 | Application 268 | 269 | 270 | 271 | ConsoleHandleTestApp.dpr 272 | 273 | 274 | 275 | 276 | 277 | ConsoleHandleTestApp 278 | true 279 | 280 | 281 | 282 | 283 | ConsoleHandleTestApp.exe 284 | true 285 | 286 | 287 | 288 | 289 | true 290 | 291 | 292 | 293 | 294 | true 295 | 296 | 297 | 298 | 299 | true 300 | 301 | 302 | 303 | 304 | ConsoleHandleTestApp.icns 305 | true 306 | 307 | 308 | 309 | 310 | Contents\Resources\StartUp\ 311 | true 312 | 313 | 314 | 315 | 316 | ConsoleHandleTestApp 317 | true 318 | 319 | 320 | 321 | 322 | Info.plist 323 | true 324 | 325 | 326 | 327 | 328 | true 329 | 330 | 331 | 332 | 333 | 1 334 | 335 | 336 | Contents\MacOS 337 | 1 338 | 339 | 340 | 0 341 | 342 | 343 | 344 | 345 | classes 346 | 64 347 | 348 | 349 | classes 350 | 64 351 | 352 | 353 | 354 | 355 | classes 356 | 1 357 | 358 | 359 | classes 360 | 1 361 | 362 | 363 | 364 | 365 | res\xml 366 | 1 367 | 368 | 369 | res\xml 370 | 1 371 | 372 | 373 | 374 | 375 | library\lib\armeabi-v7a 376 | 1 377 | 378 | 379 | 380 | 381 | library\lib\armeabi 382 | 1 383 | 384 | 385 | library\lib\armeabi 386 | 1 387 | 388 | 389 | 390 | 391 | library\lib\armeabi-v7a 392 | 1 393 | 394 | 395 | 396 | 397 | library\lib\mips 398 | 1 399 | 400 | 401 | library\lib\mips 402 | 1 403 | 404 | 405 | 406 | 407 | library\lib\armeabi-v7a 408 | 1 409 | 410 | 411 | library\lib\arm64-v8a 412 | 1 413 | 414 | 415 | 416 | 417 | library\lib\armeabi-v7a 418 | 1 419 | 420 | 421 | 422 | 423 | res\drawable 424 | 1 425 | 426 | 427 | res\drawable 428 | 1 429 | 430 | 431 | 432 | 433 | res\values 434 | 1 435 | 436 | 437 | res\values 438 | 1 439 | 440 | 441 | 442 | 443 | res\values-v21 444 | 1 445 | 446 | 447 | res\values-v21 448 | 1 449 | 450 | 451 | 452 | 453 | res\values 454 | 1 455 | 456 | 457 | res\values 458 | 1 459 | 460 | 461 | 462 | 463 | res\drawable 464 | 1 465 | 466 | 467 | res\drawable 468 | 1 469 | 470 | 471 | 472 | 473 | res\drawable-xxhdpi 474 | 1 475 | 476 | 477 | res\drawable-xxhdpi 478 | 1 479 | 480 | 481 | 482 | 483 | res\drawable-xxxhdpi 484 | 1 485 | 486 | 487 | res\drawable-xxxhdpi 488 | 1 489 | 490 | 491 | 492 | 493 | res\drawable-ldpi 494 | 1 495 | 496 | 497 | res\drawable-ldpi 498 | 1 499 | 500 | 501 | 502 | 503 | res\drawable-mdpi 504 | 1 505 | 506 | 507 | res\drawable-mdpi 508 | 1 509 | 510 | 511 | 512 | 513 | res\drawable-hdpi 514 | 1 515 | 516 | 517 | res\drawable-hdpi 518 | 1 519 | 520 | 521 | 522 | 523 | res\drawable-xhdpi 524 | 1 525 | 526 | 527 | res\drawable-xhdpi 528 | 1 529 | 530 | 531 | 532 | 533 | res\drawable-mdpi 534 | 1 535 | 536 | 537 | res\drawable-mdpi 538 | 1 539 | 540 | 541 | 542 | 543 | res\drawable-hdpi 544 | 1 545 | 546 | 547 | res\drawable-hdpi 548 | 1 549 | 550 | 551 | 552 | 553 | res\drawable-xhdpi 554 | 1 555 | 556 | 557 | res\drawable-xhdpi 558 | 1 559 | 560 | 561 | 562 | 563 | res\drawable-xxhdpi 564 | 1 565 | 566 | 567 | res\drawable-xxhdpi 568 | 1 569 | 570 | 571 | 572 | 573 | res\drawable-xxxhdpi 574 | 1 575 | 576 | 577 | res\drawable-xxxhdpi 578 | 1 579 | 580 | 581 | 582 | 583 | res\drawable-small 584 | 1 585 | 586 | 587 | res\drawable-small 588 | 1 589 | 590 | 591 | 592 | 593 | res\drawable-normal 594 | 1 595 | 596 | 597 | res\drawable-normal 598 | 1 599 | 600 | 601 | 602 | 603 | res\drawable-large 604 | 1 605 | 606 | 607 | res\drawable-large 608 | 1 609 | 610 | 611 | 612 | 613 | res\drawable-xlarge 614 | 1 615 | 616 | 617 | res\drawable-xlarge 618 | 1 619 | 620 | 621 | 622 | 623 | res\values 624 | 1 625 | 626 | 627 | res\values 628 | 1 629 | 630 | 631 | 632 | 633 | 1 634 | 635 | 636 | Contents\MacOS 637 | 1 638 | 639 | 640 | 0 641 | 642 | 643 | 644 | 645 | Contents\MacOS 646 | 1 647 | .framework 648 | 649 | 650 | Contents\MacOS 651 | 1 652 | .framework 653 | 654 | 655 | Contents\MacOS 656 | 1 657 | .framework 658 | 659 | 660 | 0 661 | 662 | 663 | 664 | 665 | 1 666 | .dylib 667 | 668 | 669 | 1 670 | .dylib 671 | 672 | 673 | 1 674 | .dylib 675 | 676 | 677 | Contents\MacOS 678 | 1 679 | .dylib 680 | 681 | 682 | Contents\MacOS 683 | 1 684 | .dylib 685 | 686 | 687 | Contents\MacOS 688 | 1 689 | .dylib 690 | 691 | 692 | 0 693 | .dll;.bpl 694 | 695 | 696 | 697 | 698 | 1 699 | .dylib 700 | 701 | 702 | 1 703 | .dylib 704 | 705 | 706 | 1 707 | .dylib 708 | 709 | 710 | Contents\MacOS 711 | 1 712 | .dylib 713 | 714 | 715 | Contents\MacOS 716 | 1 717 | .dylib 718 | 719 | 720 | Contents\MacOS 721 | 1 722 | .dylib 723 | 724 | 725 | 0 726 | .bpl 727 | 728 | 729 | 730 | 731 | 0 732 | 733 | 734 | 0 735 | 736 | 737 | 0 738 | 739 | 740 | 0 741 | 742 | 743 | 0 744 | 745 | 746 | Contents\Resources\StartUp\ 747 | 0 748 | 749 | 750 | Contents\Resources\StartUp\ 751 | 0 752 | 753 | 754 | Contents\Resources\StartUp\ 755 | 0 756 | 757 | 758 | 0 759 | 760 | 761 | 762 | 763 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 764 | 1 765 | 766 | 767 | 768 | 769 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 770 | 1 771 | 772 | 773 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 774 | 1 775 | 776 | 777 | 778 | 779 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 780 | 1 781 | 782 | 783 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 784 | 1 785 | 786 | 787 | 788 | 789 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 790 | 1 791 | 792 | 793 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 794 | 1 795 | 796 | 797 | 798 | 799 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 800 | 1 801 | 802 | 803 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 804 | 1 805 | 806 | 807 | 808 | 809 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 810 | 1 811 | 812 | 813 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 814 | 1 815 | 816 | 817 | 818 | 819 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 820 | 1 821 | 822 | 823 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 824 | 1 825 | 826 | 827 | 828 | 829 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 830 | 1 831 | 832 | 833 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 834 | 1 835 | 836 | 837 | 838 | 839 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 840 | 1 841 | 842 | 843 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 844 | 1 845 | 846 | 847 | 848 | 849 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 850 | 1 851 | 852 | 853 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 854 | 1 855 | 856 | 857 | 858 | 859 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 860 | 1 861 | 862 | 863 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 864 | 1 865 | 866 | 867 | 868 | 869 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 870 | 1 871 | 872 | 873 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 874 | 1 875 | 876 | 877 | 878 | 879 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 880 | 1 881 | 882 | 883 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 884 | 1 885 | 886 | 887 | 888 | 889 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 890 | 1 891 | 892 | 893 | ..\$(PROJECTNAME).launchscreen\Assets\LaunchScreenImage.imageset 894 | 1 895 | 896 | 897 | 898 | 899 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 900 | 1 901 | 902 | 903 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 904 | 1 905 | 906 | 907 | 908 | 909 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 910 | 1 911 | 912 | 913 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 914 | 1 915 | 916 | 917 | 918 | 919 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 920 | 1 921 | 922 | 923 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 924 | 1 925 | 926 | 927 | 928 | 929 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 930 | 1 931 | 932 | 933 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 934 | 1 935 | 936 | 937 | 938 | 939 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 940 | 1 941 | 942 | 943 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 944 | 1 945 | 946 | 947 | 948 | 949 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 950 | 1 951 | 952 | 953 | ..\$(PROJECTNAME).launchscreen\Assets\AppIcon.appiconset 954 | 1 955 | 956 | 957 | 958 | 959 | 1 960 | 961 | 962 | 1 963 | 964 | 965 | 966 | 967 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 968 | 1 969 | 970 | 971 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 972 | 1 973 | 974 | 975 | 976 | 977 | ..\ 978 | 1 979 | 980 | 981 | ..\ 982 | 1 983 | 984 | 985 | 986 | 987 | 1 988 | 989 | 990 | 1 991 | 992 | 993 | 1 994 | 995 | 996 | 997 | 998 | ..\$(PROJECTNAME).launchscreen 999 | 64 1000 | 1001 | 1002 | ..\$(PROJECTNAME).launchscreen 1003 | 64 1004 | 1005 | 1006 | 1007 | 1008 | 1 1009 | 1010 | 1011 | 1 1012 | 1013 | 1014 | 1 1015 | 1016 | 1017 | 1018 | 1019 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1020 | 1 1021 | 1022 | 1023 | ..\$(PROJECTNAME).app.dSYM\Contents\Resources\DWARF 1024 | 1 1025 | 1026 | 1027 | 1028 | 1029 | ..\ 1030 | 1 1031 | 1032 | 1033 | ..\ 1034 | 1 1035 | 1036 | 1037 | ..\ 1038 | 1 1039 | 1040 | 1041 | 1042 | 1043 | Contents 1044 | 1 1045 | 1046 | 1047 | Contents 1048 | 1 1049 | 1050 | 1051 | Contents 1052 | 1 1053 | 1054 | 1055 | 1056 | 1057 | Contents\Resources 1058 | 1 1059 | 1060 | 1061 | Contents\Resources 1062 | 1 1063 | 1064 | 1065 | Contents\Resources 1066 | 1 1067 | 1068 | 1069 | 1070 | 1071 | library\lib\armeabi-v7a 1072 | 1 1073 | 1074 | 1075 | library\lib\arm64-v8a 1076 | 1 1077 | 1078 | 1079 | 1 1080 | 1081 | 1082 | 1 1083 | 1084 | 1085 | 1 1086 | 1087 | 1088 | 1 1089 | 1090 | 1091 | Contents\MacOS 1092 | 1 1093 | 1094 | 1095 | Contents\MacOS 1096 | 1 1097 | 1098 | 1099 | Contents\MacOS 1100 | 1 1101 | 1102 | 1103 | 0 1104 | 1105 | 1106 | 1107 | 1108 | library\lib\armeabi-v7a 1109 | 1 1110 | 1111 | 1112 | 1113 | 1114 | 1 1115 | 1116 | 1117 | 1 1118 | 1119 | 1120 | 1121 | 1122 | Assets 1123 | 1 1124 | 1125 | 1126 | Assets 1127 | 1 1128 | 1129 | 1130 | 1131 | 1132 | Assets 1133 | 1 1134 | 1135 | 1136 | Assets 1137 | 1 1138 | 1139 | 1140 | 1141 | 1142 | 1143 | 1144 | 1145 | 1146 | 1147 | 1148 | 1149 | 1150 | 1151 | 1152 | 1153 | True 1154 | True 1155 | True 1156 | True 1157 | False 1158 | True 1159 | True 1160 | 1161 | 1162 | 12 1163 | 1164 | 1165 | 1166 | 1167 |
1168 | -------------------------------------------------------------------------------- /TestApplication/ConsoleHandleTestApp.res: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/LilyStilson/CaptureConsoleOutput/25d5d086a65591901baaa822e78ec31fe898f345/TestApplication/ConsoleHandleTestApp.res -------------------------------------------------------------------------------- /TestApplication/MainUnit.fmx: -------------------------------------------------------------------------------- 1 | object Form1: TForm1 2 | Left = 0 3 | Top = 0 4 | Caption = 'Conole Handle Test App' 5 | ClientHeight = 457 6 | ClientWidth = 860 7 | FormFactor.Width = 320 8 | FormFactor.Height = 480 9 | FormFactor.Devices = [Desktop] 10 | DesignerMasterStyle = 0 11 | object Button1: TButton 12 | Align = Top 13 | Margins.Left = 8.000000000000000000 14 | Margins.Top = 8.000000000000000000 15 | Margins.Right = 8.000000000000000000 16 | Position.X = 8.000000000000000000 17 | Position.Y = 8.000000000000000000 18 | Size.Width = 844.000000000000000000 19 | Size.Height = 22.000000000000000000 20 | Size.PlatformDefault = False 21 | TabOrder = 1 22 | Text = 'Execute' 23 | OnClick = Button1Click 24 | end 25 | object Memo1: TMemo 26 | Touch.InteractiveGestures = [Pan, LongTap, DoubleTap] 27 | DataDetectorTypes = [] 28 | Align = Client 29 | Margins.Left = 8.000000000000000000 30 | Margins.Top = 8.000000000000000000 31 | Margins.Right = 8.000000000000000000 32 | Margins.Bottom = 8.000000000000000000 33 | Size.Width = 844.000000000000000000 34 | Size.Height = 411.000000000000000000 35 | Size.PlatformDefault = False 36 | TabOrder = 0 37 | Viewport.Width = 840.000000000000000000 38 | Viewport.Height = 407.000000000000000000 39 | end 40 | end 41 | -------------------------------------------------------------------------------- /TestApplication/MainUnit.pas: -------------------------------------------------------------------------------- 1 | unit MainUnit; 2 | 3 | interface 4 | 5 | uses 6 | System.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants, System.Threading, 7 | FMX.Types, FMX.Controls, FMX.Forms, FMX.Graphics, FMX.Dialogs, 8 | FMX.Memo.Types, FMX.StdCtrls, FMX.Controls.Presentation, FMX.ScrollBox, 9 | FMX.Memo, FMX.Objects, FMX.Layouts, CaptureConsoleUnit; 10 | 11 | type 12 | TForm1 = class(TForm) 13 | Button1: TButton; 14 | Memo1: TMemo; 15 | procedure Button1Click(Sender: TObject); 16 | private 17 | { Private declarations } 18 | public 19 | { Public declarations } 20 | end; 21 | 22 | var 23 | Form1: TForm1; 24 | 25 | implementation 26 | 27 | {$R *.fmx} 28 | 29 | procedure TForm1.Button1Click(Sender: TObject); 30 | begin 31 | TTask.Run(procedure begin 32 | CaptureConsoleOutputSync({$IFDEF MSWINDOWS}'ping google.com'{$ELSE MACOS}'ping -c 4 google.com'{$ENDIF}, 33 | procedure (const Line: String) begin 34 | Memo1.Lines.Add(Line); 35 | Memo1.GoToTextEnd; 36 | end); 37 | end); 38 | end; 39 | 40 | end. 41 | --------------------------------------------------------------------------------