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.
Temat zapewne był "molestowany" dużo razy.
Ja polecam po polsku: LinK.
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.
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;
}
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.
#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
}
nie znajduje mi dll mimo ze mam wszystko w jednym folderze
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.
Nie przerabialiśmy pracy na powłokach, nie da się tego jakoś obejść w prostszy sposób?
Plik nagłówkowy dll.h mam w projekcie o nazwie "biblioteka", uruchamiam za pomocą Dev c++
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 :).