/ Forside / Teknologi / Udvikling / C/C++ / Nyhedsindlæg
Login
Glemt dit kodeord?
Brugernavn

Kodeord


Reklame
Top 10 brugere
C/C++
#NavnPoint
BertelBra.. 2425
pmbruun 695
Master_of.. 501
jdjespers.. 500
kyllekylle 500
Bech_bb 500
scootergr.. 300
gibson 300
molokyle 287
10  strarup 270
Runtime brug af .dll-filer
Fra : Bjarke Walling Peter~


Dato : 08-05-02 15:18

Hej nyhedsgruppe ...

Kan man ligesom i Delphi og Visual Basic bruge funktionerne i en .dll-fil
(f.eks. noget fra Windows API) ved blot at kende navnet på .dll'en og
funktionen man vil kalde, uden at skulle til at bruge en .lib-fil? - i så
fald: Hvordan gør man?
Jeg benytter VC++ 6.0.

På forhånd tak!

Mvh. Bjarke



 
 
bop (08-05-2002)
Kommentar
Fra : bop


Dato : 08-05-02 17:08

"Bjarke Walling Petersen" <bwp@bwp.dk> wrote in message
news:3cd933bd$0$78795$edfadb0f@dspool01.news.tele.dk...
> Hej nyhedsgruppe ...
>
> Kan man ligesom i Delphi og Visual Basic bruge funktionerne i en .dll-fil
> (f.eks. noget fra Windows API) ved blot at kende navnet på .dll'en og
> funktionen man vil kalde, uden at skulle til at bruge en .lib-fil? - i så
> fald: Hvordan gør man?

Du kan selv lave en LIB fil ud fra DLL'en. Borlands værktøj hedder implib.
Microsoft har et tilsvarende. Se også impdef. Du kan også kaste dig ud i
noget med LoadLibrary.

--
BopBop




Bjarke Walling Peter~ (08-05-2002)
Kommentar
Fra : Bjarke Walling Peter~


Dato : 08-05-02 19:04

"bop" <bop@bop.dk> wrote in message news:abbii2$14os$1@news.cybercity.dk...
> "Bjarke Walling Petersen" <bwp@bwp.dk> wrote in message
> news:3cd933bd$0$78795$edfadb0f@dspool01.news.tele.dk...
> > Hej nyhedsgruppe ...
> >
> > Kan man ligesom i Delphi og Visual Basic bruge funktionerne i en
..dll-fil
> > (f.eks. noget fra Windows API) ved blot at kende navnet på .dll'en og
> > funktionen man vil kalde, uden at skulle til at bruge en .lib-fil? - i

> > fald: Hvordan gør man?
>
> Du kan selv lave en LIB fil ud fra DLL'en. Borlands værktøj hedder implib.
> Microsoft har et tilsvarende. Se også impdef. Du kan også kaste dig ud i
> noget med LoadLibrary.
>
> --
> BopBop

Det er fint nok at kunne lave lib-filer selv, hvis man ved hvilken dll det
er programmet bruger. Men hvis nu f.eks. at brugeren skal/kan vælge hvilken
..dll-fil, som skal bruges til et eller andet - eller hvis man skal lave
plugins til sit program - så tror jeg det er smartere at bruge LoadLibrary.

Jeg har læst om alle de tilhørende funktioner til Dynamic-Link Libraries,
ved at slå op under LoadLibrary. Men jeg er lige kommet på et spørgsmål:
Hvordan kalder man en funktion blot ud fra adressen?

Mvh. Bjarke



Mogens Hansen (08-05-2002)
Kommentar
Fra : Mogens Hansen


Dato : 08-05-02 19:35


"Bjarke Walling Petersen" <bwp@bwp.dk> wrote

>
> Jeg har læst om alle de tilhørende funktioner til Dynamic-Link Libraries,
> ved at slå op under LoadLibrary. Men jeg er lige kommet på et spørgsmål:
> Hvordan kalder man en funktion blot ud fra adressen?
>

Søg efter GetProcAddress på http://msdn.microsoft.com, så finder du f.eks.
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html
/_core_GetProcAddress.asp

Venlig hilsen

Mogens Hansen



Bjarke Walling Peter~ (08-05-2002)
Kommentar
Fra : Bjarke Walling Peter~


Dato : 08-05-02 21:18

Mogens Hansen skrev:
> Søg efter GetProcAddress på http://msdn.microsoft.com, så finder du f.eks.
>
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/vccore/html
> /_core_GetProcAddress.asp
>
> Venlig hilsen
>
> Mogens Hansen

Ok, mange tak for dit svar!

Mvh. Bjarke



Bjarke Dahl Ebert (08-05-2002)
Kommentar
Fra : Bjarke Dahl Ebert


Dato : 08-05-02 23:18

"Bjarke Walling Petersen" <bwp@bwp.dk> wrote in message
news:3cd96898$0$68606$edfadb0f@dspool01.news.tele.dk...

Åh nej, nu bliver vi forvirrede med 2xBjarke ;)

> Jeg har læst om alle de tilhørende funktioner til Dynamic-Link Libraries,
> ved at slå op under LoadLibrary. Men jeg er lige kommet på et spørgsmål:
> Hvordan kalder man en funktion blot ud fra adressen?

Jeg forstår dit spørgsmål sådan at du har adressen til en funktion, og du
ønsker at kalde funktionen.
Så kalder du den bare, lige som om din pointer-variabel er funktionen.

Syntaksen for en funktionspointer er desværre lidt bøvlet, og hvis du får
adressen fra GetProcAddress, så skal pointeren først castes til den rigtige
type.

