» »

Uporaba .dll

Uporaba .dll

mercury ::

Hi,
Dobil sem driverje za FTDI USB čipe, ki so zgrajeni iz štirih datotek .dll, .h, .lib in .sys. V tistem .dl-ju so funkcije za dostopanje do USB-ja, jaz bi pa rad vedel, kako se instalira ta .dll in kako se do funkcij v njem v visual c++ tudi dostopa?

Lep pozdrav

Vesoljc ::

imena oziroma, prototipe funkcij najdeš v header-jih. w winsih dll naložiš z

HINSTANCE LoadLibrary( LPCTSTR lpLibFileName // address of filename of executable module
);

posamezno funkcijo znotraj dll-ja pa uporabiš tako, da najprej poiščeš njen naslov (kje se nahaja). za to potrebuješ function pointer.

FARPROC GetProcAddress(
HMODULE hModule, // handle to DLL module
LPCSTR lpProcName // name of function
);

tkole nekak:
main program:

HINSTANCE module;
typedef void (*MYFUNCTION)(void);  // function ptr

MYFUNCTION MyFunc; // -> MyFunc vrne void ter sprejema tudi void (se pravi nič) 

module = LoadLibrary(dllname);
MyFunc = (MYFUNCTION)::GetProcAddress(module, "MyFunction");

//this is how far it gets - "MyFunction" isn't found in the DLL? Why??!?

MyFunc();


the dll:


void __declspec(dllexport)MyFunction(void)
{
//do sth
}

Abnormal behavior of abnormal brain makes me normal...

Vesoljc ::

Abnormal behavior of abnormal brain makes me normal...

mercury ::

Hvala, majster! To je točno to kar potrebujem... Sedaj sem nekako dve uri študiral kako bi to napisal za svoje funkcije. Problemov je več, eden od teh je, da ne razumem kaj pomeni tisti typedef. MSDN pravi, da je to v bistvu samo preimenovanje za že obstoječe podatkovne tipe - tam so še neki primeri a jaz razumem nič.

Pa vzemimo kar konkreten primer; dll je Ftd2xx.dll in ena izmed funkcij v njem je FT_Open katere prototip je takle:

FT_STATUS FT_Open(int iDevice, FT_HANDLE *ftHandle);

Mimogrede opis te funkcije je: Open the device and return a handle which will be used for subsequent acess. Torej, kako bi se torej prepisalo zgornji program za tole funkcijo? In prosim če mi lahko še kdo razloži, kaj točno dela typedef.

Še enkrat hvala za pomoč,

OwcA ::

Najboljše kar konkreten primer za typedef:
typedef unsigned int uint;

uint a = 17;
unsigned int b = 42;

uint postane sinonim za unsigned int. Obe deklaraciji sta tako ekvivalentni. Stvar je uporabna predvsem zaradi preglednosti (in nekaterih ljubkih trikov v povezavi s kalupi), saj lahko z njo lokalno poenostaviš kakšna dolga imena tipov (recimo kako čudo z večkratnim razreševanjem imenskih prostorov).

Kaj hočeš okoli FT_Open pa mi ni povsem jasno, žal.
Otroška radovednost - gonilo napredka.

Vesoljc ::

najprej rabiš pointer na funkcijo:

prootip:
FT_STATUS FT_Open(int iDevice, FT_HANDLE *ftHandle);

typedef naredi točno to kar si rekel, je le sinonim za nek tip
typedef FT_STATUS (*FUNC)(int,FT_HANDLE*);

v tem primeru, typedef reče, da je tip FUNC pointer na funkcijo, ki vrača FT_STATUS, ter sprejema int ter pointer na FT_HANDLE.

FUNC kazalec_na_funkcijo_iz_dllja;

HINSTANCE module = LoadLibrary("c://mapa//blabla.dll");

kazalec_na_funkcijo_iz_dllja = (FUNC)::GetProcAddress(module,"FT_Open");

FT_HANDLE ftHandle;
FT_STATUS rezultat;

if(kazalec_na_funkcijo_iz_dllja)
rezultat = kazalec_na_funkcijo_iz_dllja(666,&ftHandle);

FreeLibrary(module);


tko nekak...
Abnormal behavior of abnormal brain makes me normal...

Vesoljc ::

čeprav, če si v paketu dobil tudi *.lib je imho, rahlo nepotrebno komplicirati z dll-ji...

če uporabljaš visual studio, pojet pod tools/optios/directories pa tam vstavi poti za headerje (include files) ter lib datoteke (library files). potem greš še pod project/settings, pa pod link (general category)/ object/library modules, vpišeš še svoje knjižnice (recimo FT.lib).
potem uporabljaš knjižnico kar tako, "normalno" oziroma statično linkanje.
Abnormal behavior of abnormal brain makes me normal...


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Kako debugirati dll ?

Oddelek: Programiranje
6628 (452) amigo_no1
»

[c++] standardni c++ in dogodki(events)

Oddelek: Programiranje
121325 (1150) yeti
»

C++ Project --- v1

Oddelek: Programiranje
13904 (697) Vesoljc
»

Dva na x je enako x kvadrat

Oddelek: Šola
132422 (2063) G3GANT1C
»

Win32 API in C++

Oddelek: Programiranje
131208 (1079) Monster

Več podobnih tem