Avatar billede sessa Nybegynder
29. januar 2008 - 20:11 Der er 6 kommentarer og
1 løsning

Hvordan eksporterer man filer fra en .dll i C++Builder?

Jeg har skrevet en dll, der indeholder et par funktioner. Disse funktioner vil jeg selvfølgelig gerne kunne bruge fra andre programmer, men jeg kan ikke få det til at virke. Jeg har lavet en .def-fil, hvor der står

LIBRARY <dllnavn>
EXPORTS <funktion1>
        <funktion2>

...og adderet den til projektet.
       
Desuden har jeg forsøgt mig med en masse kombinationer af _export og _import keywords i henholdsvis dll og exe, og så har selvfølgelig prøvet at finde noget i Borlands hjælpefiler og via Google, men indtil videre uden held.

Er der en, der vil forklare, hvordan man gør?
Avatar billede sessa Nybegynder
29. januar 2008 - 20:13 #1
Nej, jeg mener selvfølgelig 'eksporterer FUNKTIONER fra en .dll'
Avatar billede bertelbrander Praktikant
29. januar 2008 - 20:42 #2
Der er måske andre måder, men du kan lave et import-lib, som du kan inkludere i de andre projekter.
For at lave et import-lib skal du bare bruge dll'en, så kører du kommandoen:

implib mydll.lib mydll.dll

Derved får du mydll.lib ud fra mydll.dll, og du skal så bare linke med mydll.lib i de andre projekter.
mydll.lib vil så kalde funktionerne i dll'en.
Avatar billede sessa Nybegynder
30. januar 2008 - 09:08 #3
bertelbrander, når du siger "linke med mydll.lib", så mener du "add mydll.lib to project", ikke?
Kommandoen "implib DLL_mousehook.lib DLL.mousehook.dll" virker godt nok - jeg får en .lib-fil ud det. dll'en fylder 99Kb, og .lib-filen fylder kun 1.70 Kb. Lyder det rigtigt?

I det program, der skal bruge funktionerne fra dll'en, har jeg denne funktion:

void __fastcall TForm1::FormCreate(TObject *Sender)
{
  HMODULE hdll = LoadLibrary( "DLL_mousehook.dll");
  if ( hdll == NULL )
    Application->MessageBoxA( "Kan ikke loade dll", "Fejl", MB_OK );


  FARPROC insthook = GetProcAddress( hdll, "InstallHook" );
  if ( insthook == NULL )
    Application->MessageBoxA( "Kan ikke finde InstallHook", "Fejl", MB_OK );

}

Den første del går fint, men i anden afdeling får jeg stadig Message-boxen "Kan ikke finde InstallHook". Hvad mon jeg gør forkert?
Avatar billede bertelbrander Praktikant
30. januar 2008 - 23:03 #4
Hvis du linker til .lib filen bør du kunne kalde funktionen direkte som enhver anden
funktion. Du skal dog lave en extern erklæring først.

Hvis du vil bruge LoadLibrary osv. behøver du ikke .lib filen.
Prøv at skrive _ foran navnet:

GetProcAddress( hdll, "_InstallHook" );
Avatar billede sessa Nybegynder
31. januar 2008 - 11:41 #5
Du har ret, jeg kan godt kalde funktionen direkte, så i den forstand fungerer det. Jeg skrev "GetProcAddress( hdll, "InstallHook" );" som en test på, om alt virkede, som det skulle.
Og den del virker stadig ikke, heller ikke med "_" eller "__" foran InstallHook. Og hverken med eller uden "extern". Så et eller andet må der vel være galt? Dyb mystik!Har du nogen forslag?
Avatar billede bertelbrander Praktikant
31. januar 2008 - 23:51 #6
Jeg har ikke den store erfaring med dll'er, og slet ikke med Borland C++ Builder

Det kan være "calling convention" der halter, du kan prøve at lave funktionen som en ren "C" funktion og se om det hjælper.

Men ellers er det lettere bare at kalde den direkte gennem .lib-filen.
Avatar billede sessa Nybegynder
01. februar 2008 - 08:16 #7
Det generer mig altid, når noget, der BURDE virke, ikke gør det, men indtil videre 'glemmer' jeg det med GetProcAddress. Programmet fungerer som det skal med .lib-filen ( jeg havde aldrig hørt om implib før ).
Så du skal have mange tak for hjælpen. Jeg ved jo, at du ikke samler på point, så jeg snupper dem selv :)
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

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