U.doc

(99 KB) Pobierz
Szablon dla tlumaczy

 

Uzupełnienie 1.                                                                                                                        Specyfikacja funkcji CreateFile() – operacje plikowe

 

             

HANDLE CreateFile(LPCTSTR lpFileName,

                  DWORD dwDesiredAccess,

                  DWORD dwShareMode,

                  LPSECURITY_ATTRIBUTES lpSecurityAttributes,

                  DWORD dwCreationDistribution,

                  DWORD dwFlagsAndAttributes,

                  HANDLE hTemplateFile);

 

Parametry:

 

lpFileName – wskaźnik do ciągu znaków zakończonych zerowym ogranicznikiem (C – łańcucha). Specyfikuje nazwę pliku, zasobów komunikacyjnych, potoku, urządzenia dyskowego (NT), połączenia sieciowego typu konsoli. Jeżeli *lpFileName reprezentuje ścieżkę dostępu, wówczas wartość domyślana długości łańcucha jest ograniczona do MAX_PATH znaków. Pracując w Win NT można pokonać ograniczenie co do długości omawianego ciągu znaków posługując się konwencją nazewnictwa katalogów UNC (ang. Universal Naming Convention). Zgodnie z nią  do identyfikowania nazwy komputera stosowany jest podwójny ukośnik wsteczny \\ (ang. backslash), natomiast pojedynczy ukośnik wsteczny wskazuje katalog na dysku tego komputera np. "\\?\C:\katalog1\katalog2" co zostanie zinterpretowane jako "C:\katalog1\katalog2" lub "\\?\UNC\katalog1\katalog2\katalog3", który to zapis będzie zinterpretowany następująco: "\\katalog1\katalog2\katalog3".                                              

dwDesiredAccess – specyfikacja rodzaju dostępu do obiektu. Parametr ten może być kombinacją następujących wartości.

0 – przyznanie aplikacji aktualnego rodzaju dostępu.

GENERIC_READ – dostęp do odczytu.

GENERIC_WRITE – dostęp do zapisu.

 

dwShareMode – wyszczególnia, w jaki sposób dany obiekt (plik) może być współdzielony.

0 – obiekt nie może być współdzielony.

FILE_SHARE_DELETE              – współdzielenie z operacjami usuwania (Win NT).

FILE_SHARE_READ – tryb współdzielenia z operacjami czytania.

FILE_SHARE_WRITE – tryb współdzielenia z operacjami zapisu.             

 

lpSecurityAttributes – wskaźnik do struktury SECURITY_ATTRIBUTES zawierającej deskryptor zabezpieczeń obiektu i określającej, czy zwracany identyfikator jest dziedziczony.

 

typedef struct _SECURITY_ATTRIBUTES {  

    DWORD  nLength;

    LPVOID lpSecurityDescriptor;

    BOOL   bInheritHandle;

} SECURITY_ATTRIBUTES;

 

nLength – rozmiar struktury w bajtach.

lpSecurityDescriptor – wskaźnik do deskryptora zabezpieczeń obiektu (Win NT). Jeżeli ustalono NULL zostanie wybrana wartość domyślna.

bInheritHandle – wyszczególnia, czy zwracany przez CreateFile() identyfikator jest dziedziczony przy tworzeniu nowego procesu. Wartość TRUE oznacza, że nowy proces dziedziczy ten identyfikator.

 

DwCreationDistribution –  rodzaje operacji wykonywanych na pliku.

CREATE_NEW              – utworzenie nowego pliku. Funkcja nie będzie wykonana pomyślnie, jeżeli plik już istnieje.

CREATE_ALWAYS – utworzenie nowego pliku niezależnie od tego czy już istnieje. Jeżeli plik istnieje, nowy zostanie zapisany na istniejącym.

OPEN_EXISTING – otwarcie istniejącego pliku. Jeżeli plik nie istnieje funkcja nie będzie wykonana pomyślnie.             

OPEN_ALWAYS – otwarcie istniejącego pliku. Jeżeli takowy nie istnieje, zostanie stworzony identycznie jak przy pomocy CREATE_NEW.

TRUNCATE_EXISTING  –  tuż po otwarciu plik jest okrojony do rozmiaru 0 bajtów. Wymagane jest wcześniejsze jego utworzenie przynajmniej z rodzajem dostępu GENERIC_WRITE. Funkcja nie będzie wykonana pomyślnie jeżeli plik nie istnieje.                            

 

dwFlagsAndAttributes – określenie atrybutów i flag pliku.

Atrybut:

FILE_ATTRIBUTE_ARCHIVE – plik powinien zostać zarchiwizowany.

FILE_ATTRIBUTE_COMPRESSED – plik lub katalog jest skompresowany.

FILE_ATTRIBUTE_HIDDEN – plik ukryty.

FILE_ATTRIBUTE_NORMAL – plik nie posiada innych atrybutów. Atrybut jest ważny tylko wówczas, gdy jest używany indywidualnie (bez innych). 

FILE_ATTRIBUTE_OFFLINE – dane zawarte w pliku nie są bezpośrednio udostępniane.

