Avatar billede cms Nybegynder
08. juli 2004 - 14:19 Der er 5 kommentarer

Dll eksport af funktioner

Hej C/C++'ere,

Jeg bruger Visual C++ og ønsker at lave en DLL med en funktion der kan importeres af andre programmer/dll'er.
Det er vigtigt, at funktionen kan importeres af programmer/dll'er skrevet i alle sprog - derfor >>extern "C"<<.

extern "C" __declspec(dllexport) int __stdcall minfunktion(int Hej)
{
    return Hej + 42;
}

Men når jeg kompilerer denne til filen "MyDll.dll" og skriver følgende i Delphi:

function minfunktion(Hej: Integer): Integer; stdcall; external 'MyDll.dll' name 'minfunktion';

så fejler Delphi-applikationen og siger at procedureindgangspunktet 'minfunktion' ikke findes i 'MyDll.dll'.

Kan nogen se, hvad jeg gør galt?
Avatar billede overchord Nybegynder
08. juli 2004 - 14:21 #1
Lige netop udveksling af dll mellem c og Delphi er problematisk.
I Delphi aplpikationen skal du bruge Borlands Sharemem for at det virker. Den er dog relativt langsom, og jeg mener der findes en anden version der hedder fastsharemem, men det er ikke noget jeg har proevet selv.
Avatar billede soreno Praktikant
08. juli 2004 - 14:28 #2
stdcall og c kald konventionen er ikke ens.
Med stdcall rydder funktionen selv op på stakken (og kan dermed ikke understøtte funktioner med et variabelt antal parametre).

Med cdecl (som jeg forventer >extern "C"< er et alias for) kræver det at callee rydder op på stakken.

Man kan ikke blande disse sammen.
Se lidt mere info om kald konventioner her:
http://www.codeproject.com/cpp/calling_conventions_demystified.asp
Avatar billede cms Nybegynder
08. juli 2004 - 14:31 #3
Okay? Har før stødt på ShareMem når man skulle benytte Borlands 'string'-datatype på tværs af Delphi-dll'er. Det prøver jeg :)
Anyway, det løser muligvis ikke helt mit problem. Som du kan se benytter jeg stdcall-konventionen til min funktion. Det er fordi jeg har skrevet et COM-objekt og derfor skal eksportere DllRegisterServer og DllUnregisterServer osv...
Derfor var min brug af Delphi som "dll-klient" blot et eksempel...
Avatar billede cms Nybegynder
08. juli 2004 - 14:34 #4
Soreno: Jeg kender godt til calling conventions, skriver også i assembler :) Årsagen til min >extern "C"< er at det ifølge MSDN skulle sørge for at C++-compileren ikke laver om på funktionens navn når den eksporteres (med det formål at man kan eksportere overloadede funktioner osv...).
Avatar billede cms Nybegynder
08. juli 2004 - 14:39 #5
Kombinationen ses iøvrigt også af definitionen af makroen STDAPI:
#define STDAPI        EXTERN_C HRESULT STDAPICALLTYPE
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester