Příklad, který jsem zde uvedl, používám bez problémů v mých programech a takto úspěšně importuji funkce z dll i jiných autorů. Jiné způsoby neznám.
main1.cpp je v mém případě kód konzolové aplikace, která slouží k testu MYDLL1.dll a uvedl jsem ji zde, jako ukázku toho, jak importovat funkci z dll. Z vlastní dll nemá nic společného.
Takže ještě jednou:
1 : založ nový projekt DLL a pojmenuj MYDLL1
2a: soubor cpp pojmenuj dllmain.cpp
2b: soubor h pojmenuj dllmain.h
3a: zkopíruj tento kód:
#ifndef _DLLMAIN_H_
#define _DLLMAIN_H_
extern "C"
{
void __declspec(dllexport) SomeFunction(double a, double b,
unsigned sizeOut, char *cOut);
}
#endif
3b: otevři soubor dllmain.h
3c: Ctrl+A
3d: Ctrl+V
4a: zkopíruj tento kód:
#include <windows.h>
#include <stdio.h>
#include "dllmain.h"
//-------------------------------------------------------
void SomeFunction(double a, double b,
unsigned sizeOut, char *cOut)
{
double c = a + b;
_snprintf(cOut, sizeOut, "Vysledek: %f", c);
}
//-------------------------------------------------------
BOOL APIENTRY DllMain (HINSTANCE hInst, DWORD reason, LPVOID reserved)
{
switch (reason)
{
case DLL_PROCESS_ATTACH:
break;
case DLL_PROCESS_DETACH:
break;
case DLL_THREAD_ATTACH:
break;
case DLL_THREAD_DETACH:
break;
}
return TRUE;
}
4b: otevři soubor dllmain.cpp
4c: Ctrl+A
4d: Ctrl+V
5: Provedeš kompilaci
6: Dynamicky připojitelná knihovna je hotova
Teď jen pro test té dll a test, jestli umíš dynamicky importovat funkce z knihoven:
1. Založ nová projekt konzolové aplikace
(nejlépe ve stejné složce jako tu dll - důvodem je to, že pak nebudeš muset nastavovat cestu k dll, nebo kopírovat aplikaci a dll do stejného umístění)
2a: zkopíruj tento kód:
#include <stdio.h>
#include <windows.h>
#define SZ_BUFFER 64
//---------------------------------------------------------------
typedef void __declspec() (*FUNKCE) (double a, double b,
unsigned sizeOut, char *cOut);
HMODULE hDLL = NULL;
FUNKCE pFunkce = NULL;
//---------------------------------------------------------------
int main(int argc, char *argv[])
{
hDLL = LoadLibrary("MYDLL1.dll");
if(hDLL)
{
pFunkce = (FUNKCE)GetProcAddress(hDLL,"SomeFunction");
// u některých kompilátorů, je třeba použít "_SomeFunction"
if(pFunkce)
{
double d1=0.65, d2=0.15;
char txt[SZ_BUFFER];
pFunkce(d1, d2, SZ_BUFFER, txt);
printf("Hodnota 1: %f\nHodnota 2: %f\n\n%s\n\n", d1, d2, txt);
pFunkce = NULL;
}
else
printf("Funkce \'SomeFunction\' nebyla v knihovne MYDLL1.dll nalezena!\n");
FreeLibrary(hDLL);
hDLL = NULL;
}
else printf("Chyba inicializace MYDLL1.dll!\n");
printf("\nUkoncete stiskem klavesy Enter");
getchar();
return 0;
}
2b: otevři soubor main.cpp
2c: Ctrl+A
2d: Ctrl+V
3: Provedeš kompilaci
4: Testovací aplikace je hotova
5. Po spuštění by měla vypsat následující:
Hodnota 1: 0,650000
Hodnota 2: 0,150000
Vysledek: 0,800000
Ukoncete stiskem klavesy Enter
Pokud toto zvládneš, můžeš importovat funkce ze svých vlastních knihoven, nebo i z jakýchkoliv dll, které si seženeš a budeš k nim mít dokumentaci.
ps, pokud nezvládneš ani tento návod, tak se omlouvám, že nejsem dobrý učitel. A v tom případě, se budeš muset obrátit na někoho jiného, nebo se na knihovny zatím ještě vykašlat. ;)