Dll
-
Nun, ich habe versucht mit dem Borland C++ Compiler 5.5 (konsolencompiler) eine Dll zu erstellen ohne Erfolg. Die "Suchen" Funktion konnte mir zu diesem Thema zwar einiges ausspucken, was mir aber alles nicht wirklich weiterhalf. HINWEIS: die datei vcl.h existiert bei mir nicht !
Also: wie erstellt man eine Dll in der einfach nur ein paar funktionen ausgelagert sind... meinetwegen ganz simple die eine MessageBox aufrufen oder so.
Und wie ruft man die Funktion in einer Exe auf ? Wird der dll-code in einer cpp geschrieben und dann compiliert ?
-
Hallo PCMan.
Der BCC 5.5 Compiler wird ohne VCL und MFC ausgeliefert. D.h. Du kannst damit nur reine
Konsolen oder WinAPI Programme erstellen.Nun zur DLL:
Die exportierten Funktionen sollten immer in C deklariert sein. Am besten Du schreibst Deine DLL für den Anfang komplett in C (in *.c Datei). Das spart Ärger mit dem Linker.Hier eine Beispiel DLL:
#include <windows.h> #define DLLEXPORT __declspec(dllexport) BOOL WINAPI LibMain(HINSTANCE hDllInst, DWORD fdwReason, LPVOID lpvReserved) { switch (fdwReason) { case DLL_PROCESS_ATTACH: break; case DLL_PROCESS_DETACH: break; case DLL_THREAD_ATTACH: break; case DLL_THREAD_DETACH: break; } return TRUE; } DLLEXPORT void DllFunction1(LPSTR message) { MessageBox(GetActiveWindow(), message, "DLL Message", MB_SETFOREGROUND); }
LibMain() kann auch DllMain() heißen. Das ist eine Linker-Einstellung. Beim BCC 5.5 funktioniert's mit LibMain(). msdn: DLLMain()
DllFunction1() ist die zu exportierende Funktion. (siehe BCC Hilfe zu __declspec(dllexport) )Laden kann man die DLL auf zwei Arten:
1. Zur Ladezeit des Programms:
Hier erledigt Windows die meiste Arbeit. Allerdings wird das Programm abgebrochen, wenn die DLL oder eine Funktion nicht gefunden wird.
Hierzu erzeugst Du mit
implib testdll.lib testdll.dll
die Datei testdll.lib und compilierst sie zusammen mit folgendem Testprogramm:#include <windows.h> void DllFunction1(LPSTR message); /* Sollte in einer *.h Datei stehen */ int APIENTRY WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpCmdLine, int nCmdShow) { DllFunction1("Hello World 1!"); return 0; }
2. Zur Laufzeit des Programms:
Diese Methode hat den Vorteil, das Dein Programm bestimmen kann, was passiert wenn die DLL oder eine Funktion nicht gefunden wird. Es wird keine *.lib-Datei benötigt:typedef void (* DLLFUNCTION1PROC)(LPSTR message); /* Zeiger auf exportierte Funktion */ int APIENTRY WinMain(HINSTANCE hinst, HINSTANCE hinstPrev, LPSTR lpCmdLine, int nCmdShow) { HMODULE hMyLib; DLLFUNCTION1PROC pfnDllFunction1 = NULL; hMyLib = LoadLibrary("TestDll.dll"); if (hMyLib == NULL) { MessageBeep(-1); /* DLL nicht im Pfad gefunden */ return 1; } pfnDllFunction1 = (DLLFUNCTION1PROC)GetProcAddress(hMyLib, "_DllFunction1"); if (pfnDllFunction1 == NULL) { MessageBeep(-1); /* Funktion nicht gefunden */ return 2; } pfnDllFunction1("Hello World 2!"); FreeLibrary(hMyLib); return 0; }
Achtung: Bei Fehlern piept es nur...
Beide Programme und die DLL wurden mit BCC32 getestet und sollten funktionieren.
Ich hoffe, ich konnte Dir damit etwas helfen.
----
John[ 09.07.2001: Beitrag editiert von: class CMarcus ]
-
Hi John.
Danke für deine seeeehr informative Mail.
Jetzt hab ich das mal richtig geblickt, wie das geht... sehr erfreulich !