VB a API nic na tom není (1)
Pro všechny kteří programují ve VB a chtějí si trochu rozšířit vědomosti o winapi tady nabízím ke shlédnutí něco málo informací jenž jsem za dobu věnovanou tomuto jazyku posbíral. Články nejsou nijak tříděny, beru to tak jak mi to přišlo pod ruku. Umístění deklarací nechám na vás. Můžete použít modul nebo formulář, ale pozor ve formuláři nelze použít "Public Declare ...". Tam může být pouze jako "Private Declare ...". Testováno na Windows 98SE + VB6 + SP6. Předem ještě uvedu několik bodů a předejdu tak možným nedorozuměním. 1.Předpokládám že čtenář má základní znalosti programovaní v basicu. 2.Primárně se budu věnovat API, ale občas trochu odbočím abych upozornil i na jiné zajímavosti tohoto jazyka. 3.Pro vkládání API deklarací doporučuji používat doplněk "API Text Viewer" jenž je součástí intalace VB6. Naleznete ho v menu "Add-Ins". Pokud tam není postupujte následovně : zvolte "Add-Ins->Add-In Manager" a vyberte řádek "VB 6 API Viewer" a dvakrát na něj klepněte. Pokud ho chcete načítat při každém spuštení použijte zaškrtávací políčka v pravém dolním rohu. Po spuštění API Vieweru zvolte v nabídce "File->Load Text File" a najděte "Win32api.TXT" (standartně je tento soubor uložen "C:\Program Files\Microsoft Visual Studio\Common\Tools\Winapi\"). 4.Vždy se budu snažit uvést stručný příklad použití, resp. takový jenž používám já. Neberte to samozřejmě jako jedinou možnou variantu, těch je mnoho záleží na situaci.
Tolik na úvod a pozvolna se do toho pustíme.
ArcFunkce vykreslí celou nebo část kružnice na daném objektu. Kružnice je vepsaná do čtyřůhelníku.V případě úspěchu vrací funkce hodnotu 1. Viz. obrázek.

Parametry: X1,Y1 určuje levý horní roh čtyřůhelníku v němž bude vepsana kružnice. X2,Y2 pravý dolní roh čtyřůhelníku v němž bude vepsana kružnice. X3,Y3 počátek kružnice. X4,Y4 konec kružnice.
Deklarace
Declare Function Arc Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, _ ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long, ByVal X3 As Long, _ ByVal Y3 As Long, ByVal X4 As Long, ByVal Y4 As Long) As Long Použití: Dim test As Long test = Arc(Form1.hdc, 100, 100, 200, 200, 200, 100, 200, 200) Debug.Print IIf(test, "Vse je v poradku", "Nastala chyba")
GetComputerName
Funkce zjistí název počítače. V případě úspěchu vrací funkce hodnotu 1.
Parametry: lpBuffer proměnná typu String pevné délky nSize počet vrácených znaků
Deklarace: Declare Function GetComputerName Lib "kernel32" Alias "GetComputerNameA" _ (ByVal lpBuffer As String, nSize As Long) As Long
Použití: Dim test As Long, Jmeno As String * 255 test = GetComputerName(Jmeno, 255) Debug.Print IIf(test, Jmeno, "Nastala chyba")
CopyFile
Funkce zkopíruje soubor. V případě úspěchu vrací funkce hodnotu 1.
Parametry: lpExistingFileName soubor jenž se bude kopírovat lpNewFileName cíl kopírovaní včetne názvu souboru bFailIfExists určí zda bude ověřena existence cíle hodnota 0 pokud cíl jiz existuje bude kopírování stornováno, ale funkce vrátí 1 jako že je vše v pořádku. 1 pokud cíl jiz existuje bude kopírování stornováno, ale funkce vrátí 0 jako že nastala chyba.
Deklarace: Declare Function CopyFile Lib "kernel32" Alias "CopyFileA" _ (ByVal lpExistingFileName As String, ByVal lpNewFileName As String, _ ByVal bFailIfExists As Long) As Long
Použití: Dim test As Long test = CopyFile("C:\Soubor1.txt", "C:\Soubor2.txt", 0) Debug.Print IIf(test, "Vse je v poradku", "Nastala chyba")
GetDiskFreeSpace
Funkce vrací informace o využití prostoru na médiu. V případě úspěchu vrací funkce hodnotu 1.
Parametry: pRootPathName označení média pro zjištění informací např. "c:\" lpSectorsPerCluster vrací počet sektorů v clusteru na disku. lpBytesPerSector vrací počet bytů v sektoru na disku. lpNumberOfFreeClusters vrací počet volných clusterů na disku. lpTotalNumberOfClusters vrací celkový počet clusterů na disku.
Deklarace:
Declare Function GetDiskFreeSpace Lib "kernel32" Alias "GetDiskFreeSpaceA" _ (ByVal lpRootPathName As String, lpSectorsPerCluster As Long, lpBytesPerSector As Long, _ lpNumberOfFreeClusters As Long, lpTotalNumberOfClusters As Long) As Long
Použití: Dim test As Long, SecPerClus As Long, BytePerSec As Long, _ FreeClus As Long, TotalClus As Long test = GetDiskFreeSpace("C:\", SecPerClus, BytePerSec, FreeClus, TotalClus) Debug.Print IIf(test, test, "Nastala chyba")
Debug.Print "Volne misto = "; SecPerClus * BytePerSec * FreeClus; "bytu"
Ellipse
Funkce vykreslí elipsu na daném objektu. V případě úspěchu vrací funkce hodnotu 1.
Parametry: hdc objekt pro kreslení X1,Y1 levý horní roh čtyřůhelníku v němž bude vepsaná elipsa X2,Y2 pravý dolní roh čtyřůhelníku v němž bude vepsaná elipsa
Deklarace: Declare Function Ellipse Lib "gdi32" (ByVal hdc As Long, ByVal X1 As Long, _ ByVal Y1 As Long, ByVal X2 As Long, ByVal Y2 As Long) As Long
Použití: Dim test As Long
test = Ellipse(Form1.hdc, 20, 20, 200, 120) Debug.Print IIf(test, "Vse je v poradku", "Nastala chyba")
GetLastErrorFunkce vrací číslo poslední chyby jenž nastala v operačním systému.
Kód Zpráva 0 žádná chyba 1 neplatná funkce 2 soubor nenalezen 3 cesta nenalezena 4 soubor nelze otevřít je příliš velký 5 přístup odepřen 6 neplatné Handle 7 ? 8 nedostatek paměti 9 ? 10 něco jako nesprávné prostředí nebo tak nějak 11 ? 12 neplatné heslo 13 neplatná data 14 ? 15 neplatný disk 16 složku nelze smazat 17 ? 18 žádné soubory 19 disk je chráněn proti přepsání 20 zařízení nenalezeno 21 zařízení není připraveno 22 zařízení obdželo neznámý příkaz 23 cyclická chyba (CRC) Error 24 neplatná délka příkazu 25 oblast na médiu nenalezena 26 médium je nepřístupné 27 sektor nenalezen 28 v tiskárně došel toaletní papír 29 z média nelze číst 30 na médium nelze psát 31 zařízení nefunguje 32 přístup k souboru odepřen protože je používán 33 přístup k souboru odepřen protože je blokován 34 v jednotce je neplatný disk (FDD,CD) 36 příliš mnoho sdílených souborů 38 dosaženo konce souboru (EOF) 39 médium je plné 50 ? 51 vzdálený počítač není k dispozici 52 duplicitní název sítě 53 síťová cesta nenalezena 54 síť je přetížena 55 síť nebo médium není k dispozici 56 příliš mnoho připojení (síť), omezení BIOSu 57 chyba síťového adaptéru 58 servr nemůže provést požadovanou operaci 59 neznámá chyba na síti 60 nekompatibilní síťový adaptér 61 tisková fronta je plná 62 není místo pro uložení souboru tiskárny 63 soubor nebo tiskárna jsou odstraněny 64 jméno sítě není k dispozici 65 přístup k síti zamítnut 66 ? 67 síť daného názvu nenalezena 68 příliš dlouhý název sítě 69 bylo dosaženo limitu síťových operací (limit síťového BIOSu) 70 síť je pozastavena nebo restartuje 71 ? 72 zvolené médium nebo tiskárna je pozastaveno 80 soubor již existuje 82 nelze vytvořit soubor nebo složku 83 chyba přerušení 24 (INT 24) 84 ? 85 jmédo disku již existuje 86 neplatné síťové heslo 87 neplatný příkaz 88 při zápisu na síť nastala chyba 89 ? 100 ?
Deklarace: Declare Function GetLastError Lib "kernel32.dll" () As Long
Použití: Debug.Print "Posledni chyba v programu cislo"; GetLastError()
GetUserName
Tahle API funkce zjistí jméno aktuálně přihlášeného uživatele. V případě úspěchu vrací funkce hodnotu 1.
Parametry: lpBuffer proměnná typu String pevné délky nSize počet vrácených znaků
Deklarace: Declare Function GetUserName Lib "advapi32.dll" Alias "GetUserNameA" _ (ByVal lpBuffer As String, nSize As Long) As Long
Použití: Dim test As Long, Jmeno As String * 255 test = GetUserName(Jmeno, 255) Debug.Print IIf(test, Jmeno, "Nastala chyba")
GetProfileInt
Funkce čte číselnou hodnotu zadaného klíče ze souboru WIN.INI, ten je v systémové složce windows. Není proto potřeba ho definovat neboť funkce si jej nalezne sama. S návratovou hodnotou je to tady trošku jinak, pro představu vypíšu tabulku moných situací. Osobně dávám přednost funkci GetProfileString jenž nedělá rozdíl mezi číslem a znakem. Pozor velká a malá písmena nejsou rozlišována. Takže pokud soubor obsahuje několik stejných sekcí nebo klíčů, vezme první od počátku souboru!
Vrací Důvod nDefault Klíč nebo sekce neexistuje 0 Klíč existuje, ale neobsahuje číselnou hodnotu hodnotu klíče Klíč existuje a je vrácena jeho hodnota
Parametry: lpAppName Jméno sekce lpKeyName Jméno klíče nDefault Libovolná "default" hodnota v rozsahu typu Long, pokud možno taková jenž je nepravděpodobná, že by mohla být platnou návratovou hodnotou. Vyhnete se tak možným problémům s testováním existence klíců.
Deklarace: Declare Function GetProfileInt Lib "kernel32" Alias "GetProfileIntA" _ (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal nDefault As Long) As Long
Použití: Dim test As Long, Hodnota As Long Hodnota = 3333 test = GetProfileInt("intl", "iCountry", Hodnota) Select Case test Case Hodnota Debug.Print "Klic neexistuje" Case 0 Debug.Print "Klic existuje, ale neobsahuje cislo." Case Else Debug.Print "Klic obsahuje hodnotu : " & test End Select
GetProfileString
Tato funkce čte "String" hodnotu zadaného klíče ze souboru WIN.INI, ten je v systémové složce windows. Není proto potřeba ho definovat neboť funkce si jej nalezne sama. Funkce vrací délku řetězce "lpReturnedString". Pozor velká a malá písmena nejsou rozlišována. Takže pokud soubor obsahuje několik stejných sekcí nebo klíčů, vezme první od počátku souboru!
Parametry: lpAppName Jméno sekce lpKeyName Jméno klíče lpnDefault Libovolná textová hodnota jenž bude použita v případe výskytu chyby lpReturnedString Vrací hodnotu klíče. Pokud nastane chyba vrací obsah "lpnDefault" nSize Počet vrácených znaků
Deklarace: Declare Function GetProfileString Lib "kernel32" Alias "GetProfileStringA" _ (ByVal lpAppName As String, ByVal lpKeyName As String, ByVal lpDefault As String, _ ByVal lpReturnedString As String, ByVal nSize As Long) As Long
Použití: Dim test As Long, Chyba As String, Data As String * 255 Chyba = "Klic_Nenalezen" test = GetProfileString("intl", "sCountry", Chyba, Data, 255) Debug.Print IIf(test , Data, "Nastala chyba")
GetProfileSection
Funkce čte všechny klíče zadané sekce ze souboru WIN.INI, ten je v systémové složce windows. Není proto potřeba ho definovat neboť funkce si jej nalezne sama. pokud sekce neexistuje, nebo nastane chyba vrací funkce 0, jinak vrací délku řetězce "lpReturnedString", Pozor velká a malá písmena nejsou rozlišována. Takže pokud soubor obsahuje několik stejných sekcí nebo klíčů, vezme první od počátku souboru!
Parametry: lpAppName Jméno sekce lpReturnedString Vrací obsah dané sekce tzn. všechny klíče včetně jejich hodnot přičemž jednotlivé polozky jsou odděleny mezerou nSize Počet vrácených znaků
Deklarace: Declare Function GetProfileSection Lib "kernel32" Alias "GetProfileSectionA" _ (ByVal lpAppName As String, ByVal lpReturnedString As String, ByVal nSize As Long) As Long
Použití: Dim test As Long, Data As String * 255 test = GetProfileSection("intl", Data, 255) Debug.Print IIf(test, Data, "Nastala chyba")
GetPrivateProfileInt, GetPrivateProfileString, GetPrivateProfileSection
Tyto funkce jsou totožné s výše uvedenými s tím rozdílem že břibyl parametr "lpFileName" jenž určuje ze kterého souboru *.INI se bude číst. Nejste tedy omezeni jen na WIN.INI, ale můžete si sami určit vlastní *.INI soubor.
|