API - Application Programming Interface
Interfejs Programowania Aplikacji.
Windows API jest pełne funkcji sterujących mechanizmem okienek i wykonującym wszystkie zadania związane z systemem Windows. W C++ Builder funkcje API są umieszczane w komponentach. W czasie pracy z programem określa się jakie zadania mają wykonywać komponenty, a one same przekazują Windows szczegóły określające co jest do zrobienia. Jednak komponenty (VCL) nie są w stanie objąć każdej z tysięcy funkcji API i komunikatów dlatego czasami trzeba sięgać wprost do samego źródła.
Uruchamianie innego programu - sposób łatwy.
Najprostszym sposobem uruchomienia innego programu jest skorzystanie z funkcji Windows API 'WinExec()' jako pierwszy argument podając ścieżkę do uruchamianego programu, jako drugi natomiast styl wyświetlanego okna. Jest to procedura łatwa, lecz przestarzała i Microsoft odradza jej stosowanie.
//-------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { WinExec("C:\\nazwakatalogu\\nazwaprogramu.exe", SW_SHOW); } //-------------------------------- |
W przedstawionym przykładzie podano ścieżkę bezwzględną, jeśli jednak program który chcemy uruchomić znajduje się w tym samym katalogu co program uruchamiający można zastosować funkcję: 'ExtractFileDir'.
//-------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { WinExec((ExtractFileDir(Application->ExeName) + "\\nazwaprogramu.exe").c_str(), SW_SHOW); } //-------------------------------- |
Opis funkcji: WinExec(const char* lpCmdLine, unsigned int uCmdShow).
Opis funkcji: EctractFileDir(AnsiString FileName).
Application->ExeName - nazwa aplikacji z poziomu której wywoływana jest procedura.
Uruchamianie programu z wybranym do edycji plikiem - sposób trudniejszy.
Podany niżej sposób nie jest może tyle trudny, ile wymaga większego nakładu pracy, pozwala za to na otwarcie pliku i uruchomienie programu w którym ten plik będzie edytowany. W podanym przykładzie zostanie uruchomiony notatnik, a następnie zostanie w nim otwarty do edycji plik 'autoexec.bat'.
//-------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { char katalog [MAX_PATH]; GetWindowsDirectory(katalog, MAX_PATH); AnsiString Notes = AnsiString(katalog) + "\\notepad.exe"; Notes = Notes + " " + "c:\\autoexec.bat"; STARTUPINFO StartupInfo; ;ZeroMemory( &StartupInfo, sizeof(STARTUPINFO)); StartupInfo.cb = sizeof(STARTUPINFO); PROCESS_INFORMATION ProcessInfo; if(CreateProcess(NULL, Notes.c_str(), NULL, NULL, TRUE, NORMAL_PRIORITY_CLASS, NULL, NULL, &StartupInfo, &ProcessInfo)) { CloseHandle(ProcessInfo.hProcess); CloseHandle(ProcessInfo.hThread); } } //-------------------------------- |
Uruchamianie pliku w domyślnym programie.
W celu uruchomienia pliku w domyślnym programie należy skorzystać z funkcji Windows API 'ShellExecute()'. Żeby funkcja zadziałała należy w pliku źródłowym (*.cpp) lub w pliku nagłówkowym (*.h) projektu, umieścić w sekcji #include wiersz: #include <shellapi.h>. Shellapi.h jest nazwą dostarczonego pliku nagłówkowego, który definiuje 'ShellExecute()'.
//-------------------------------- #include <vcl.h> #pragma hdrstop #include "Unit1.h" #include <shellapi.h> //-------------------------------- #pragma package(smart_init) #pragma resource "*.dfm" TForm1 *Form1; //-------------------------------- __fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner) { } //-------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { ShellExecute(Form1->Handle, NULL , "nazwapliku.xxx", "", "", SW_SHOWNORMAL); } //-------------------------------- |
Opis funkcji: ShellExecute(void* hwnd, const char* lpOperation, const char* LpFile, const char* LpParameters, const char* lpDirectory, int nShowCmd).
Usuwanie plików z przeniesieniem do kosza.
W celu usunięcia plików z przeniesieniem ich do kosza, należy posłużyć się funkcją Windows API 'SHFileOperation'. W tym przypadku również trzeba dołączyć wiersz #include <shellapi.h>.
//-------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { SHFILEOPSTRUCT fos; fos.hwnd = Handle; fos.wFunc = FO_DELETE; fos.pFrom = (ExtractFileDir(Application->ExeName) + "\\nazwapliku.xxx").c_str(); //nazwa kasowanego pliku, trzeba podać pełną ścieżkę dostępu fos.fFlags = FOF_ALLOWUNDO; SHFileOperation(&fos); } //-------------------------------- |
Opis funkcji: SHFileOperation(SHFILEOPSTRUCT * ipFileOp) .
c_str() - konwertuje zmienną typu string na zmienną typu char.
Zamykanie z wyłączeniem zasilania systemu Windows XP.
W poradzie 'Zamykanie, logowanie i restartowanie systemu' przedstawiony jest sposób zamykania systemu Windows XP, jednak ten system ma to do siebie, że po zamknięciu z reguły wyłącza zasilanie, przedstawiona tam porada jednak nie odłącza zasilania, dlatego jeżeli chcemy zamknąć system WinXP z wyłączeniem zasilania należy to zrobić w ten sposób:
//-------------------------------- void __fastcall TForm1::Button1Click(TObject *Sender) { WinExec("tsshutdn 0 /POWERDOWN /DELAY:0", SW_HIDE); } //-------------------------------- |
Nie spowoduje to gwałtownego zamknięcia systemu, najpierw zostaną zakończone wszystkie otwarte procesy i zostaną wylogowani wszyscy użytkownicy, a dopiero potem nastąpi zamknięcie systemu, może to potrwać około 30 sekund.