Biblioteka DLL zawierająca funkcję.

0

Witam. Z góry przepraszam jeśli nie jest ten dział w którym powinno się umieszczać tego typu pytania.
Uczęszczam do szkoły średniej. Od początku tego roku zaczynamy blibliotekę DLL w C++. Niestety nasz nauczyciel jest typem człowieka który woli sprawdzać niż uczyć... więc muszę edukować się sam. Ostatnio zadał nam pierwszy projekt....Biblioteka DLL zawierającą funkcje(1). Proszę o pomoc...jakąkolwiek.

0

Ja polecam po polsku: LinK.

0

http://s3.ifotos.pl/img/Beztytuup_wpxnpnr.png
Wytłumaczy ktoś gdzie dokładnie mam to wklejać w którym miejscu?
Przepraszam..wiem że to podstawy, ale naprawdę ciężko się cokolwiek w szkole nauczyć to muszę tutaj.

1

dll.h:

 
#ifndef _DLL_H_
#define _DLL_H_

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

extern "C"
{
    double DLLIMPORT kwadrat( double liczba );
}

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

#endif /* _DLL_H_ */

dll.cpp:

 
/* Replace "dll.h" with the name of your header */
#define BUILDING_DLL
#include "dll.h"
#include <windows.h>

DllClass::DllClass()
{
   
}

DllClass::~DllClass()
{
   
}

double kwadrat( double liczba )
{
    return liczba * liczba;
}

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;
}
0

Dziękuję bardzo. Mógłbym prosić o pomoc jak wywołać tą funkcję w console application? Byłoby świetnie gdybym miał taki szablon i mógł opierać się na czymkolwiek.

1
#include <dll.h> 
#include <Winbase.h>  // Naglowek w ktorym jest LoadLibrary, GetProcAddress i FreeLibrary
#include <iostream>     // To chyba kazdy zna

typedef double(*kwadratPtr)(double);  // Definicja typu wskazujacego na funkcje double kwadrat
kwadratPtr kwadrat;                          // Wskaznik ktory bedzie przechowywal adres funkcji kwadrat w dll

void main()
{
    void* hDll = LoadLibrary( "dll" );       // Ladujemy do wskaznika void* pamieci biblioteke dll.dll
    // Uzylem void* zamiast HMODULE bo to jest typedef void* HMODULE;

    if( hDll != NULL )                             // Jesli zaladowano
    {
        kwadrat = (kwadratPtr)GetProcAddress( hDll, "kwadrat" ); // Pobieramy adres funkcji "kwadrat"
        if( kwadrat != NULL ) return 0; // return 0; albo komunikat o bledzie jak kto woli
    }


    // Tutaj mozna wywolywac do woli
    std::cout << kwadrat( 3 ) << std::endl;      

    FreeLibrary( hDll ); // A na koniec tylko zwalniamy biblioteke dll.dll
}
0

nie znajduje mi dll mimo ze mam wszystko w jednym folderze

0

Dodaj do ścieżki PATH ścieżkę do katalogu z dll. Zapewne uruchamiasz program przez debugger wbudowany w IDE? Jeśli tak to uruchom przez Windowsa albo cmd.exe.

0

Nie przerabialiśmy pracy na powłokach, nie da się tego jakoś obejść w prostszy sposób?

0

Plik nagłówkowy dll.h mam w projekcie o nazwie "biblioteka", uruchamiam za pomocą Dev c++

1

W takim wypadku zapewne DevCpp kompiluje Ci do biblioteka.dll więc zmień void* hDll = LoadLibrary( "dll" ); na void* hDll = LoadLibrary( "biblioteka" );. Jak nadal nie znajdzie to odpal cmd.exe. wejdź do folderu ze skompilowanym programem konsolowym (w Exploratorze Windows), przeciągnij i upuść skompilowane .exe do konsoli i w konsoli naciśnij enter, program powinien wtedy odpalić, na pewno ogarniesz :).

1 użytkowników online, w tym zalogowanych: 0, gości: 1