VB6 a inlineC

Každý z vás se již jistě dostal do situace kdy mu VB svou rychlostí nebo schopnostmi nedostačoval. Nyní máte možnost využít širokých schopností ASM nebo C díky Add-Inu "ThunderVB". Jedná se o stejný doplněk jako je např Api Viewer. Díky němu můžete přímo ve vašem programu psát kód Assembleru nebo C a samozřejmně využívat jeji schopností. Jelikož ASM neovládám, budu se dále věnovat jen C. Tím jsem lehce naznačil že pokud chcete využívat schopností C musíte jej také trochu ovládat. Naštěstí (pro vás) si vystačíte jen se základy. Ty se dají zvládnout za několik týdnů, záleží na vašich schopnostech a věnovaném čase. Doporučuji se mrknout na netu na nějaké články a začátcích v C nebo C++. Zejména si dejte pozor na jinou syntaxi a především význam středníku (ten je v C opravdu zákeřný). Rovněž se naučte pracovat s pointery, budete to potřebovat. Poslední věc kterou je potřeba akceptovat je to že takto vložený C++ kód nelze ve VB ladit. Osobně to řeším tak, že si konkrétní funkci napíšu a odladím v editoru C a potom ji už hotovou jen vložím do VB kódu. Pokud potřebujete krokovat svůj program budete si muset stejnou funkci napsat ještě v syntaxi VB. Při ladění potom voláte tu jenž je napsaná ve VB a při čisté kompilaci zvolíte tu v C++. Možná je to poněkud nešikovné, ale buďte rádi alespoň za něco. Tak a jdeme na to.

Nejdříve si musíte stáhnout "ThunderVB" z http://thundervb.profitux.cz/ cca 2,5MB
(hned si stáhněte také ukázkové zdrojáky ve VB). Pro jeho použití musíte mít nainstalován VB6 včetně SP6 a OS WinXP. Dále potřebujete kompilátor ASM a C, ty zle nalézt na netu i jako free takže to už nechám na vás. Pokud máte nainstalováno a nastavené cesty ke kompilátorům (to snad zvládnete) nic nám nebrání pustit se do toho. POZOR veškerý vložený kód se musí nacházet ve standartním modulu *.bas, jinak po spustění hotového programu nastane chyba. Vložený kód C je nutno oddělit od ostatního VB kódu speciální značkou '#c' /*zde uz je to C */

Příklad --> modrá je VB a zelená je C++

Public Sub TestC(ByRef poz)
'#c' #include "math.h"
'#c' #define ps 0.017453292519943295769236907684886 // Pi prevedeno z radianu na stupne 3.14/180
'#c' struct m_bod
'#c' {
'#c' double x;
'#c' double y;
'#c' };
'#c'
'#c'
'#c' void TestC(m_bod * poz)
'#c' {
'#c' for(int uhel=0;uhel < 360;)
'#c' {
'#c' poz[uhel].x =100 * sin(uhel * ps );
'#c' poz[uhel].y =100 * cos(uhel * ps );
'#c' ++ uhel;
'#c' }
'#c' }
'#c'
End Sub

Teď trochu podrobněji. Např. potřebuji sečíst dvě hodnoty. Na součet mám následující fci ( toto je jen ukázka, nepředpokládám že pro součet dvou hodnot použijete C) :)

Public Function spocti(ByVal a As Integer, ByVal b As Integer) As Integer
spocti = a + b
End Function

Všimněte si že klíčového slova "ByVal". VB totiž standartně předává hodnoty odkazem (ByRef). Toto je potřeba pečlivě rozlišovat. Pokud fce v C nebude očekávat hodnotu, ale odkaz na hodnotu (pointer na datový typ) nebude potom pracovat správně.

Teď ta samá fce v C.

Public Function spocti(ByVal a As Integer, ByVal b As Integer) As Integer
'#c' int spocti(int a, int b)
'#c' {
'#c' return a+b;
'#c' }

End Function

Zde si povšimněte, že ta C fce je vlastně uzavřena do klasické VB fce. Převezme její parametry, provede výpočet a následně jí předá výsledek.

Závěr

Možnosti využití C ve VB již nechám na vás, jen přidám malou radu. Je dobré si již odladěné funkce uložit do samostatného modulu pro pozdější použití. Pro usnadnění ladění používám direktivu #If...Then...#Else a před čistou kompilací jen změním podmínku. Tak si to užijte.

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