|
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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)
![](/App_Themes/Normal/images/Window/Backgrounds/news.gif) | 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.
| |
|
|