23. oktober 2002 - 11:06
Der er
17 kommentarer og 4 løsninger
Guides, DLL
Nogen fede sider til guides om, hvordan man implanterer DLLs i sine C++-programmer? Synes ikke Google tilbyder det helt store resultat...
Annonceindlæg fra DE-CIX
23. oktober 2002 - 12:06
#1
Spørger du om hvordan du laver DLL's eller hvordan du bruger DLL's ?
23. oktober 2002 - 12:16
#2
Bare et eksempel eller guide til, hvordan jeg laver en simpel funktion i en DLL, og bruger den via mit C++program..
23. oktober 2002 - 12:33
#3
Hvis du bruger Visual C++, så er det pærenemt at lave en DLL ved at aktivere den wizard der gør det for dig. For at bruge en vilkårlig DLL skal du bruge LoadLibrary og GetProcAddress. Jeg skal lige se om jeg kan finde en god referance.
23. oktober 2002 - 12:39
#4
med mingw kan du gøre sådan: ---------------dll.cpp--------------- #include <windows.h> extern "C" int getNumber(); int WINAPI DllMain(HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved) { return false; } __declspec ( dllexport) int getNumber() { return 12345; } ---------------main.cpp--------------- #include <windows.h> #include <stdio.h> int getNumber(); typedef int (* DLLFunc)(); int main(int argc, char **argv) { for(int i=0;i<10;i++) { printf("%i\n", getNumber()); } return 0; } int getNumber() { HINSTANCE dll; DLLFunc dllFunc; int number; dll=LoadLibrary("mindll.dll"); if(dll != NULL) { dllFunc = (DLLFunc)GetProcAddress(dll, "getNumber"); if(dllFunc != NULL) { number = dllFunc(); if(!FreeLibrary(dll)) { printf("*error* FreeLibrary\n"); } } else { printf("*error* GetProcAddress\n"); } } else { printf("*error* LoadLibrary\n"); } return number; }
23. oktober 2002 - 12:39
#5
23. oktober 2002 - 12:42
#6
det skal nok lige nævnes at makefilen ser sådan ud: ---------------makefile--------------- CC=g++ EXEDLL= "mindll.dll" EXEMAIN= "main.exe" # targets all: dll main dll: $(CC) -c "dll.cpp" -s -mwindows -DBUILDING_DLL=1 -I. dllwrap --export-all --output-def "dll.def" --implib "dll.a" "dll.o" -o $(EXEDLL) main: $(CC) -c main.cpp -s $(CC) -o $(EXEMAIN) "main.o" -s
23. oktober 2002 - 12:46
#7
makefilen..? Jeg lavede det bare i Borland c++ Builder 5? Men outputtet så således ud: *error* LoadLibrary 4202572 *error* LoadLibrary 2147348480 *error* LoadLibrary 2147348480 *error* LoadLibrary 2147348480 *error* LoadLibrary 2147348480 *error* LoadLibrary 2147348480 *error* LoadLibrary 2147348480 *error* LoadLibrary 2147348480 *error* LoadLibrary 2147348480 *error* LoadLibrary 2147348480
23. oktober 2002 - 12:47
#8
er der en dll der hedder "mindll.dll" og eksekverer dit program fra samme dir som der hvor dllfilen er ?
23. oktober 2002 - 12:49
#9
Yup... Eksekverer Project2.exe (ikke særligt orginalt, men..) og mindll.dll er der...
23. oktober 2002 - 12:50
#10
23-10-2002 12:45 46.080 mindll.dll 23-10-2002 12:45 208 Project1.bpf 23-10-2002 12:45 2.334 Project1.bpr 23-10-2002 12:45 116 Project1.lib 23-10-2002 12:46 393.216 Project1.tds 23-10-2002 12:47 199 Project2.bpf 23-10-2002 12:47 2.364 Project2.bpr 23-10-2002 12:47 6.656 Project2.exe 23-10-2002 12:47 65.536 Project2.tds 23-10-2002 12:45 222 Unit1.cpp 23-10-2002 12:45 8.998 Unit1.obj 23-10-2002 12:47 748 Unit2.cpp 23-10-2002 12:47 11.557 Unit2.obj 13 File(s) 538.234 bytes for at være præcis
23. oktober 2002 - 12:52
#11
jeg har en eller anden ide om at bcb ikke angiver det dir som din exefil er placeret i som start dir for Project2.exe prøv at åbne et konsolvindue (dosvindue) og gå hen til det dir hvor dll og exe filen er og skriv: Project2.exe alternativt kan du prøve at kopiere mindll.dll ind i: windows9x: c:\windows\system winnt_2k_xp: c:\windows\system32
23. oktober 2002 - 12:53
#12
Okai.. jeg kørte eller project2.exe fra samme dir
23. oktober 2002 - 12:55
#13
Ved en regsvr32 mindll.dll på dll'en fik jeg: LoadLibrary("mindll.dll") failed - A dynamic link labrary (DLL) initailzation routine failed.
23. oktober 2002 - 12:56
#14
så kan jeg nok ikke hælpe ret meget mere - jeg har aldrig prøve bcb. men jeg kan oplyse at "*error* LoadLibrary" fremkommer når disse 2 fejler: dll=LoadLibrary("mindll.dll"); if(dll != NULL) altså kan mindll.dll ikke findes.
23. oktober 2002 - 12:56
#15
du behøver ikke at registrere den.
23. oktober 2002 - 12:59
#16
har bcb ikke en eller anden wizard der kan lave en projekt-skabelon for dig ?
23. oktober 2002 - 13:01
#17
Jow, men den loader jo ikke DLL'en?
23. oktober 2002 - 14:21
#18
I BCB skal du først lave din DLL vha. DLL wizarden. (File->New...>DLL) Dernæst kan du lave et import library (Tools->Import library) for DLL'en, som du så bare linker med din alm. BCB program. Så behøver du ikke lave loads osv. - det klarer import library'et for dig. En simpel DLL uden brug af VCL kunne se sådan her ud: include <windows.h> #pragma hdrstop #pragma argsused int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void*) { return 1; } double dblValue(double); double halfValue(double); extern "C" __declspec(dllexport) double changeValue(double, bool); double dblValue(double value) { return 2* value; } double halfValue(double value) { return value / 2.0; } double changeValue(double value, bool UpValue) { return UpValue ? dblValue(value) : halfValue(value); } Den tilhørende applikation der anvender DLL'en via import-libraryet, ser sådan her ud: #include <windows.h> #include <conio.h> #include "console_DLL.h" #pragma link "console_DLL.lib"; //--------------------------------------------------------------------------- int main(int, char*) { double number = 123.5; clrscr(); cputs("DLL tester - console_DLL\r\n"); cprintf("Value %f DOUBLED by DLL : %f\r\n", number, changeValue(number, true)); cprintf("Value %f HALVED by DLL : %f\r\n", number, changeValue(number, false)); cputs("Done - hit a key ..."); getch(); return 0; }
23. oktober 2002 - 14:22
#19
Header-filen til DLL'en ser sådan her ud, og dannes automatisk i fbm. import-biblioteket: #ifndef __console_DLL_H__ #define __console_DLL_H__ extern "C" __declspec(dllexport) double changeValue(double, bool); #endif
29. oktober 2002 - 16:59
#20
30. oktober 2002 - 08:24
#21
d34c0n: der er da ingen artikler om DLL'er i C++?
Kurser inden for grundlæggende programmering