[ igorpet @ 02.10.2007. 20:25 ] @
Treba mi kontrola (po mogucstvu free) ili source cod kojim cu moci da prikazem matematicke formule u VB 6.

Npr. u TextBox-u ukucam c^2 = a^2 + b^2 \Rightarrow c = \sqrt {a^2 + b^2 } (LaTex sintaksa) a da na ekranu dobijem:


Kao sto ovaj forum moze da prikazuje formule date u LaTex sintaksi ja zelim da ih vidim u VB-u.
Ako neko zna nesto o ovome bio bih zahvalan da podeli informaciju.
Ima puno programa koji to mogu ali ne nadjoh nijednu kontrolu ili neki source cod za VB, a gotovo sam siguran da mora da postoji (na www.Planet-Source-Code.com nista o ovome, da ne poverujes).

(Ili je mozda bolje da pitanje postavim na forumu Matematika?)
[ igorpet @ 03.10.2007. 14:45 ] @
Da li neko zna kako da ovaj CSHARP kod prevedem u VB6 (mozda je ovo nesto sto mi treba)?
Trebam da deklarisem DLL i pozovem funkciju GifFromEq, ali kako god da uradim prijvljuje mi gresku (Run-time error 49, Bad DLL caling convention)
Code:

    [System.Security.SuppressUnmanagedCodeSecurity()]
    internal class NativeMethods
    {
        private NativeMethods()
        { //all methods in this class would be static
        }

        [System.Runtime.InteropServices.DllImport("LTex.dll")]
        internal static extern int GifFromEq(string expr, string fileName);

A zatim se funkcija poziva u kodu
Code:
NativeMethods.GifFromEq(equation, tempGifFilePath);

Deluje jednostavno, ali mi nesto ne ide, ne znam gde gresim.
[ Eurora3D Team @ 03.10.2007. 19:47 ] @
Ovaj kod koji si napisao nema veze sa VB6
Jel mozes da zakacis tu LTex.dll da probam da ti deklarisem tu funkciju.
Inace tema je interesantna.
Pozdrav
[ igorpet @ 03.10.2007. 19:55 ] @
Pa da, kod je CSHARP koji hocu da prevedem u VB6.
Trebam da deklarisem LTex.DLL i pozovem funkciju GifFromEq

Ovako ne radi
Declare Function CreateGifFromEq Lib "MimeTex.dll" (ByVal expr As String, ByVal FileName As String)

Prikacicu dll, samo kasnije sada zurim.
[ Aleksandar Ružičić @ 03.10.2007. 22:19 ] @
probaj ove dve deklaracije (jedna bi trebala da radi, verovatno ova prva)
Code:

Declare Function GifFromEq Lib "LTex.dll" (ByRef expr As String, ByRef fileName As String) As Long
Declare Function GifFromEq Lib "LTex.dll" (ByVal expr As String, ByVal fileName As String) As Long

i LTex.dll stavi u isti folder sa exe-om
[ igorpet @ 03.10.2007. 22:53 ] @
Sve ove kombinacije za deklarisanje sam isprobao, ali nece.
Program pronalazi dll (stavio sam ga u system32, prepoznaje i pogresan poziv funkcije)

Evo kacim DLL, a funkcija koja se poziva je CreateGifFromEq, gore je greska.

Nasao sam i ovo:

I looked at ltex.c, and noticed the following:

#if defined(_USRDLL)
extern _declspec(dllexport)int _cdecl
CreateGifFromEq ( char *expression, char *gifFileName );
#endif

Looking further up in the code indicates that _USRDLL is defined on windows systems, so the _cdecl calling convention needs to be used.

"It is not possible to directly call a C function in a DLL if that function uses the _cdecl calling convention. This is because Visual Basic uses the _stdcall calling convention for calling functions. This is a problem because if _cdecl is used, the calling function is responsible for cleaning up the stack. However, if _stdcall is used, the called function is responsible for cleaning up the stack."

Zna li ko kako se deklarisu ovakvi dll-ovi?
Ako funkcuja ne moze da se poziva direktno, kako moze drugacije?
Zna li ko, u ovom gore CSHARP kodu da li se funkcija poziva direktno ili ide preko neke Klase?

Nisam se susretao do sada sa ovom problematikom.
[ Aleksandar Ružičić @ 04.10.2007. 00:27 ] @
zahvaljujuci kodu Paula Catona mozemo lako da pozivamo funkcije koje koriste CDECL calling konvenciju.

pogledaj attachment...

[ igorpet @ 04.10.2007. 11:35 ] @
Tacno sam pretpostavljao da ne moze biti nesto prosto, ali kod g. Paula Catona je prevaziso moja ocekivanja o komplikovanosti poziva jedne funkcije u dll biblioteci.
KOd vise podseca na "hakerski zahvat" nego na regularni poziv, ali bitno da radi.
Hvala Aleksandre na resenju.

Medjutim, pitanjima tu nije kraj.
Posto na osnovu onoga sto sam video i razumeo u kodu on ustvari "patcuje" dll da bi omogucio regularni poziv, interesuje me da li je moja konstatacija tacna i da li bi LTeX.dll mogla da se "pacuje trajno" a da se zatim normalno deklarise i poziva u VB?

Ili, da li bi funkcija radila ako se u originalnom kodu
Code:

#if defined(_USRDLL)
extern _declspec(dllexport)int _cdecl
CreateGifFromEq ( char *expression, char *gifFileName );
#endif

_cdecl jednostavno zameni sa _stdcall (jer Microsoft Windows support two main calling conventions: _cdecl and _stdcall). I da li kod g. Paula Catona upravo to radi?

Ovo pitam zbog brzine izvrsavanja, jer pretpostavljam da bi regularno pozvana DLL radila daleko brze od ovog nacina.
[ Aleksandar Ružičić @ 04.10.2007. 12:11 ] @
pa, sta on radi to je da funkciju z_DO_NOT_CALL zameni sa asm kodom koji se wrappuje oko cdecl funkcije, tj z_DO_NOT_CALL je stdcall i ona samo prosledi parametre cdecl funkciji i posle povratka iz funkcije samo skloni parametre sa steka.

ukoliko imash ceou source zameni _cdecl sa _stdcall i probaj da rekompajliras.