Новости Win API VCL Прочее Железо
  1. Как определить букву CD-ROM ?
  2. Как определить серийный номер HDD ?
  3. Как выдвинуть дверцу CD-ROM'а?
  4. Как программно включить/выключить монитор ?
  5. Как переключить компьютер в спящий режим?
  6. Как определить, какие диски есть и какого типа?
  7. Как определить имена установленых Com-портов?
  8. Как опеределить состояние модема под Win32?
  9. Как проверить готовность диска без появления окна ошибки Windows?
  10. Как определить подключен ли компьютер к сети?
  11. Как узнать серийный номер аудио CD?
  12. Как узнать есть ли в заданном CD-ROM'е Audio CD?
  13. Как найти все компьютеры в рабочей группе?
  14. Как программно выключить компьютер (даже если к нему подключены другие пользователи или работает DOS-программа)?

 

Как определить букву CD-ROM ?

procedure TForm1.Button1Click(Sender: TObject);
var

    w:dword;
    Root:string;
    i:integer;

begin
  w:=GetLogicalDrives;
  Root := '#:\';
  for i := 0 to 25 do
       begin
         Root[1] := Char(Ord('A')+i);
         if (W and (1 shl i))>0 then
              if GetDriveType(Pchar(Root)) = DRIVE_CDROM then
                   Form1.Label1.Caption:=Root;
        end;

end;

- назад -

Как определить серийный номер HDD ?

procedure TForm1.Button1Click(Sender: TObject);
var
    SerialNum:Pdword;
     a,b:Dword;
     buffer:array [0..255] of char;

