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.


Arc

Funkce 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")


GetLastError

Funkce 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.

© 2005 Jindřich Mach & Jan Ticháček