FILE_ATTRIBUTE_READONLY – plik tylko do odczytu.

FILE_ATTRIBUTE_SYSTEM – plik jest częścią lub jest używany wyłącznie przez system operacyjny.

FILE_ATTRIBUTE_TEMPORARY – plik jest używany do czasowego przechowywania. Powinien być usunięty jeżeli nie jest wykorzystywany.                                          

Flaga:

FILE_FLAG_WRITE_THROUGH – zawartość pliku zostaje zapisana pośrednio poprzez bufor.

FILE_FLAG_OVERLAPPED – w przypadku operacji realizowanych w znaczącym przedziale czasu przez funkcje ReadFile(), WriteFile(), ConnectNamedPipe() i TransactNamedPipe(), można oczekiwać komunikatu ERROR_IO_PENDING – realizowana jest operacja nakładanego wejścia /  wyjścia. W tym kontekście musi nastąpić odwołanie do struktury OVERLAPPED zawierającej informacje używane w operacjach nakładanego wejścia / wyjścia.

 

typedef struct _OVERLAPPED {  

    DWORD  Internal;

    DWORD  InternalHigh;

    DWORD  Offset;

    DWORD  OffsetHigh;

    HANDLE hEvent;

} OVERLAPPED;

 

Internal – zarezerwowane  dla systemu operacyjnego. Człon ten staje się istotny, gdy funkcja GetOverlappedResult() zwróci rezultat wykonanej operacji nakładanego wejścia / wyjścia w przypadku pliku, potoku lub urządzenia zewnętrznego.

InternalHigh – zarezerwowane dla systemu. Specyfikuje długość transferowanych danych. Staje się istotny, gdy funkcja GetOverlappedResult() zwraca wartość TRUE.                            

Offset – określa wskaźnik położenia (w)pliku przeznaczonym do transferu. Traktowany jest jako offset wyznaczony w stosunku do początku pliku.

OffsetHigh – część bardziej znacząca offsetu.

 

hEvent – wyszczególnienie sposobu określenia końca transferu danych.

 

FILE_FLAG_NO_BUFFERING – instruuje system operacyjny aby otworzył plik bez pośredniego buforowania jego zawartości. Aplikacja musi spełniać pewne wymagania pracując z plikiem tak otwartym. Najważniejszym z nich jest to, by dane zawarte w pliku były odczytywane w porcjach będących całkowitą wielokrotnością rozmiaru sektora wolumenu[1]. Dla przykładu przy rozmiarze sektora 512 bajtów dane mogą być czytane w porcjach po 512, 1024, 2048 ... bajtów. Uzyskanie informacji o rozmiarze sektora wolumenu może być dostępne dzięki funkcji Win32 API GetDiskFreeSpace(). Przy otwarciu pliku adres bufora używanego do operacji czytania i zapisywania musi być przedstawiony w postaci całkowitej wielokrotności rozmiaru sektora wolumenu. W celu określenia bufora można użyć funkcji VirtualAlloc() ustalającej adres  w postaci całkowitej wielokrotności rozmiaru strony pamięci używanej przez system operacyjny. 

FILE_FLAG_RANDOM_ACCESS – sygnalizuje plik o swobodnym sposobie dostępu. Dostęp do każdego jego elementu możliwy jest przez bezpośrednie wskazanie odpowiedniego adresu danego elementu.

FILE_FLAG_SEQUENTIAL_SCAN – sygnalizuje plik o sekwencyjnym sposobie dostępu.

FILE_FLAG_DELETE_ON_CLOSE – system natychmiast usuwa z pamięci plik po tym jak przydzielony mu identyfikator zostanie zwolniony. Późniejsze operacje otwarcia pliku nie będą wykonywane pomyślnie, chyba że wcześniej tryb współdzielenia został ustalony jako FILE_SHARE_DELETE.

FILE_FLAG_BACKUP_SEMANTICS – podaje czy plik jest otwierany lub utworzony jako kopia zapasowa SE_BACKUP_NAME lub jako plik odzyskany SE_RESTORE_NAME.

FILE_FLAG_POSIX_SEMANTICS – wyszczególnienie rodzaju dostępu do pliku zgodnie z zasadami POSIX[2].

Funkcja CreateFile() prawidłowo wywołana zwraca identyfikator pliku. Jeżeli plik już istnieje przed wywołaniem funkcji z CREATE_ALWAYS lub OPEN_ALWAYS przypisanymi do dwCreationDistribution, funkcja GetLastError() zwróci wartość ERROR_ALREADY_EXISTS. Jeżeli plik nie istnieje GetLastError() zwraca 0. W przypadku gdy funkcja CreateFile() nie została wykonana pomyślnie należy oczekiwać wartości INVALID_HANDLE_VALUE.

 

Windows NT: CreateFile() można użyć uzyskując dostęp do stacji dysków lub partycji dysku. Zwracany identyfikator, może zostać użyty w funkcji DeviceIoControl(). Uzyskując dostęp do dysku twardego lpFileName powinno być reprezentowane przez łańcuch postaci \\.\PHYSICALDRIVEx , gdzie x jest numerem dysku. Numeracja dysków zaczyna się od 0. Użycie \\.\x umożliwia uzyskanie dostępu do stacji dysków x lub danej partycji na dysku twardym.                 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

