[ djmrky @ 22.04.2004. 14:02 ] @
Izvinjavam se ako ovo nije bas specificna tema za ovaj forum, ali je svakako u vezi sa programiranjem.
==============
Kako importovati funkciju "CallDriver457" iz dll-a (driver-a) koji je stigao sa softverom QuickLink sa ovom kasom
tj. kako deklarisati pointer u C++-u na tu funkciju (koji tip vraca, i sta prima funkcija)
ja sam probao gomilu deklaracija, npr:

typedef int (*pCallDriver)(LPTSTR, LPTSTR, byte);

znaci, treba mi tacna deklaracija pointer-a u C++-u na ovu funkciju (uputstvo je prilicno nejasno)
HVALA!
[ yooyo @ 22.04.2004. 15:21 ] @
Daj da vidimo sta pise u dokumentaciji pa ti mozemo pomoci...
Primer koji si ti napisao mozda ne radi zbog calling konvencije ili zbog toga sto nisi pravilno naveo parametre...

Ovo je klasican primer:
#define CALLTYPE __cdecl ili __ fastcall ili __stdcall ili nista
typedef void (CALLTYPE *PFNNEKAFUNKCIJA) (int p1, const char* p2, int p3);
PFNNEKAFUNKCIJA NekaFunkcija;

NekaFunkcija = (PFNNEKAFUNKCIJA)GetProcAddress(handle, "ImeFunkcijeUDLL-u");
AKo je posle ovoga NekaFunkcija != NULL dobio si pointer na zeljeni entry point.

Jako je bitno da znas koji je CALLTYPE jer ako to pogresis program ce pucati pri pokusaju poziva dll funkcije

yooyo
[ djmrky @ 23.04.2004. 07:44 ] @
Pa evo, ovo bi bio deo dokumentacije koji se tice poziva driver-a:
========================================
II Poziv drajvera

Drajver se poziva na sledeći način:

• Ukoliko se koristi drajver u formatu izvršne datoteke

drv457 Cmd=<komandna_datoteka> [Tel=<broj_telefona>] CL=<latinica/ćirilica>


• Ukoliko se koristi drajver u formatu dinamičke biblioteke

CallDriver457(<komandna_datoteka>,[<broj_telefona>],<latinica/ćirilica>)

gde je:

<komandna_datoteka> - naziv datoteke sa komandama za registar kasu (npr. komanda.cmd)
<broj_telefona> - broj telefona za modemsku komunikaciju (nije obavezan parametar)
<latinica/ćirilica> - 0 za latinično pismo, 1 za ćirilično pismo

U slučaju da se koristi parametar <broj_telefona> komunikacija sa registar kasom obavljaće se pomoću modema. Ukoliko se ovaj parametar izostavi komunikacija će biti direktna, dakle pomoću serijskog kabla. U okviru telefonskog broja navodi se i vrsta biranja (P = pulsno, T = tonsko) kao prvi znak. Ukoliko se koristi drajver u formatu izvršne datoteke naziv komandne datoteke, broj telefona i izbor pisma navode se bez praznina i početnih i krajnjih apostrofa. U slučaju da se koristi drajver u formatu dinamičke biblioteke naziv komandne datoteke i broj telefona kao znakovni parametri moraju se navesti prilikom poziva funkcije pod navodnicima ili apostrofima (u zavisnosti od programskog jezika koji se koristi) pošto su to znakovni podaci, a izbor pisma mora se uneti kao broj 0 ili 1 pošto je u pitanju podatak tipa byte.

U slučaju uspešne komunikacije poziv funkcije CallDriver457 vraća 0 a u suprotnom vrednost različitu od nule.

U slučaju uspešne komunikacije drv457 vraća exit code 0 a u suprotnom vrednost različitu od nule.

Primer:

drv457 Cmd=slanje.cmd Tel=T411232 CL=0
drv457 Cmd=prijem.cmd CL=0
CallDriver457(‘slanje.cmd’,’’,1)
CallDriver457(‘prijem.cmd’,’P021456789’,0)
=======================================================
Ovde ima i nacin poziva preko exe driver-a, ali meni treba bas preko dll-a
Kod koji sam ja napisao izgleda otprilike ovako:
======================================
//.....
typedef int (*pCallDriver)(LPTSTR, LPTSTR, int);

// kasnije u main-u

HINSTANCE hDLL;
hDLL = LoadLibrary("drv457.dll");
if (hDLL == 0){
getchar();
return nRetCode;
}

pCallDriver pointerCallDriver;
pointerCallDriver = (pCallDriver) GetProcAddress(hDLL, "CallDriver457");
// **** OVDE VRACA NULL *****
if (pointerCallDriver == NULL){
getchar();
return nRetCode;
}

FreeLibrary(hDLL);
getchar();
=======================================
ja mislim da je glavni problem sto ne znam tacno tipove parametara, a nisu mi bas najjasniji iz te dokumentacije.
Jel mogu ja nekako saznati koji je CALLTYPE te funkcije?
[ yooyo @ 23.04.2004. 10:22 ] @
pointerCallDriver je NULL zato sto ta funkcija ili ne postoji ili ima neki drugi naziv (npr. CallDriver457@12)

Da li imas slucajno MSVC 6.0. Ako imas u njemu postoji programcic koji se zove
depends.exe. Startuj ga i otvori drv457.dll. U donjem desnom uglu treba da se pojavi lista exportovanih funkcija i medju njima CallDriver457.

U stvari... ajde okaci o poruku taj DLL pa cu da ga pogledam.

yooyo
[ djmrky @ 26.04.2004. 09:48 ] @
Hvala puno na pomoci, u medjuvremenu sam pisao i dobavljacima kase i posali su mi ispravnu deklaraciju, samo je trebalo da bude:

typedef byte (*pCallDriver)(long, long, byte);

btw, koristio sam depends (iz VC7.0 .NET) vec i pre i znam da moze da mi da eksportovane funkcije, ali mislim da ne moze da mi da i tipove parametara, koje funkcije vracaju i primaju (mozda i gresim).

u svakom slucaju, gornja varijanta je proradila iz prve (cudo jedno kako radi uz dobru dokumentaciju)

Jos jednom hvala puno na pomoci, imacu ja verovatno jos problema s tim.