All pastes #188599 Raw Edit

pacabel_

public text v1 · immutable
·published 2006-10-02 09:19 UTC
rendered paste body
unit cdorganizer;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, DB, ADODB, IBDatabase, IBCustomDataSet, IBUpdateSQL, IBQuery,
  ComCtrls, ExtCtrls, ToolWin, Menus, ImgList;

type
  TForm1 = class(TForm)
    dbase: TIBDatabase;
    IBTransaction1: TIBTransaction;
    volupdate: TIBUpdateSQL;
    ListView1: TListView;
    TrayIcon1: TTrayIcon;
    MainMenu1: TMainMenu;
    File1: TMenuItem;
    Help1: TMenuItem;
    ToolBar1: TToolBar;
    ToolButton1: TToolButton;
    ToolButton2: TToolButton;
    ToolButton3: TToolButton;
    ToolButton4: TToolButton;
    volume: TIBDataSet;
    files: TIBDataSet;
    directories: TIBDataSet;
    volumeVOLUMEID: TIntegerField;
    volumeVOLUMENAME: TIBStringField;
    volumeLABELNAME: TIBStringField;
    volumeDRIVETYPE: TIntegerField;
    directoriesDIRECTORYNAME: TIBStringField;
    directoriesVOLUMEID: TIntegerField;
    directoriesDIRECTORYID: TIntegerField;
    filesFILEID: TIntegerField;
    filesFILENAME: TIBStringField;
    filesDIRID: TIntegerField;
    filesVOLUMEID: TIntegerField;
    filesDIRECTORYNAME: TIBStringField;
    ImageList1: TImageList;
    dirupdate: TIBUpdateSQL;
    fileupdate: TIBUpdateSQL;
    procedure FormShow(Sender: TObject);
    procedure volumeNewRecord(DataSet: TDataSet);

  private
    procedure onDeviceChange(var wMSG : TMessage); message WM_DeviceChange;
  public
    { Public declarations }
  end;

  const
  DBT_DEVICEARRIVAL = $8000;
  DBT_DEVICEREMOVECOMPLETE = $8004;
  DBTF_MEDIA = $0001;
  DBT_DEVTYP_VOLUME = $0002;

var
  Form1: TForm1;

implementation

{$R *.dfm}

type
pDevBroadcast = ^DEV_BROADCAST_HDR;
DEV_BROADCAST_HDR = record
  dbch_size : DWORD;
  dbch_devicetype : DWORD;
  dbch_reserved : DWORD;
  end;

pDevBroadcastVolume = ^DEV_BROADCAST_VOLUME;
DEV_BROADCAST_VOLUME = record
  dbcv_size : DWORD;
  dbcv_devicetype : DWORD;
  dbcv_reserved : DWORD;
  dbcv_unitmask : DWORD;
  dbcv_flags : WORD;
  end;

pStorageBusType = ^STORAGE_BUS_TYPE;
STORAGE_BUS_TYPE = (BusTypeUnkown, BusTypeScsi, BusTypeAtapi, BustypeAta, BusType1394, BusTypeSsa, BusTypeFibre, BusTypeUsb,BusTypeRAID, BusTypeMaxReserved);

MEDIA_TYPE = (
  Unknown,
  F5_1Pt2_512, 
  F3_1Pt44_512,
  F3_2Pt88_512, 
  F3_20Pt8_512, 
  F3_720_512, 
  F5_360_512, 
  F5_320_512, 
  F5_320_1024,
  F5_180_512, 
  F5_160_512, 
  RemovableMedia, 
  FixedMedia, 
  F3_120M_512,
  F3_640_512,
  F5_640_512, 
  F5_720_512,
  F3_1Pt2_512, 
  F3_1Pt23_1024,
  F5_1Pt23_1024, 
  F3_128Mb_512,
  F3_230Mb_512, 
  F8_256_128,
  F3_200Mb_512, 
  F3_240M_512,
  F3_32M_512
  );

TTapeInfo = record
  STORAGE_MEDIA_TYPE : MEDIA_TYPE;
  MediaCharacteristics : DWORD;
  CurrentBlockSize : DWORD;
  STORAGE_BUS_TYPE : STORAGE_BUS_TYPE;
  MediumType : BYTE;
  DensityCode : BYTE;
end;

