Avatar billede ruma1974 Nybegynder
25. marts 2009 - 23:00 Der er 7 kommentarer og
1 løsning

explicit linking of DLL

Hej,

Er der nogen som har et godt eksemple på explicit linking af DLL in Dev-cpp?

Mvh,

Rune
Avatar billede arne_v Ekspert
25. marts 2009 - 23:42 #1
Vil du bruge en DLL eller vil du generere en DLL ?
Avatar billede ruma1974 Nybegynder
26. marts 2009 - 10:21 #2
I dette tilfælde  ønsker jeg at generere en DLL (Jeg er dog også interesseret i gode vejledninger om genbrug af DLL funktioner).

Jeg fandt i de sene nattetimer ud af at min DLL template er ok.

Jeg deklarere mine funktioner som:

extern "C" ___declspec(dllexport) double funktionsnavn()

Problemet opstår når jeg indsætter en funktion fra et ekstern bibliotek. For eksempel:

#include <gsl/gsl_sf_bessel.h> //det virker

men hvis jeg i en af mine funktioner kalder en funktion i gsl så returnere loadlibrary 0 hvilket betyder et eller andet er galt (tdump ser normal ud).
Avatar billede ruma1974 Nybegynder
26. marts 2009 - 10:30 #3
Jeg bør nævne at mit gsl library er rigtig installeret. Jeg kan godt bruge funktioner fra

#include <gsl/gsl_sf_bessel.h

i consol applikationer.
Avatar billede ruma1974 Nybegynder
26. marts 2009 - 10:43 #4
Header file:
________________________________________________________________

#ifndef _test_H_
#define _test_H_

#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
#else /* Not BUILDING_DLL */
# define DLLIMPORT __declspec (dllimport)
#endif /* Not BUILDING_DLL */

extern "C" __declspec(dllexport) double AddNumbers(double a, double b);


class DLLIMPORT DllClass
{
  public:
    DllClass();
    virtual ~DllClass(void);

  private:

};


#endif /* _DLL_H_ */

_____________________________________________________________

Cpp file:

_____________________________________________________________

/* Replace "dll.h" with the name of your header */
#include "test.h"
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>
#include <gsl/gsl_sf_bessel.h>


extern "C" __declspec(dllexport) double AddNumbers(double a, double b)
{
double x = 5.0;
//      double y=gsl_sf_bessel_J0(x); // evoke the Bessel //function
      return a+b+x;
//        return y;
}

DllClass::DllClass()
{

}


DllClass::~DllClass ()
{

}


BOOL APIENTRY DllMain (HINSTANCE hInst    /* Library instance handle. */ ,
                      DWORD reason        /* Reason this function is being called. */ ,
                      LPVOID reserved    /* Not used. */ )
{
    switch (reason)
    {
      case DLL_PROCESS_ATTACH:
        break;

      case DLL_PROCESS_DETACH:
        break;

      case DLL_THREAD_ATTACH:
        break;

      case DLL_THREAD_DETACH:
        break;
    }

    /* Returns TRUE on success, FALSE on failure */
    return TRUE;
}
Avatar billede ruma1974 Nybegynder
26. marts 2009 - 15:14 #5
Ovenstående virker faktisk fint også hvis jeg bruger bessel funktionen. Hmm, gad vide hvad jeg gjorde galt.

Jeg har kun et problem tilbage og det er at jeg får access violation når jeg bruger freelibrary
Avatar billede ruma1974 Nybegynder
26. marts 2009 - 18:08 #6
Ser ud til at værre et type cast problem og ikke et freelibrary problem...
Avatar billede ruma1974 Nybegynder
26. marts 2009 - 18:24 #7
Det er ikke et type cast problem...
Avatar billede ruma1974 Nybegynder
26. marts 2009 - 18:32 #8
Super fik det til at virke Dllhandle skulle manuelt sættes til 0
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