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