Initial
Исходный код версии 2.0
This commit is contained in:
		
							
								
								
									
										368
									
								
								sources/cdejecter/__history/cdejecter.lpr;80
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										368
									
								
								sources/cdejecter/__history/cdejecter.lpr;80
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,368 @@ | ||||
| program cdejecter; | ||||
| {$mode delphi} | ||||
| {$codepage UTF8} | ||||
| uses Interfaces, Classes, SysUtils, CustApp, ANBFormatString, dynlibs, LazUTF8Classes, cde_dir, cde_lang, | ||||
|      cde_types, ParamsMngr, cde_kernel, LazUTF8; | ||||
| type | ||||
|   { TCDEjecter } | ||||
|   TCDEjecter = class(TCustomApplication) | ||||
|   protected | ||||
|    procedure DoRun; override; | ||||
|   public | ||||
|    constructor Create(TheOwner: TComponent); OVERRIDE; | ||||
|    destructor Destroy; OVERRIDE; | ||||
|    procedure WriteHelp; VIRTUAL; | ||||
|    procedure ListDiscs (const Extendend: Boolean); | ||||
|    function CheckIFEmpty (const ADisc: String): Boolean; | ||||
|    procedure GetALLDriveState; | ||||
|    procedure GetDriveState (const ADisc: String); | ||||
|    function FormatDiscInfo (const AString: String; const AInfo: TDiscInfo): String; | ||||
|    procedure ShowDiscInfo (const ADisc: String); | ||||
|    procedure EjectDisc (const ADisc: String); | ||||
|    procedure CloseDisc (const ADisc: String); | ||||
|    procedure BuildTitle; | ||||
|   end; | ||||
| { TCDEjecter } | ||||
| procedure TCDEjecter.DoRun; | ||||
| var isHandled: Boolean; | ||||
| begin | ||||
| BuildTitle; | ||||
| isHandled:= False; | ||||
| if HasParam('list') then | ||||
|  begin | ||||
|  isHandled:= True; | ||||
|  ListDiscs(False); | ||||
|  end; | ||||
| if HasParam('listex') then | ||||
|  begin | ||||
|  isHandled:= True; | ||||
|  ListDiscs(True); | ||||
|  end; | ||||
| if HasParam('stateall') then | ||||
|  begin | ||||
|  isHandled:= True; | ||||
|  GetALLDriveState; | ||||
|  end; | ||||
| if HasParam('state') then | ||||
|  begin | ||||
|  isHandled:= True; | ||||
|  GetDriveState(GetParamValue('state')); | ||||
|  end; | ||||
| if HasParam('info') then | ||||
|  begin | ||||
|  isHandled:= True; | ||||
|  ShowDiscInfo(GetParamValue('info')); | ||||
|  end; | ||||
| if HasParam('eject') then | ||||
|  begin | ||||
|  isHandled:= True; | ||||
|  EjectDisc(GetParamValue('eject')); | ||||
|  end; | ||||
| if HasParam('close') then | ||||
|  begin | ||||
|  isHandled:= True; | ||||
|  CloseDisc(GetParamValue('close')); | ||||
|  end; | ||||
| if not isHandled then | ||||
|  WriteHelp; | ||||
| // stop program loop | ||||
| Terminate; | ||||
| end; | ||||
| constructor TCDEjecter.Create(TheOwner: TComponent); | ||||
| begin | ||||
| inherited Create (TheOwner); | ||||
| StopOnException:= True; | ||||
| end; | ||||
| destructor TCDEjecter.Destroy; | ||||
| begin | ||||
| inherited Destroy; | ||||
| end; | ||||
| procedure TCDEjecter.WriteHelp; | ||||
| begin | ||||
| writeln(FormatStr(GetLocalizedString(cde_messages_help), ['$newline$'], [#13#10])); | ||||
| end; | ||||
| procedure TCDEjecter.ListDiscs (const Extendend: Boolean); | ||||
| var DLL: TLibHandle; | ||||
|     GetCDDiscs: function: PChar; | ||||
|     GetVolumeInfo: function (const ADisc: WideChar): TDiscInfo; | ||||
|     SL: TStringListUTF8; | ||||
|     Msg: String; | ||||
|     Indx: Integer; | ||||
|     DInfo: TDiscInfo; | ||||
| begin | ||||
| Msg:= ''; | ||||
| SL:= TStringListUTF8.Create; | ||||
| DLL:= SafeLoadLibrary(CDELib); | ||||
| GetCDDiscs:= GetProcAddress(DLL, 'GetCDDiscs'); | ||||
| GetVolumeInfo:= GetProcAddress(DLL, 'GetVolumeInfo'); | ||||
| SL.Delimiter:= ';'; | ||||
| SL.DelimitedText:= GetCDDiscs; | ||||
| if SL.Count > 0 then | ||||
|  for Indx:= 0 to SL.Count - 1 do | ||||
|   begin | ||||
|   DInfo:= GetVolumeInfo(WideChar(SL[Indx][1])); | ||||
|   if not (Trim(Msg) = '') then | ||||
|    Msg:= Msg + #13#10; | ||||
|   Msg:= Msg + SL[Indx]; | ||||
|   if Extendend then | ||||
|    if DInfo.diHasInfo then | ||||
|     Msg:= Msg + ' - ' + DInfo.diVolumeName | ||||
|     else | ||||
|     Msg:= Msg + ' - ' + GetLocalizedString(cde_messages_nodiscorempty); | ||||
|   end; | ||||
| FreeLibrary(DLL); | ||||
| SL.Free; | ||||
| WriteLn(GetLocalizedString(cde_messages_discslist)); | ||||
| WriteLn(Msg); | ||||
| end; | ||||
| function TCDEjecter.CheckIFEmpty (const ADisc: String): Boolean; | ||||
| begin | ||||
| Result:= False; | ||||
| if Trim(ADisc) = '' then | ||||
|  WriteLn(GetLocalizedString(cde_messages_errornoparameters)) | ||||
|  else | ||||
|  Result:= True; | ||||
| end; | ||||
| procedure TCDEjecter.GetALLDriveState; | ||||
|  procedure WriteDiscState (const ADLL: TLibHandle; const ADisc: WideChar); | ||||
|  var GetDiscState: function (const ADisc: WideChar): TDiscState; | ||||
|      GetVolumeInfo: function (const ADisc: WideChar): TDiscInfo; | ||||
|      Msg: String; | ||||
|      DInfo: TDiscInfo; | ||||
|      DS: TDiscState; | ||||
|  begin | ||||
|  DInfo.diDrive:= ADisc; | ||||
|  GetDiscState:= GetProcAddress(ADLL, 'GetDiscState'); | ||||
|  DS:= GetDiscState(ADisc); | ||||
|  Msg:= GetLocalizedString(cde_messages_statealltext); | ||||
|  case DS of | ||||
|   dsNormal: begin | ||||
|             GetVolumeInfo:= GetProcAddress(ADLL, 'GetVolumeInfo'); | ||||
|             DInfo:= GetVolumeInfo(ADisc); | ||||
|             Msg:= Msg + GetLocalizedString(cde_discstate_normal); | ||||
|             end; | ||||
|   dsEmpty: Msg:= Msg + GetLocalizedString(cde_discstate_empty); | ||||
|   dsUnFormatted: Msg:= Msg + GetLocalizedString(cde_discstate_unformatted); | ||||
|   dsNIL: Msg:= Msg + GetLocalizedString(cde_discstate_nil); | ||||
|   end; | ||||
|  WriteLn(FormatDiscInfo(Msg, DInfo)); | ||||
|  end; | ||||
| var DLL: TLibHandle; | ||||
|     GetCDDiscs: function: PChar; | ||||
|     SL: TStringListUTF8; | ||||
|     Indx: Integer; | ||||
| begin | ||||
| WriteLn(GetLocalizedString(cde_messages_statealltitle)); | ||||
| SL:= TStringListUTF8.Create; | ||||
| DLL:= SafeLoadLibrary(CDELib); | ||||
| GetCDDiscs:= GetProcAddress(DLL, 'GetCDDiscs'); | ||||
| SL.Delimiter:= ';'; | ||||
| SL.DelimitedText:= GetCDDiscs; | ||||
| if SL.Count > 0 then | ||||
|  for Indx:= 0 to SL.Count - 1 do | ||||
|   WriteDiscState(DLL, WideChar(SL[Indx][1])); | ||||
| FreeLibrary(DLL); | ||||
| FreeAndNil(SL); | ||||
| end; | ||||
| procedure TCDEjecter.GetDriveState (const ADisc: String); | ||||
| var DLL: TLibHandle; | ||||
|     GetDiscState: function (const ADisc: WideChar): TDiscState; | ||||
|     GetVolumeInfo: function (const ADisc: WideChar): TDiscInfo; | ||||
|     Msg: String; | ||||
|     DInfo: TDiscInfo; | ||||
|     DS: TDiscState; | ||||
| begin | ||||
| DInfo.diDrive:= ADisc[1]; | ||||
| WriteLn(FormatDiscInfo(GetLocalizedString(cde_messages_statetitle), DInfo)); | ||||
| if CheckIFEmpty(ADisc) then | ||||
|  begin | ||||
|  DLL:= SafeLoadLibrary(CDELib); | ||||
|  GetDiscState:= GetProcAddress(DLL, 'GetDiscState'); | ||||
|  DS:= GetDiscState(WideChar(ADisc[1])); | ||||
|  Msg:= GetLocalizedString(cde_messages_statetext); | ||||
|  case DS of | ||||
|   dsNormal: begin | ||||
|             GetVolumeInfo:= GetProcAddress(DLL, 'GetVolumeInfo'); | ||||
|             DInfo:= GetVolumeInfo(WideChar(ADisc[1])); | ||||
|             Msg:= Msg + GetLocalizedString(cde_discstate_normal); | ||||
|             end; | ||||
|   dsEmpty: Msg:= Msg + GetLocalizedString(cde_discstate_empty); | ||||
|   dsUnFormatted: Msg:= Msg + GetLocalizedString(cde_discstate_unformatted); | ||||
|   dsNIL: Msg:= Msg + GetLocalizedString(cde_discstate_nil); | ||||
|   end; | ||||
|  FreeLibrary(DLL); | ||||
|  WriteLn(FormatDiscInfo(Msg, DInfo)); | ||||
|  end; | ||||
| end; | ||||
| function TCDEjecter.FormatDiscInfo (const AString: String; const AInfo: TDiscInfo): String; | ||||
|  function GetPercentFree: Byte; | ||||
|  begin | ||||
|  Result:= round((AInfo.diDiscFree / AInfo.diDiscSize) * 100); | ||||
|  end; | ||||
| begin | ||||
| Result:= FormatStr(AString, | ||||
|                             ['$newline$', | ||||
|                              '$letter$', | ||||
|                              '$volumename$', | ||||
|                              '$filesystem$', | ||||
|                              '$serial$', | ||||
|                              '$discsizebyte$', | ||||
|                              '$discsize$', | ||||
|                              '$discfreebyte$', | ||||
|                              '$discfree$', | ||||
|                              '$discfreepercent$', | ||||
|                              '$discbusybyte$', | ||||
|                              '$discbusy$', | ||||
|                              '$discbusypercent$' | ||||
|                             ], | ||||
|                             [#13#10, | ||||
|                              AInfo.diDrive, | ||||
|                              AInfo.diVolumeName, | ||||
|                              AInfo.diFileSystem, | ||||
|                              IntToStr(AInfo.diSerial), | ||||
|                              CDEFileSize2Str(AInfo.diDiscSize, True), | ||||
|                              CDEFileSize2Str(AInfo.diDiscSize, False), | ||||
|                              CDEFileSize2Str(AInfo.diDiscFree, True), | ||||
|                              CDEFileSize2Str(AInfo.diDiscFree, False), | ||||
|                              IntToStr(GetPercentFree) + '%', | ||||
|                              CDEFileSize2Str(AInfo.diDiscSize - AInfo.diDiscFree, True), | ||||
|                              CDEFileSize2Str(AInfo.diDiscSize - AInfo.diDiscFree, False), | ||||
|                              IntToStr(100 - GetPercentFree) + '%' | ||||
|                             ]); | ||||
| end; | ||||
| procedure TCDEjecter.ShowDiscInfo (const ADisc: String); | ||||
| var DLL: TLibHandle; | ||||
|     GetVolumeInfo: function (const ADisc: WideChar): TDiscInfo; | ||||
|     Msg: String; | ||||
|     DInfo: TDiscInfo; | ||||
| begin | ||||
| if CheckIFEmpty(ADisc) then | ||||
|  begin | ||||
|  DLL:= SafeLoadLibrary(CDELib); | ||||
|  GetVolumeInfo:= GetProcAddress(DLL, 'GetVolumeInfo'); | ||||
|  DInfo:= GetVolumeInfo(WideChar(ADisc[1])); | ||||
|  FreeLibrary(DLL); | ||||
|  if DInfo.diHasInfo then | ||||
|   Msg:= FormatDiscInfo(GetLocalizedString(cde_messages_discdesc), DInfo) | ||||
|   else | ||||
|   Msg:= FormatDiscInfo(GetLocalizedString(cde_messages_discdesconerror), DInfo); | ||||
|  WriteLn(GetLocalizedString(cde_messages_discinfo)); | ||||
|  WriteLn(Msg); | ||||
|  end; | ||||
| end; | ||||
| procedure TCDEjecter.EjectDisc (const ADisc: String); | ||||
| var DLL: TLibHandle; | ||||
|     EjectCD: function (const ADisc: WideChar): Boolean; | ||||
|     GetVolumeInfo: function (const ADisc: WideChar): TDiscInfo; | ||||
|     Msg: String; | ||||
|     DInfo: TDiscInfo; | ||||
| begin | ||||
| WriteLn(GetLocalizedString(cde_messages_ejecttitle)); | ||||
| if CheckIFEmpty(ADisc) then | ||||
|  begin | ||||
|  DLL:= SafeLoadLibrary(CDELib); | ||||
|  GetVolumeInfo:= GetProcAddress(DLL, 'GetVolumeInfo'); | ||||
|  EjectCD:= GetProcAddress(DLL, 'EjectCD'); | ||||
|  DInfo.diDrive:= ADisc[1]; | ||||
|  DInfo.diVolumeName:= ADisc; | ||||
|  DInfo:= GetVolumeInfo(WideChar(ADisc[1])); | ||||
|  if EjectCD (WideChar(ADisc[1])) then | ||||
|   Msg:= FormatDiscInfo(GetLocalizedString(cde_messages_ejectsuccess), DInfo) | ||||
|   else | ||||
|   Msg:= FormatDiscInfo(GetLocalizedString(cde_messages_ejecterror), DInfo); | ||||
|  FreeLibrary(DLL); | ||||
|  WriteLn(Msg); | ||||
|  end; | ||||
| end; | ||||
| procedure TCDEjecter.CloseDisc (const ADisc: String); | ||||
| var DLL: TLibHandle; | ||||
|     CloseCD: function (const ADisc: WideChar): Boolean; | ||||
|     Msg: String; | ||||
|     DInfo: TDiscInfo; | ||||
| begin | ||||
| WriteLn(GetLocalizedString(cde_messages_closetitle)); | ||||
| if CheckIFEmpty(ADisc) then | ||||
|  begin | ||||
|  DLL:= SafeLoadLibrary(CDELib); | ||||
|  CloseCD:= GetProcAddress(DLL, 'CloseCD'); | ||||
|  DInfo.diDrive:= ADisc[1]; | ||||
|  if CloseCD (WideChar(ADisc[1])) then | ||||
|   Msg:= FormatDiscInfo(GetLocalizedString(cde_messages_closesuccess), DInfo) | ||||
|   else | ||||
|   Msg:= FormatDiscInfo(GetLocalizedString(cde_messages_closeerror), DInfo); | ||||
|  FreeLibrary(DLL); | ||||
|  WriteLn(Msg); | ||||
|  end; | ||||
| end; | ||||
| procedure TCDEjecter.CreateLink (const ADisc, ALinkName: String); | ||||
|  procedure CreateShortCut(ShortCutName, Parameters, FileName: String); | ||||
|  var ShellObject: IUnknown; | ||||
|      ShellLink: IShellLink; | ||||
|      PersistFile: IPersistFile; | ||||
|      FName: WideString; | ||||
|  begin | ||||
|  ShellObject:= CreateComObject(CLSID_ShellLink); | ||||
|  ShellLink:= ShellObject as IShellLink; | ||||
|  PersistFile:= ShellObject as IPersistFile; | ||||
|  with ShellLink do | ||||
|   begin | ||||
|   SetArguments(PChar(Parameters)); | ||||
|   SetPath(PChar(FileName)); | ||||
|   SetWorkingDirectory(PChar(extractfilepath(FileName))); | ||||
|   FName:= ShortCutName; | ||||
|   PersistFile.Save(PWChar(FName), False); | ||||
|   end; | ||||
|  end; | ||||
| begin | ||||
| WriteLn(FormatStr(GetLocalizedString(cde_messages_createlink), ['$letter$'], [ADisc[1]])); | ||||
| if Trim(ALinkName) = '' then | ||||
|  ALinkName:= FormatStr(GetLocalizedString(cdeg_linkcreation_default), ['$letter$'], [ADisc[1]]); | ||||
| CreateShortCut(ExpandPath(pth_desktop) + LinkName + '.lnk', '/eject="' + DriveInfo.diDrive + '"', GetCDEPath + 'bin\cdejecter.exe'); | ||||
| end; | ||||
| procedure TCDEjecter.BuildTitle; | ||||
|  procedure WriteWord (const AWord: String; const hMaxLength, AMaxLength: Byte; const ASymbol: Char); | ||||
|  var S1, S2: String; | ||||
|      Indx, hLen: Byte; | ||||
|  begin | ||||
|  hLen:= UTF8Length(AWord) div 2; | ||||
|  S1:= ''; | ||||
|  for Indx:= 1 to (hMaxLength - hLen) - 1 do | ||||
|   S1:= S1 + ASymbol; | ||||
|  S1:= S1 + ' '; | ||||
|  S2:= ' '; | ||||
|  for Indx:= (UTF8Length(S1) + UTF8Length(AWord)) + 2 to AMaxLength do | ||||
|   S2:= S2 + ASymbol; | ||||
|  WriteLn(S1 + AWord + S2); | ||||
|  end; | ||||
| var StrT, StrV, StrC, StrABL: String; | ||||
|     MaxLength, hMaxLength, Indx: Byte; | ||||
| const ASymbol: Char = '#'; | ||||
| begin | ||||
| StrT:= 'CD Ejecter'; | ||||
| StrV:= GetLocalizedString(cde_version) + ' ' + GetCDEVerStr('cde'); | ||||
| StrC:= FormatStr(GetLocalizedString(cde_copyrights), ['$DEVYEARS$'], ['2011 - 2017']); | ||||
| MaxLength:= UTF8Length(StrT); | ||||
| if UTF8Length(StrV) > MaxLength then | ||||
|  MaxLength:= UTF8Length(StrV); | ||||
| if UTF8Length(StrC) > MaxLength then | ||||
|  MaxLength:= UTF8Length(StrC); | ||||
| MaxLength:= MaxLength + 8; | ||||
| hMaxLength:= MaxLength div 2; | ||||
| StrABL:= ''; | ||||
| for Indx:= 1 to MaxLength do | ||||
|  StrABL:= StrABL + ASymbol; | ||||
| WriteLn(StrABL); | ||||
| WriteWord(StrT, hMaxLength, MaxLength, ASymbol); | ||||
| WriteWord(StrV, hMaxLength, MaxLength, ASymbol); | ||||
| WriteWord(StrC, hMaxLength, MaxLength, ASymbol); | ||||
| WriteLn(StrABL); | ||||
| WriteLn(''); | ||||
| end; | ||||
| var Application: TCDEjecter; | ||||
| {$R *.res} | ||||
| begin | ||||
| Application:= TCDEjecter.Create(Nil); | ||||
| Application.Title:= 'CD Ejecter'; | ||||
| Application.Run; | ||||
| Application.Free; | ||||
| end. | ||||
		Reference in New Issue
	
	Block a user