begin
  new(SerialNum);
  if getVolumeInformation('c:\',buffer,sizeof(buffer),SerialNum,a,b,nil,0) then
  label1.Caption:=IntToStr(SerialNum^);
  Dispose(SerialNum);

end;

P.S.: на самом деле определяет серийный номер раздела(ов) на HDD, например 
диск С: есть логический раздел винта. Серийный номер, получаемый вышеописанным способом, есть серийный номер логического раздела , который формирует  прога Format и ей подобные, и ничего обсчего с серийным номером HDD не имеет.
    Под ДОС данный S/N HDD получается путем прямого обращения к протам контроллера HDD (см. прогу IDInfo, для IDE винтов). Под W95/98 такая фишка прокатывает только через vxd-драйвер.
    Под Delphi5 есть набор компонентов TVichW32 в котором есть функция определения S/N HDD и много много другого.

          С уважением, Мельченков Дмитрий.

- назад -

Как выдвинуть дверцу CD-ROM'а?

uses ...,mmsystem;
.....
begin
     .....
   mciSendString('Set cdaudio Door Open Wait', nil, 0, handle);
     ..... 
end;

- назад -

Как программно включить/выключить монитор ?

// Отключить :
SendMessage(Application.Handle, WM_SYSCOMMAND,  SC_MONITORPOWER, 0);

// Включить :
SendMessage(Application.Handle, WM_SYSCOMMAND, SC_MONITORPOWER, -1);

- назад -

Как переключить компьютер в спящий режим?

// win 95/98 :
SetSystemPowerState(Suspended, Mode: Boolean):boolean;
// Suspended : true - в спячку, false - назад
// Mode : true - безусловный, false - может быть получен отказ.

- назад -

Как определить, какие диски есть и их тип?

//проверяет существование указанного диска
function DriveExists(Drive:Byte):Boolean;
var

Drives: set of 0..25;
begin
  integer(Drives):=GetLogicalDrives;
  Result:=Drive in Drives
end;

// возвращает тип диска, если диск есть
function CheckDriveType(Drive: Byte): string;
var

   DriveLetter: Char;
   DriveType: UInt;
begin
  DriveLetter:=Chr(Drive + $41);
  DriveType:=GetDriveType(PChar(DriveLetter + ':\'));
  Case DriveType of
         0 : Result:='?';
         1 : Result:='Path does not exists';
         DRIVE_REMOVABLE: Result:='Removable';
         DRIVE_FIXED : Result:='Fixed';
         DRIVE_REMOTE : Result:='Remote';
         DRIVE_CDROM : Result:='CD_ROM';
         DRIVE_RAMDISK : Result:='RAMDISK'
         else Result:='Unknown'
    end
end;

- назад -

Как определить имена установленых Com-портов?

// Из реестра. См. пример.
// Пример:

uses Registry;
procedure TForm1.Button1Click(Sender: TObject);
var

    reg : TRegistry;
    ts : TStrings;
    i : integer;
begin
   reg := TRegistry.Create;
   reg.RootKey := HKEY_LOCAL_MACHINE;
   reg.OpenKey('hardware\devicemap\serialcomm',
             false);
   ts := TStringList.Create;
   reg.GetValueNames(ts);
   for i := 0 to ts.Count -1 do begin
        Memo1.Lines.Add(reg.ReadString(ts.Strings[i]));
       end;
   ts.Free;
   reg.CloseKey;
   reg.free;
end;

- назад -

Как опеределить состояние модема под Win32?

// может не работать с определенными программами и драйверами
procedure TForm1.Button1Click(Sender: TObject);
var

   CommPort : string;
   hCommFile : THandle;
   ModemStat : DWord;
begin
   CommPort := 'COM2';

  {Open the comm port}
   hCommFile := CreateFile(PChar(CommPort),
                           GENERIC_READ,
                           0,
                           nil,
                           OPEN_EXISTING,
                           FILE_ATTRIBUTE_NORMAL,
                           0);
   if hCommFile = INVALID_HANDLE_VALUE then
   begin
     ShowMessage('Не могу открыть  '+ CommPort);
     exit;
   end;

  {Get the Modem Status}
   if GetCommModemStatus(hCommFile, ModemStat) <> false then begin
     if ModemStat and MS_CTS_ON <> 0 then
       ShowMessage('The CTS (clear-to-send) is on.');
     if ModemStat and MS_DSR_ON <> 0 then
       ShowMessage('The DSR (data-set-ready) is on.');
     if ModemStat and MS_RING_ON <> 0then
       ShowMessage('The ring indicator is on.');
     if ModemStat and MS_RLSD_ON <> 0 then
       ShowMessage('The RLSD (receive-line-signal-detect) is
on.');
end;

  {Close the comm port}
   CloseHandle(hCommFile);
end;

- назад -

Как проверить готовность диска без появления окна ошибки Windows?

// Вы можете использовать функцию Windows API SetErrorMode()
// для отключения диалога Window's critical Error.


function IsDriveReady(DriveLetter : char) : bool;
   var

     OldErrorMode : Word;
     OldDirectory : string;
begin
      OldErrorMode := SetErrorMode(SEM_NOOPENFILEERRORBOX);
       GetDir(0, OldDirectory);
       {$I-}
        ChDir(DriveLetter + ':\');
       {$I+}
        if IoResult <> 0 then  Result := False
           else  Result := True;

       ChDir(OldDirectory);
        SetErrorMode(OldErrorMode);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
if not IsDriveReady('A') then  ShowMessage('Диск не готов')

                else    ShowMessage('Диск готов');
end;

- назад -

Как определить подключен ли компьютер к сети?

// Воспользуйтесь функцией GetSystemMetrics(),
// переслав ей флаг SM_NETWORK.


procedure TForm1.Button1Click(Sender: TObject);
begin
     if GetSystemMetrics(SM_NETWORK) AND $01 = $01 then
                 ShowMessage('Компьютер подключен к сети') else
       ShowMessage('Компьютер не подключен к сети');
  end;

- назад -

Как узнать серийный номер аудио CD?

// CD может иметь или не иметь серийный номер
// и/или универсальный код продукта (Universal Product Code).
// MCI-расширение Windows предоставляет эту информации
// с помощью комманды MCI_INFO_MEDIA_IDENTITY command
// Эта команда возвращает уникальную ID-строку.


uses MMSystem, MPlayer;

procedure TForm1.Button1Click(Sender: TObject);
var
mp : TMediaPlayer;
msp : TMCI_INFO_PARMS;
MediaString : array[0..255] of char;
ret : longint;
begin
mp := TMediaPlayer.Create(nil);
mp.Visible := false;
mp.Parent := Application.MainForm;
mp.Shareable := true;
mp.DeviceType := dtCDAudio;
        {имя cd-привода}
mp.FileName := 'D:';
mp.Open;
Application.ProcessMessages;
FillChar(MediaString, sizeof(MediaString), #0);
FillChar(msp, sizeof(msp), #0);
msp.lpstrReturn := @MediaString;
msp.dwRetSize := 255;
ret := mciSendCommand(Mp.DeviceId, MCI_INFO, MCI_INFO_MEDIA_IDENTITY,
longint(@msp));
if Ret <> 0 then
begin
MciGetErrorString(ret, @MediaString, sizeof(MediaString));
Memo1.Lines.Add(StrPas(MediaString));
end
else
Memo1.Lines.Add(StrPas(MediaString));
mp.Close;
Application.ProcessMessages;
mp.free;
end;
end.

- назад -

Как узнать есть ли в заданном CD-ROM'е Audio CD?

function IsAudioCD(Drive : char) : bool;
var

   DrivePath : string;
   MaximumComponentLength : DWORD;
    FileSystemFlags : DWORD;
    VolumeName : string;
Begin
  result := false;
  DrivePath := Drive + ':\';
   if GetDriveType(PChar(DrivePath)) <> DRIVE_CDROM
                    then exit;
   SetLength(VolumeName, 64);
   GetVolumeInformation(PChar(DrivePath),PChar(VolumeName),
         Length(VolumeName),nil,MaximumComponentLength,FileSystemFlags,nil,0);
   if lStrCmp(PChar(VolumeName),'Audio CD') = 0 then result := true;
end;

- назад -

Как найти все компьютеры в рабочей группе?

var
  Computer : Array[1..500] of String[25];
  ComputerCount : Integer;

procedure FindAllComputers(Workgroup: String);
Var
  EnumHandle : THandle;
  WorkgroupRS : TNetResource;
  Buf : Array[1..500] of TNetResource;
  BufSize : Integer;
  Entries : Integer;
  Result : Integer;

begin
  ComputerCount := 0;
  Workgroup := Workgroup + #0;
  FillChar(WorkgroupRS, SizeOf(WorkgroupRS) , 0);
  With WorkgroupRS do begin
     dwScope := 2;
     dwType := 3;
     dwDisplayType := 1;
     dwUsage := 2;
     lpRemoteName := @Workgroup[1];
  end;

WNetOpenEnum( RESOURCE_GLOBALNET,
      RESOURCETYPE_ANY, 0, @WorkgroupRS,
       EnumHandle );

Repeat
  Entries := 1;
  BufSize := SizeOf(Buf);

  Result :=
  WNetEnumResource( EnumHandle,
  Entries, @Buf, BufSize );
  If (Result = NO_ERROR) and (Entries = 1) then begin
      Inc( ComputerCount );
      Computer[ ComputerCount ] := StrPas(Buf[1].lpRemoteName);
  end;
Until (Entries <> 1) or (Result <> NO_ERROR);

WNetCloseEnum( EnumHandle );
end; { Find All Computers }

- назад -

Как программно выключить компьютер (даже если к нему подключены другие пользователи или работает DOS-программа)?

// Проверено по Вин95 (M.Scheduler M_Scheduler@Yahoo.com)
// Пример:

if not ExitWindowsEx(EWX_Force or EWX_PowerOff or EWX_ShutDown, 0) then
    MessageBox(0, 'An application refused to terminate', 'Win32', MB_OK);

- назад -