Gå til innhold

Hvordan bruker man DLLer?


Anbefalte innlegg

Videoannonse
Annonse

Det finnes to måter å bruke .dll filer på, statisk og dynamisk.

Ved statisk lenking bruker en som regel en .lib fil og en header fil. Hvordan dette gjøres i dev-c++ vet jeg ikke, men det er nok ikke så vanskelig.

 

For dynamisk lenking bruker du funksjonene LoadLibrary, GetProcAddress og FreeLibrary.

Eksempelvis

 

HMODULE mod = NULL; // Handle til Dll fila
typedef int (*ProcType)(); // Funksjonspeker-datatypen
ProcType procedure = NULL; // Funksjonspekeren
Assert(mod = LoadLibrary("EnDllFil.dll")); // Last dll-en til programmet
procedure = GetProcAddress(mod, "EnFunksjonIDllEn"); // Hent funksjonpeker fra Dll-fila
int result = procedure(); // Kall funksjonen

 

I noen C++ prosjekter, så lages ofte en instans av en klasse gjennom en C funksjon.

 

Merk at GetProcAddress kan også returnere addressen til en eksport-variabel. Case er også viktig.

Lenke til kommentar

Hva gjør jeg feil?

 

#include <windows.h>
#include <assert.h>

int main() {
HMODULE mod = NULL; // Handle til Dll fila
typedef int (*ProcType)(int,int); // Funksjonspeker-datatypen
ProcType procedure = NULL; // Funksjonspekeren

assert(mod = LoadLibrary("DLL_Tutorial.dll")); // Last dll-en til programmet
procedure = GetProcAddress(mod, "Add"); // Hent funksjonpeker fra Dll-fila

int result = procedure(1,1); // Kall funksjonen

system("pause");
}

 

Den vil ikke kompilere engang, linje 11, "invalid conversion from `int (*)()' to `int (*)(int, int)'"

Leste forresten en liknende løsning på nettet men da jeg kompilerte den ville den ikke funke og ga runtime error R6034? hva er det?

Endret av Hagenz
Lenke til kommentar

Hmm, stemmer kompilerer nå men under runtime så får jeg assertion failed line 9, + at jeg må legge inn msvcp80.dll og msvcr80.dll. Om jeg legger inn di 2 i samme dir som exe'n så får jeg runtime error R6034. Står noe om den her på MSDN men vet ikke jeg hva jeg skal gjøre for å fikse det.

Endret av Hagenz
Lenke til kommentar
Hvorfor er et dev-c++ prosjekt være interessert i Visual C++ Runtime biblioteker?... :S

Du kan prøve å fjerne assert da og kanskje prøve å kompilere CRT statisk.

Hvordan kompilerer jeg CRT statisk og hvor fAr jeg tak i visual cpp 2005 runtimes? vcredist? og isåfall hvor legger installeren disse ?

Enkelt sagt, hversåsnill å ta det step by step.

forhånd takk

Lenke til kommentar

Vel, Dev-C++ har vel vært et dødt prosjekt siden 2005... men det burde jo funke allikevel :/

 

Det som irriterer meg litt, er at feilen virker så kjent, jeg har vært borti noe ihvertfall lignende før, men jeg har ikke noen god løsning akkurat nå...

 

Du kan jo alltids bytte til Visual C++ 2008, da er det enklere for meg å hjelpe siden jeg aldri har brukt dev-c++ før selv.

Lenke til kommentar

Du må ha med CRT dll-ene (eller statisk lenke dem)

Du finner Visual C++ Redistributable på microsoft sin side.

 

Statisk linking vil si at de blir kompilert inn i .exe fila.

Instillingene for dette finner du i properties på prosjektet. Tror det ligger under General eller C/C++.

velg Multithreaded istsdetet for Multithreaded Dll.

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
×
×
  • Opprett ny...