TDiskInfo = record
  Cylinders : Large_Integer;
  STORAGE_MEDIA_TYPE : MEDIA_TYPE;
  TracksPerCylinder : DWORD;
  SectorsPerTrack : DWORD;
  BytesPerSector : DWORD;
  NumberMediasides : DWORD;
  MediaCharacteristics : DWORD;
end;

TRemoveableDiskInfo = record
  Cylinders : Large_Integer;
  Storage_Media_Type : MEDIA_TYPE;
  TracksPerCylinder : DWORD;
  SectorsPerTrack : DWORD;
  BytesPerSector : DWORD;
  NumberMediaSides : DWORD;
  MediaCharacteristics : DWORD;
end;

pDeviceMediaInfo = ^DEVICE_MEDIA_INFO;
DEVICE_MEDIA_INFO = record
 DiskInfo : TDiskInfo;
 RemoveableDiskInfo : TRemoveableDiskInfo;
 TapeInfo : TTapeInfo;
end;

pGetMediaTypes = ^GET_MEDIA_TYPES;
GET_MEDIA_TYPES = record
  DeviceType : DWORD;
  MediaInfoCount : DWORD;
  MediaInfo : DEVICE_MEDIA_INFO;
end;

TVolInfo = record
serialNumber : String;
volumeName : String;
end;


function getVolInfo(theDrive: String) : TVolInfo;
var
volumeInfo : TVolInfo;
volName, sysType : PChar;
MaxComLen, sysFlags, volSerNum : DWORD;
begin
  if(getVolumeInformation(PChar(theDrive),volName,1024,@volSerNum,MaxComLen,sysFlags,sysType,1024)) then
  begin
  volumeInfo.serialNumber := IntToStr(volSerNum);
  volumeInfo.volumeName := volName;
  Result := volumeInfo;
  end;
end;



function getDrive(pDrive: PDevBroadCastVolume):String;
var
i : Byte;
uMask:DWORD;
begin
  if (pDrive^.dbcv_flags and DBTF_MEDIA) = DBTF_MEDIA then
  begin

  uMask := pDrive^.dbcv_unitmask;
  for i := 0 to 25 do
    begin
      if(uMask and 1) = 1 then
      Result := Char(i+Ord('A')) + ':';
      uMask := uMask shr 1;
    end;
  end;
end;



procedure getContents(theDrive:String; theQuery:String; theFiles:TStringList; theVolume:String);
var
searchRec:TSearchRec;
result:Integer;
begin
theDrive := IncludeTrailingPathDelimiter(theDrive);
result := findFirst(theDrive+theQuery,faAnyFile,searchRec);
while result = 0 do
begin
if searchRec.Attr and faDirectory = 0 then
  begin
 theFiles.Add(theDrive+searchRec.Name);
  // add files
  end
else if(searchRec.Attr and faDirectory) <> 0 then
    begin
    if(searchRec.Name <> '.') and (searchRec.Name <> '..') then
       begin
    // add directory
    theFiles.Add(theDrive+searchRec.Name+'\');
    getContents(theDrive+searchRec.Name,theQuery,theFiles,'The Volume');
    end;
  end;
result := findNext(searchRec);
end;
findClose(searchRec);
theFiles.SaveToFile('fileList.txt');
end;

procedure TForm1.FormShow(Sender: TObject);
begin
dbase.Open;
end;
        
procedure TForm1.onDeviceChange(var wMSG: TMessage);
var
theDrive, theLabel : String;
theList : TStringList;
volResult : TVolInfo;
newDrive : TListItem;
begin
theList := TStringList.Create;
case wMSG.WParam of
DBT_DEVICEARRIVAL:
if (PDevBroadcast(wMSG.LParam)^.dbch_devicetype = DBT_DEVTYP_VOLUME) then
  begin
  theDrive := getDrive(PDevBroadcastVolume(wMsg.LParam));
  volResult := getVolInfo(theDrive+'\');
  ShowMessage(Self.ClassName);
  newDrive := listview1.Items.add();
  newDrive.Caption := 'test';
  end;
DBT_DEVICEREMOVECOMPLETE: showMessage('CD REMOVED');
end;
end;

procedure TForm1.volumeNewRecord(DataSet: TDataSet);
begin
showMessage('new record');
end;

end.