noesIdel Skrevet 5. august 2009 Del Skrevet 5. august 2009 (endret) Ja titelen er vel spørsmålet, så vet noen hvordan man kan bruke en dll i et dev-c++ proskjekt? På forhånd takk Endret 5. august 2009 av Hagenz Lenke til kommentar
GeirGrusom Skrevet 5. august 2009 Del Skrevet 5. august 2009 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
noesIdel Skrevet 5. august 2009 Forfatter Del Skrevet 5. august 2009 (endret) 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 5. august 2009 av Hagenz Lenke til kommentar
GeirGrusom Skrevet 5. august 2009 Del Skrevet 5. august 2009 Ah, glemte å caste. procedure = (ProcType)GetProcAddress(mod, "Add"); Lenke til kommentar
noesIdel Skrevet 5. august 2009 Forfatter Del Skrevet 5. august 2009 (endret) 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 5. august 2009 av Hagenz Lenke til kommentar
GeirGrusom Skrevet 5. august 2009 Del Skrevet 5. august 2009 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. Lenke til kommentar
noesIdel Skrevet 5. august 2009 Forfatter Del Skrevet 5. august 2009 Hvorfor er et dev-c++ prosjekt være interessert i Visual C++ Runtime biblioteker?... :SDu 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
GeirGrusom Skrevet 7. august 2009 Del Skrevet 7. august 2009 Vel, du har et problem med compileren, jeg er ikke sikker på hva det er, men kanskje det hjelper hvis du fjerner assert. Men jeg trodde at Dev-C++ brukte Cygwin jeg :/ Lenke til kommentar
noesIdel Skrevet 7. august 2009 Forfatter Del Skrevet 7. august 2009 Dev-C++ bruker MinGW, men det hjalp ikke å fjerne asset. Burde jeg bruke Visual C++ isteden? Eller har du noen andre gode forslag? Lenke til kommentar
GeirGrusom Skrevet 7. august 2009 Del Skrevet 7. august 2009 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
noesIdel Skrevet 7. august 2009 Forfatter Del Skrevet 7. august 2009 Fikk det til med Visual C++ 2008 Express men hvordan deployer jeg da release versonen av proskjektet mitt på en annen pc? Lenke til kommentar
GeirGrusom Skrevet 8. august 2009 Del Skrevet 8. august 2009 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
noesIdel Skrevet 8. august 2009 Forfatter Del Skrevet 8. august 2009 Takker for gode svar Lenke til kommentar
Anbefalte innlegg
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 kontoLogg inn
Har du allerede en konto? Logg inn her.
Logg inn nå