Delphi (7.) - Syst. repro a autodestrukce souboru

Nashromáždil jsem pro Vás zase nějaké zajímavé zdrojáky. Dnes budu psát o tom jak využít systémový reproduktor, tzv. beeper. Pokud jste zvyklí z Pascalu na funkci sound(), tak asi máte smůlu, protože ta v Delphi nefunguje. Teď vám poradím, jak na to...

Systémový reproduktor

1) Využití přímých vstupů na port:

procedure AsmShutUp; pascal;
begin
asm
  MOV AL, 0
  OUT $61, AL
end;
end;

procedure AsmBeep (Freq: Word); pascal;
begin
asm
  MOV AL, 3
  OUT $61, AL
  MOV AL, $B6
  OUT $43, AL
  MOV AX, Freq
  OUT $42, AL
  MOV AL, AH
  OUT $42, AL
end;
end;

Tohle jsou procedury v assembleru a jejich volání je jednoduché. Stačí jen napsat:

  AsmBeep(Word(1193181 Div LongInt(Freq)));
Tento program je ale použitelný jen pro Win9x a WinME. Windows NT, 2k a XP přímé psaní na porty z důvodu bezpečnosti prostě ignorují.


2) K využítí Windowsovského "cinknutí", slouží procedura

  Windows.Beep(frekvence,trvání);

Autodestrukce *.exe souboru

Tato procedura vytvoří dávkový soubor, který smaže aplikaci a ukončí program. Našel jsem to někde v diskusi na netu a napadlo mě, že by to mohlo někomu ušetřit spoustu přemýšlení nad autodestrukcí exe souboru...

procedure DeleteMe;
  var 
  BatchFile:TextFile;
  BatchFileName:String;
  ProcessInfo:TProcessInformation;
  StartUpInfo:TStartupInfo;
begin
  // vytvořit dávkový soubor
  BatchFileName:=ExtractFilePath(application.exename)+'$$336699.bat';

  AssignFile(BatchFile, BatchFileName);
  Rewrite(BatchFile);

  Writeln(BatchFile, ':try');
  Writeln(BatchFile, 'del "' + application.exename + '"');
  Writeln(BatchFile, 'if exist "' + application.exename + '"' + ' goto try');
  Writeln(BatchFile, 'del "' + BatchFileName + '"');
  CloseFile(BatchFile);

  FillChar(StartUpInfo, SizeOf(StartUpInfo), $00);
  StartUpInfo.dwFlags := STARTF_USESHOWWINDOW;
  StartUpInfo.wShowWindow := SW_HIDE;

  if CreateProcess(nil, PChar(BatchFileName), nil, nil,False, IDLE_PRIORITY_CLASS, 
    nil, nil, StartUpInfo, ProcessInfo) then
  begin
    CloseHandle(ProcessInfo.hThread);
    CloseHandle(ProcessInfo.hProcess);
  end;
  Close;
end;

Vyšlo 15.12.2001, v blogu: 0 1 2 3 4 5 6 7 8

Děkuji, že jste se rozhodl(a) přečíst tento článek. Budu rád i za komentář. Pokud Vás tento článek zaujal a rádi byste jej doporučili ostatním, podpořte mně prosím tím, že věnujete minutku svého času a uděláte mi reklamu na linkuj.cz, vybrali.sme.sk či jagg.cz. Přeji příjemné čtení

Poslední články

Diskuse k blogu

Zatím nikdo nevložil komentář. Chcete být první? Přidání příspěvku
©PC-guru.cz 2000-2008 | Optimalizováno pro 1024*768