/ 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
Sært navn i .dll-fil
Fra : Bjarke Walling Peter~


Dato : 28-01-03 18:30

Hej NG.

Jeg har ikke rigtig før arbejdet med .dll-filer i C++ (MS VC++ 6.0), men har
ellers noget kendskab til C++-programmering. Derudover programmerer jeg
Visual Basic, så der er nogle funktioner jeg synes kunne være smarte at køre
i C++. For at sætte mig ind i .dll-filer i C++ prøvede jeg til at starte med
at få VC's wizard til at kreere en færdig .dll-fil til mig med eksporterede
funktioner. En funktion der i C++-koden hedder fnTestVBdll returnerer
værdien 42 (int). Det compilerede fint.
Jeg oprettede et VB-program som angiveligt skulle kalde funktionen
"fnTestVBdll" og herved få returneret værdien 42. Det virkede desværre
ikke - fejlen var at den ikke kunne finde funktionens entry-point i
..dll-filen. Jeg tænkte kort tid over det og kom frem til at den
sandsynligvis ikke fandtes eller ikke var eksporteret e.l. Derfor gik jeg
ind i Depends (værktøj i Visual Studio) for at se hvilke funktioner der lå i
min nyligt compilerede .dll-fil.
Jeg fandt til min store overraskelse ud af at funktionen ligepludselig havde
fået navnet "?fnTestVBdll@@YAHXZ".

Nu er spørgsmålene efter denne historie: Hvorfor får den dette sære navn? Og
hvordan kan jeg få den til kun at hedde "fnTestVBdll"?
Det skal lige siges at alt virker fint nu, blot jeg kalder
"?fnTestVBdll@@YAHXZ" fra mit Visual Basic-projekt, men det er da ikke til
at leve med et sådant navn! :)

Håber nogen kan hjælpe og - på forhånd tak!

Mvh. Bjarke



 
 
Mogens Hansen (28-01-2003)
Kommentar
Fra : Mogens Hansen


Dato : 28-01-03 18:47


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

[8<8<8<]
> Jeg fandt til min store overraskelse ud af at funktionen ligepludselig
havde
> fået navnet "?fnTestVBdll@@YAHXZ".

Det er fordi typerne på funktionsargumenterne er kodet ind i navnet på
funktionen.
Denne process kaldes normal for "name mangling".
Det er den måde som C++ laver typesikker linkning og tillader funktions
overload.
Bemærk iøvrigt at forskellige C++ compilere benytter forskellige algoritmer
til at lave name mangling - så de er ikke kompatible.

[8<8<8<]
> "?fnTestVBdll@@YAHXZ" fra mit Visual Basic-projekt, men det er da ikke til
> at leve med et sådant navn! :)

Nej, og det behøver du heller ikke.
DLL'er i MS-Windows er bedst egnet til at stille funktioner til rådighed på
C niveau.
I et C++ program kan du sikre det ved at skrive

extern "C"
{
void fnTestVBdll(int, float, const char*);
}

Venlig hilsen

Mogens Hansen



Mogens Hansen (28-01-2003)
Kommentar
Fra : Mogens Hansen


Dato : 28-01-03 18:49


"Bjarke Walling Petersen" <bwp@bwp.dk> wrote in message
news:b16emd$1v2g$1@news.cybercity.dk...

[8<8<8<]
> Nu er spørgsmålene efter denne historie: Hvorfor får den dette sære navn?

Det er fordi typerne på funktionsargumenterne er kodet ind i navnet på
funktionen.
Denne process kaldes normal for "name mangling".
Det er den måde som C++ laver typesikker linkning og tillader funktions
overload.
Bemærk iøvrigt at forskellige C++ compilere benytter forskellige algoritmer
til at lave name mangling - så de er ikke kompatible.


> Og
> hvordan kan jeg få den til kun at hedde "fnTestVBdll"?

DLL'er i MS-Windows er bedst egnet til at stille funktioner til rådighed på
C niveau.
I et C++ program kan du sikre det ved at skrive

extern "C"
{
void fnTestVBdll(int, float, const char*);
}

Venlig hilsen

Mogens Hansen



Ruben Nørgaard (28-01-2003)
Kommentar
Fra : Ruben Nørgaard


Dato : 28-01-03 18:51

Du kan bruge

extern "C" int fnTestVBDll()
{
return 42;
}

Grunden til at der kommer sjove navne er at du bruger C++ exports per
default.

mvh Ruben Nørgaard


"Bjarke Walling Petersen" <bwp@bwp.dk> wrote in message
news:b16emd$1v2g$1@news.cybercity.dk...
> Hej NG.
>
> Jeg har ikke rigtig før arbejdet med .dll-filer i C++ (MS VC++ 6.0), men
har
> ellers noget kendskab til C++-programmering. Derudover programmerer jeg
> Visual Basic, så der er nogle funktioner jeg synes kunne være smarte at
køre
> i C++. For at sætte mig ind i .dll-filer i C++ prøvede jeg til at starte
med
> at få VC's wizard til at kreere en færdig .dll-fil til mig med
eksporterede
> funktioner. En funktion der i C++-koden hedder fnTestVBdll returnerer
> værdien 42 (int). Det compilerede fint.
> Jeg oprettede et VB-program som angiveligt skulle kalde funktionen
> "fnTestVBdll" og herved få returneret værdien 42. Det virkede desværre
> ikke - fejlen var at den ikke kunne finde funktionens entry-point i
> .dll-filen. Jeg tænkte kort tid over det og kom frem til at den
> sandsynligvis ikke fandtes eller ikke var eksporteret e.l. Derfor gik jeg
> ind i Depends (værktøj i Visual Studio) for at se hvilke funktioner der lå
i
> min nyligt compilerede .dll-fil.
> Jeg fandt til min store overraskelse ud af at funktionen ligepludselig
havde
> fået navnet "?fnTestVBdll@@YAHXZ".
>
> Nu er spørgsmålene efter denne historie: Hvorfor får den dette sære navn?
Og
> hvordan kan jeg få den til kun at hedde "fnTestVBdll"?
> Det skal lige siges at alt virker fint nu, blot jeg kalder
> "?fnTestVBdll@@YAHXZ" fra mit Visual Basic-projekt, men det er da ikke til
> at leve med et sådant navn! :)
>
> Håber nogen kan hjælpe og - på forhånd tak!
>
> Mvh. Bjarke
>
>



Bjarke Walling Peter~ (28-01-2003)
Kommentar
Fra : Bjarke Walling Peter~


Dato : 28-01-03 19:05

Mange tak for svarene. Nu virker det!

Mvh. Bjarke



Klaus Petersen (28-01-2003)
Kommentar
Fra : Klaus Petersen


Dato : 28-01-03 22:41

For fuldstændighedens skyld burde man nok også lige nævne, at problemet også
kan løses ved at tilføje en definations (.def) fil til projektet.



Søg
Reklame
Statistik
Spørgsmål : 177558
Tips : 31968
Nyheder : 719565
Indlæg : 6408924
Brugere : 218888

Månedens bedste
Årets bedste
Sidste års bedste