Uzupełnienie 2.                                                                                                                        Zamiana liczb z postaci dziesiętnej na binarną

 

              W niniejszym Uzupełnieniu przedstawimy prostą aplikację napisaną tym razem w Delphi i służącą do zamiany liczb z postaci dziesiętnej na binarną (dwójkową) – projekt  \KODY\DELPHI\U_2\p_liczby.dpr. Do jej zaprojektowania użyłem dwóch komponentów TButton, komponentu typu TSpinEdit, przy pomocy którego możemy wybrać interesującą nas liczbę dziesiętną, komponentu TMemo, w którym wyświetlamy wyniki, oraz czterech opisowych komponentów TLabel,  tak jak pokazuje to rysunek U.2.1. Z przyciskiem Zamień liczbę skojarzone jest procedura obsługi zdarzenia ShiftNumberClick(), w którym wywoływana jest z kolei procedura Shift_Number(). W treści tego zdarzenia zapisujemy też do pliku binarne.dat otrzymane wyniki. Do pliku poprzez zmienną sdata zostanie bezpośrednio zapisana zawartość cechy Text komponentu Memo1 oraz zawartość cechy Value komponentu SpinEdit1. Obie te informacje będą oddzielone parą znaków #13#10 CR LF – przejście do następnego wiersza (por. tab. 2.1). Naciskając przycisk Zamień liczbę powodujemy przekazanie poprzez parametr formalny number aktualnej cechy Value komponentu SpinEdit1do wnętrza procedury Shift_Number(). Procedura ta poprzez zmienną lokalną var_number przejmuje bieżącą wartość tego komponentu i przy pomocy prostych działań: DIV – dzielenie całkowite bez reszty oraz MOD – reszta  z dzielenia całkowitego dokonuje rekurencyjnego przeliczania postaci dziesiętnej liczby na jej postać binarną. Przycisk Koniec zamyka aplikację.

 

Rysunek U.2.1

Formularz główny projektu p_liczby.dpr

 

 

Poniżej zamieszczony jest kompletny wydruk zastosowanego przeze mnie algorytmu.

 

Wydruk U.2.1. Kod źródłowy modułu liczby.pas aplikacji zamieniającej liczby z postaci dziesiętnej na binarną.

 

unit liczby;

 

interface

 

uses

  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,  

  Dialogs, StdCtrls, Spin, Mask, ComCtrls;

 

type

  TForm1 = class(TForm)

    SpinEdit1: TSpinEdit;

    ShiftNumber: TButton;

    Close: TButton;

    Memo1: TMemo;

    Label1: TLabel;

    Label2: TLabel;

    Label3: TLabel;

    Label4: TLabel;

    procedure CloseClick(Sender: TObject);

    procedure ShiftNumberClick(Sender: TObject);

  private

    { Private declarations }

    procedure Shift_Number(number: Cardinal);

  public

    { Public declarations }

  end;

 

var

  Form1: TForm1;

 

implementation

 

{$R *.DFM}

 

procedure TForm1.Shift_Number(number: Cardinal);

var var_number: Cardinal;

begin

  if (number > 0) then

    begin

      Shift_Number(number DIV 2);

      var_number := (number MOD 2);

      Memo1.Lines.Add(IntToStr(var_number));

    end;

end;

//--------------------------------------------------------------------

procedure TForm1.ShiftNumberClick(Sender: TObject);

var

   OutFile : TextFile;        // zmienna plikowa

   fname, sdata : String;

begin

  Memo1.Lines.Clear();

  Shift_Number(SpinEdit1.Value);

  fname := 'binarne.dat';     // nazwa pliku

  AssignFile(OutFile, fname); // skojarzenie nazwy pliku ze zmienną

                              // plikową

Rewrite(OutFile);

  sdata :='Postać binarna liczby: '+IntToStr(SpinEdit1.Value)+#13+#10+

                                    Memo1.Lines.Text;

  Write(OutFile, sdata);

  CloseFile(OutFile);         // zamknięcie pliku

end;

//--------------------------------------------------------------------

procedure TForm1.CloseClick(Sender: TObject);

begin

  Application.Terminate;

end;

//--------------------------------------------------------------------

end.

 

 

 

 

 

                               

 

 

 

 

 

 

Uzupełnienie 3.                                                                                                                    Specyfikacja struktur MODEMDEVCAPS,  MODEMSETTINGS oraz funkcji GetCommModemStatus()

 

 

MODEMDEVCAPS

 

Struktura MODEMDEVCAPS zawiera informacje o parametrach modemu.

 

typedef struct modemdevcaps_tag {

    DWORD dwActualSize;              

    DWORD dwRequiredSize;          

    DWORD dwDevSpecificOffset;  

    DWORD dwDevSpecificSize;     

 

    DWORD dwModemProviderVersion;    

    DWORD dwModemManufacturerOffset;

...

Zgłoś jeśli naruszono regulamin