Bemærk at der under Windows i syntaksen for funktionstypen indgår
kaldkonventionen (det kan være __cdecl, __fastcall, __stdcall eller andet).
Kaldkonventionen siger noget om hvordan funktionen skal kaldes på
assemblerniveau (hvordan overføres parametre (i registre, eller på stak),
pushes parametrene på i den ene eller anden rækkefølge, er det funktion
eller kalder der rydder stakken op, hvilke registre kan formodes bevaret,
osv.)
Dette, samt manglende typeinformation på link-niveau, er en evig kilde til
frustrationer . C++ name-mangling gør ikke situationen specielt meget
bedre, IMHO.


Fx:
FARPROC func1 = GetProcAddress(...);
// Cast til den rigtige funktionspointer-type (den skal man bare kende..
;-( )
void (*func2)(int,int) = (void(*)(int,int))func1;
// Nu kan vi kalde den:
func2(42,43); // egentlig (*func2)(42,43), men på den angivne måde
derefereres automatisk.



Mvh. Bjarke




Bjarke Walling Peter~ (09-05-2002)
Kommentar
Fra : Bjarke Walling Peter~


Dato : 09-05-02 00:45

Bjarke Dahl Ebert skrev:
> Åh nej, nu bliver vi forvirrede med 2xBjarke ;)

Ja, det går da virkelig ikke! :)

> Jeg forstår dit spørgsmål sådan at du har adressen til en funktion, og du
> ønsker at kalde funktionen.
> Så kalder du den bare, lige som om din pointer-variabel er funktionen.

Rigtig forstået!

> Syntaksen for en funktionspointer er desværre lidt bøvlet, og hvis du får
> adressen fra GetProcAddress, så skal pointeren først castes til den
rigtige
> type.
>
> Bemærk at der under Windows i syntaksen for funktionstypen indgår
> kaldkonventionen (det kan være __cdecl, __fastcall, __stdcall eller
andet).
> Kaldkonventionen siger noget om hvordan funktionen skal kaldes på
> assemblerniveau (hvordan overføres parametre (i registre, eller på stak),
> pushes parametrene på i den ene eller anden rækkefølge, er det funktion
> eller kalder der rydder stakken op, hvilke registre kan formodes bevaret,
> osv.)

Jeg kender godt til dette fra Delphi. Og jeg kender også til det på
assemblerniveau - har programmeret lidt assembler.
Blot en ting: Hvor skal kaldkonventionen skrives? - sådan her: __stdcall
func1=GetProcAdress(...);
.... eller: #define FARPROC __stdcall
Det ville være mest logisk sådan, men måske er det en anden måde??

> Dette, samt manglende typeinformation på link-niveau, er en evig kilde til
> frustrationer . C++ name-mangling gør ikke situationen specielt meget
> bedre, IMHO.

Ik' for noget, men hvad menes der med name-mangling?

> Fx:
> FARPROC func1 = GetProcAddress(...);
> // Cast til den rigtige funktionspointer-type (den skal man bare kende..
> ;-( )
> void (*func2)(int,int) = (void(*)(int,int))func1;
> // Nu kan vi kalde den:
> func2(42,43); // egentlig (*func2)(42,43), men på den angivne måde
> derefereres automatisk.
>
>
>
> Mvh. Bjarke

Ellers mange tak for dit svar.

Mvh. Bjarke - jeg ved det er forvirende!



Thomas Lykkeberg (09-05-2002)
Kommentar
Fra : Thomas Lykkeberg


Dato : 09-05-02 10:34

On Wed, 8 May 2002 16:18:04 +0200, "Bjarke Walling Petersen"
<bwp@bwp.dk> wrote:

>Hej nyhedsgruppe ...
>
>Kan man ligesom i Delphi og Visual Basic bruge funktionerne i en ..dll-fil
>(f.eks. noget fra Windows API) ved blot at kende navnet på .dll'en og
>funktionen man vil kalde, uden at skulle til at bruge en .lib-fil? - i så
>fald: Hvordan gør man?
>Jeg benytter VC++ 6.0.
>
>På forhånd tak!
>
>Mvh. Bjarke
>
Yes, er der noget man kan, så er det det

Et lille eksempel:

MYLIB.DLL indeholder en (simpel) funktion void MyFunc(void), som skal
kaldes fra dit program. Gør følgende:

--- SNIP ---

typedef void FAR PASCAL (*Func)(void);

HINSTANCE hDll; /* Handle to the loaded DLL */
Func MyFunc;

hDll = LoadLibrary("MYDLL.DLL");
if(hDll == NULL)
{
AfxMessageBox("Could not load the DLL.",MB_OK);
}

MyFunc = (Func)GetProcAddress(hDll,"MyFunc");

MyFunc(); /* Call the func in the DLL */

FreeLibrary(hDll);

--- SNIP ---

Så nemt er det.

/Thomas

Bjarke Walling Peter~ (09-05-2002)
Kommentar
Fra : Bjarke Walling Peter~


Dato : 09-05-02 19:30

Thomas Lykkeberg skrev:
> Yes, er der noget man kan, så er det det
[SNIP]

Det var da godt - jeg skal nemlig bruge det! Og så spurgte jeg jo heller
ikke helt forgæves
I øvrigt: Tak for dit svar!

Mvh. Bjarke



Søg
Reklame
Statistik
Spørgsmål : 177496
Tips : 31968
Nyheder : 719565
Indlæg : 6408491
Brugere : 218887

Månedens bedste
Årets bedste
Sidste års bedste